usb-ks

USB Killswitch
git clone git://git.laack.co/usb-ks.git
Log | Files | Refs | README | LICENSE

syscall_linux_ppc.go (7815B)


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