github.com/dorkamotorka/go/src@v0.0.0-20230614113921-187095f0e316/syscall/syscall_linux_arm.go (about)

     1  // Copyright 2009 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  package syscall
     6  
     7  import "unsafe"
     8  
     9  const (
    10  	_SYS_setgroups  = SYS_SETGROUPS32
    11  	_SYS_clone3     = 435
    12  	_SYS_faccessat2 = 439
    13  )
    14  
    15  func setTimespec(sec, nsec int64) Timespec {
    16  	return Timespec{Sec: int32(sec), Nsec: int32(nsec)}
    17  }
    18  
    19  func setTimeval(sec, usec int64) Timeval {
    20  	return Timeval{Sec: int32(sec), Usec: int32(usec)}
    21  }
    22  
    23  // Underlying system call writes to newoffset via pointer.
    24  // Implemented in assembly to avoid allocation.
    25  func seek(fd int, offset int64, whence int) (newoffset int64, err Errno)
    26  
    27  func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
    28  	newoffset, errno := seek(fd, offset, whence)
    29  	if errno != 0 {
    30  		return 0, errno
    31  	}
    32  	return newoffset, nil
    33  }
    34  
    35  //sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
    36  //sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
    37  //sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
    38  //sysnb	getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32
    39  //sys	getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
    40  //sys	setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
    41  //sysnb	socket(domain int, typ int, proto int) (fd int, err error)
    42  //sysnb	getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
    43  //sysnb	getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
    44  //sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
    45  //sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
    46  //sysnb	socketpair(domain int, typ int, flags int, fd *[2]int32) (err error)
    47  //sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
    48  //sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
    49  
    50  // 64-bit file system and 32-bit uid calls
    51  // (16-bit uid calls are not always supported in newer kernels)
    52  //sys	Dup2(oldfd int, newfd int) (err error)
    53  //sys	Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32
    54  //sys	Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
    55  //sys	fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64
    56  //sysnb	Getegid() (egid int) = SYS_GETEGID32
    57  //sysnb	Geteuid() (euid int) = SYS_GETEUID32
    58  //sysnb	Getgid() (gid int) = SYS_GETGID32
    59  //sysnb	Getuid() (uid int) = SYS_GETUID32
    60  //sysnb	InotifyInit() (fd int, err error)
    61  //sys	Listen(s int, n int) (err error)
    62  //sys	Pause() (err error)
    63  //sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
    64  //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
    65  //sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
    66  //sys	Setfsgid(gid int) (err error) = SYS_SETFSGID32
    67  //sys	Setfsuid(uid int) (err error) = SYS_SETFSUID32
    68  //sys	Shutdown(fd int, how int) (err error)
    69  //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
    70  //sys	Ustat(dev int, ubuf *Ustat_t) (err error)
    71  
    72  //sys	futimesat(dirfd int, path string, times *[2]Timeval) (err error)
    73  //sysnb	Gettimeofday(tv *Timeval) (err error)
    74  //sysnb	Time(t *Time_t) (tt Time_t, err error)
    75  //sys	Utime(path string, buf *Utimbuf) (err error)
    76  //sys	utimes(path string, times *[2]Timeval) (err error)
    77  
    78  //sys   pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
    79  //sys   pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
    80  //sys	Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
    81  //sys	Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
    82  
    83  //sys	mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)
    84  //sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
    85  
    86  func Stat(path string, stat *Stat_t) (err error) {
    87  	return fstatat(_AT_FDCWD, path, stat, 0)
    88  }
    89  
    90  func Lchown(path string, uid int, gid int) (err error) {
    91  	return Fchownat(_AT_FDCWD, path, uid, gid, _AT_SYMLINK_NOFOLLOW)
    92  }
    93  
    94  func Lstat(path string, stat *Stat_t) (err error) {
    95  	return fstatat(_AT_FDCWD, path, stat, _AT_SYMLINK_NOFOLLOW)
    96  }
    97  
    98  func Fstatfs(fd int, buf *Statfs_t) (err error) {
    99  	_, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
   100  	if e != 0 {
   101  		err = e
   102  	}
   103  	return
   104  }
   105  
   106  func Statfs(path string, buf *Statfs_t) (err error) {
   107  	pathp, err := BytePtrFromString(path)
   108  	if err != nil {
   109  		return err
   110  	}
   111  	_, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
   112  	if e != 0 {
   113  		err = e
   114  	}
   115  	return
   116  }
   117  
   118  func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
   119  	page := uintptr(offset / 4096)
   120  	if offset != int64(page)*4096 {
   121  		return 0, EINVAL
   122  	}
   123  	return mmap2(addr, length, prot, flags, fd, page)
   124  }
   125  
   126  type rlimit32 struct {
   127  	Cur uint32
   128  	Max uint32
   129  }
   130  
   131  //sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT
   132  
   133  const rlimInf32 = ^uint32(0)
   134  const rlimInf64 = ^uint64(0)
   135  
   136  func Getrlimit(resource int, rlim *Rlimit) (err error) {
   137  	err = prlimit(0, resource, nil, rlim)
   138  	if err != ENOSYS {
   139  		return err
   140  	}
   141  
   142  	rl := rlimit32{}
   143  	err = getrlimit(resource, &rl)
   144  	if err != nil {
   145  		return
   146  	}
   147  
   148  	if rl.Cur == rlimInf32 {
   149  		rlim.Cur = rlimInf64
   150  	} else {
   151  		rlim.Cur = uint64(rl.Cur)
   152  	}
   153  
   154  	if rl.Max == rlimInf32 {
   155  		rlim.Max = rlimInf64
   156  	} else {
   157  		rlim.Max = uint64(rl.Max)
   158  	}
   159  	return
   160  }
   161  
   162  //sysnb setrlimit1(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
   163  
   164  func setrlimit(resource int, rlim *Rlimit) (err error) {
   165  	err = prlimit(0, resource, rlim, nil)
   166  	if err != ENOSYS {
   167  		return err
   168  	}
   169  
   170  	rl := rlimit32{}
   171  	if rlim.Cur == rlimInf64 {
   172  		rl.Cur = rlimInf32
   173  	} else if rlim.Cur < uint64(rlimInf32) {
   174  		rl.Cur = uint32(rlim.Cur)
   175  	} else {
   176  		return EINVAL
   177  	}
   178  	if rlim.Max == rlimInf64 {
   179  		rl.Max = rlimInf32
   180  	} else if rlim.Max < uint64(rlimInf32) {
   181  		rl.Max = uint32(rlim.Max)
   182  	} else {
   183  		return EINVAL
   184  	}
   185  
   186  	return setrlimit1(resource, &rl)
   187  }
   188  
   189  //go:nosplit
   190  func rawSetrlimit(resource int, rlim *Rlimit) Errno {
   191  	_, _, errno := RawSyscall6(SYS_PRLIMIT64, 0, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0, 0, 0)
   192  	if errno != ENOSYS {
   193  		return errno
   194  	}
   195  
   196  	rl := rlimit32{}
   197  	if rlim.Cur == rlimInf64 {
   198  		rl.Cur = rlimInf32
   199  	} else if rlim.Cur < uint64(rlimInf32) {
   200  		rl.Cur = uint32(rlim.Cur)
   201  	} else {
   202  		return EINVAL
   203  	}
   204  	if rlim.Max == rlimInf64 {
   205  		rl.Max = rlimInf32
   206  	} else if rlim.Max < uint64(rlimInf32) {
   207  		rl.Max = uint32(rlim.Max)
   208  	} else {
   209  		return EINVAL
   210  	}
   211  
   212  	_, _, errno = RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
   213  	return errno
   214  }
   215  
   216  func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) }
   217  
   218  func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) }
   219  
   220  func (iov *Iovec) SetLen(length int) {
   221  	iov.Len = uint32(length)
   222  }
   223  
   224  func (msghdr *Msghdr) SetControllen(length int) {
   225  	msghdr.Controllen = uint32(length)
   226  }
   227  
   228  func (cmsg *Cmsghdr) SetLen(length int) {
   229  	cmsg.Len = uint32(length)
   230  }