src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

syscall_linux_ppc.go (6940B)


      1 // Copyright 2021 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 //go:build linux && ppc
      6 
      7 package unix
      8 
      9 import (
     10 	"syscall"
     11 	"unsafe"
     12 )
     13 
     14 //sys	Fchown(fd int, uid int, gid int) (err error)
     15 //sys	Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
     16 //sys	Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64
     17 //sys	Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
     18 //sysnb	Getegid() (egid int)
     19 //sysnb	Geteuid() (euid int)
     20 //sysnb	Getgid() (gid int)
     21 //sysnb	Getuid() (uid int)
     22 //sys	Ioperm(from int, num int, on int) (err error)
     23 //sys	Iopl(level int) (err error)
     24 //sys	Lchown(path string, uid int, gid int) (err error)
     25 //sys	Listen(s int, n int) (err error)
     26 //sys	Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
     27 //sys	Pause() (err error)
     28 //sys	pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
     29 //sys	pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
     30 //sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
     31 //sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
     32 //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
     33 //sys	setfsgid(gid int) (prev int, err error)
     34 //sys	setfsuid(uid int) (prev int, err error)
     35 //sys	Shutdown(fd int, how int) (err error)
     36 //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
     37 //sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
     38 //sys	Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
     39 //sys	Ustat(dev int, ubuf *Ustat_t) (err error)
     40 //sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
     41 //sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
     42 //sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
     43 //sysnb	getgroups(n int, list *_Gid_t) (nn int, err error)
     44 //sysnb	setgroups(n int, list *_Gid_t) (err error)
     45 //sys	getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
     46 //sys	setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
     47 //sysnb	socket(domain int, typ int, proto int) (fd int, err error)
     48 //sysnb	socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
     49 //sysnb	getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
     50 //sysnb	getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
     51 //sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
     52 //sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
     53 //sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
     54 //sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
     55 
     56 //sys	futimesat(dirfd int, path string, times *[2]Timeval) (err error)
     57 //sysnb	Gettimeofday(tv *Timeval) (err error)
     58 //sysnb	Time(t *Time_t) (tt Time_t, err error)
     59 //sys	Utime(path string, buf *Utimbuf) (err error)
     60 //sys	utimes(path string, times *[2]Timeval) (err error)
     61 
     62 func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
     63 	_, _, e1 := Syscall6(SYS_FADVISE64_64, uintptr(fd), uintptr(advice), uintptr(offset>>32), uintptr(offset), uintptr(length>>32), uintptr(length))
     64 	if e1 != 0 {
     65 		err = errnoErr(e1)
     66 	}
     67 	return
     68 }
     69 
     70 func seek(fd int, offset int64, whence int) (int64, syscall.Errno) {
     71 	var newoffset int64
     72 	offsetLow := uint32(offset & 0xffffffff)
     73 	offsetHigh := uint32((offset >> 32) & 0xffffffff)
     74 	_, _, err := Syscall6(SYS__LLSEEK, uintptr(fd), uintptr(offsetHigh), uintptr(offsetLow), uintptr(unsafe.Pointer(&newoffset)), uintptr(whence), 0)
     75 	return newoffset, err
     76 }
     77 
     78 func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
     79 	newoffset, errno := seek(fd, offset, whence)
     80 	if errno != 0 {
     81 		return 0, errno
     82 	}
     83 	return newoffset, nil
     84 }
     85 
     86 func Fstatfs(fd int, buf *Statfs_t) (err error) {
     87 	_, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
     88 	if e != 0 {
     89 		err = e
     90 	}
     91 	return
     92 }
     93 
     94 func Statfs(path string, buf *Statfs_t) (err error) {
     95 	pathp, err := BytePtrFromString(path)
     96 	if err != nil {
     97 		return err
     98 	}
     99 	_, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
    100 	if e != 0 {
    101 		err = e
    102 	}
    103 	return
    104 }
    105 
    106 //sys	mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)
    107 
    108 func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
    109 	page := uintptr(offset / 4096)
    110 	if offset != int64(page)*4096 {
    111 		return 0, EINVAL
    112 	}
    113 	return mmap2(addr, length, prot, flags, fd, page)
    114 }
    115 
    116 func setTimespec(sec, nsec int64) Timespec {
    117 	return Timespec{Sec: int32(sec), Nsec: int32(nsec)}
    118 }
    119 
    120 func setTimeval(sec, usec int64) Timeval {
    121 	return Timeval{Sec: int32(sec), Usec: int32(usec)}
    122 }
    123 
    124 type rlimit32 struct {
    125 	Cur uint32
    126 	Max uint32
    127 }
    128 
    129 //sysnb	getrlimit(resource int, rlim *rlimit32) (err error) = SYS_UGETRLIMIT
    130 
    131 const rlimInf32 = ^uint32(0)
    132 const rlimInf64 = ^uint64(0)
    133 
    134 func Getrlimit(resource int, rlim *Rlimit) (err error) {
    135 	err = Prlimit(0, resource, nil, rlim)
    136 	if err != ENOSYS {
    137 		return err
    138 	}
    139 
    140 	rl := rlimit32{}
    141 	err = getrlimit(resource, &rl)
    142 	if err != nil {
    143 		return
    144 	}
    145 
    146 	if rl.Cur == rlimInf32 {
    147 		rlim.Cur = rlimInf64
    148 	} else {
    149 		rlim.Cur = uint64(rl.Cur)
    150 	}
    151 
    152 	if rl.Max == rlimInf32 {
    153 		rlim.Max = rlimInf64
    154 	} else {
    155 		rlim.Max = uint64(rl.Max)
    156 	}
    157 	return
    158 }
    159 
    160 func (r *PtraceRegs) PC() uint32 { return r.Nip }
    161 
    162 func (r *PtraceRegs) SetPC(pc uint32) { r.Nip = pc }
    163 
    164 func (iov *Iovec) SetLen(length int) {
    165 	iov.Len = uint32(length)
    166 }
    167 
    168 func (msghdr *Msghdr) SetControllen(length int) {
    169 	msghdr.Controllen = uint32(length)
    170 }
    171 
    172 func (msghdr *Msghdr) SetIovlen(length int) {
    173 	msghdr.Iovlen = uint32(length)
    174 }
    175 
    176 func (cmsg *Cmsghdr) SetLen(length int) {
    177 	cmsg.Len = uint32(length)
    178 }
    179 
    180 func (rsa *RawSockaddrNFCLLCP) SetServiceNameLen(length int) {
    181 	rsa.Service_name_len = uint32(length)
    182 }
    183 
    184 //sys	syncFileRange2(fd int, flags int, off int64, n int64) (err error) = SYS_SYNC_FILE_RANGE2
    185 
    186 func SyncFileRange(fd int, off int64, n int64, flags int) error {
    187 	// The sync_file_range and sync_file_range2 syscalls differ only in the
    188 	// order of their arguments.
    189 	return syncFileRange2(fd, flags, off, n)
    190 }
    191 
    192 //sys	kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error)
    193 
    194 func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error {
    195 	cmdlineLen := len(cmdline)
    196 	if cmdlineLen > 0 {
    197 		// Account for the additional NULL byte added by
    198 		// BytePtrFromString in kexecFileLoad. The kexec_file_load
    199 		// syscall expects a NULL-terminated string.
    200 		cmdlineLen++
    201 	}
    202 	return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags)
    203 }