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.
10 _SYS_setgroups = SYS_SETGROUPS32
13 _SYS_pidfd_send_signal = 424
17 func setTimespec(sec, nsec int64) Timespec {
18 return Timespec{Sec: int32(sec), Nsec: int32(nsec)}
21 func setTimeval(sec, usec int64) Timeval {
22 return Timeval{Sec: int32(sec), Usec: int32(usec)}
25 // 64-bit file system and 32-bit uid calls
26 // (386 default is 32-bit file system and 16-bit uid).
27 //sys Dup2(oldfd int, newfd int) (err error)
28 //sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32
29 //sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
30 //sys fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64
31 //sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
32 //sysnb Getegid() (egid int) = SYS_GETEGID32
33 //sysnb Geteuid() (euid int) = SYS_GETEUID32
34 //sysnb Getgid() (gid int) = SYS_GETGID32
35 //sysnb Getuid() (uid int) = SYS_GETUID32
36 //sysnb InotifyInit() (fd int, err error)
37 //sys Ioperm(from int, num int, on int) (err error)
38 //sys Iopl(level int) (err error)
39 //sys Pause() (err error)
40 //sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
41 //sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
42 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
43 //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
44 //sys Setfsgid(gid int) (err error) = SYS_SETFSGID32
45 //sys Setfsuid(uid int) (err error) = SYS_SETFSUID32
46 //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
47 //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error)
48 //sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
49 //sys Ustat(dev int, ubuf *Ustat_t) (err error)
50 //sysnb getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32
51 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
53 //sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)
54 //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
56 func Stat(path string, stat *Stat_t) (err error) {
57 return fstatat(_AT_FDCWD, path, stat, 0)
60 func Lchown(path string, uid int, gid int) (err error) {
61 return Fchownat(_AT_FDCWD, path, uid, gid, _AT_SYMLINK_NOFOLLOW)
64 func Lstat(path string, stat *Stat_t) (err error) {
65 return fstatat(_AT_FDCWD, path, stat, _AT_SYMLINK_NOFOLLOW)
68 func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
69 page := uintptr(offset / 4096)
70 if offset != int64(page)*4096 {
73 return mmap2(addr, length, prot, flags, fd, page)
76 type rlimit32 struct {
81 //sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT
83 const rlimInf32 = ^uint32(0)
84 const rlimInf64 = ^uint64(0)
86 func Getrlimit(resource int, rlim *Rlimit) (err error) {
87 err = prlimit(0, resource, nil, rlim)
93 err = getrlimit(resource, &rl)
98 if rl.Cur == rlimInf32 {
101 rlim.Cur = uint64(rl.Cur)
104 if rl.Max == rlimInf32 {
107 rlim.Max = uint64(rl.Max)
112 //sysnb setrlimit1(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
114 func setrlimit(resource int, rlim *Rlimit) (err error) {
115 err = prlimit(0, resource, rlim, nil)
121 if rlim.Cur == rlimInf64 {
123 } else if rlim.Cur < uint64(rlimInf32) {
124 rl.Cur = uint32(rlim.Cur)
128 if rlim.Max == rlimInf64 {
130 } else if rlim.Max < uint64(rlimInf32) {
131 rl.Max = uint32(rlim.Max)
136 return setrlimit1(resource, &rl)
140 func rawSetrlimit(resource int, rlim *Rlimit) Errno {
141 _, _, errno := RawSyscall6(SYS_PRLIMIT64, 0, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0, 0, 0)
147 if rlim.Cur == rlimInf64 {
149 } else if rlim.Cur < uint64(rlimInf32) {
150 rl.Cur = uint32(rlim.Cur)
154 if rlim.Max == rlimInf64 {
156 } else if rlim.Max < uint64(rlimInf32) {
157 rl.Max = uint32(rlim.Max)
162 _, _, errno = RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
166 // Underlying system call writes to newoffset via pointer.
167 // Implemented in assembly to avoid allocation.
168 func seek(fd int, offset int64, whence int) (newoffset int64, err Errno)
170 func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
171 newoffset, errno := seek(fd, offset, whence)
175 return newoffset, nil
178 //sys futimesat(dirfd int, path string, times *[2]Timeval) (err error)
179 //sysnb Gettimeofday(tv *Timeval) (err error)
180 //sysnb Time(t *Time_t) (tt Time_t, err error)
181 //sys Utime(path string, buf *Utimbuf) (err error)
182 //sys utimes(path string, times *[2]Timeval) (err error)
184 // On x86 Linux, all the socket calls go through an extra indirection,
185 // I think because the 5-register system call interface can't handle
186 // the 6-argument calls like sendto and recvfrom. Instead the
187 // arguments to the underlying system call are the number below
188 // and a pointer to an array of uintptr. We hide the pointer in the
189 // socketcall assembly to avoid allocation on every system call.
215 func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err Errno)
216 func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err Errno)
218 func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {
219 fd, e := socketcall(_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)
226 func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {
227 _, e := rawsocketcall(_GETSOCKNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)
234 func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {
235 _, e := rawsocketcall(_GETPEERNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)
242 func socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) {
243 _, e := rawsocketcall(_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0)
250 func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {
251 _, e := socketcall(_BIND, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0)
258 func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {
259 _, e := socketcall(_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0)
266 func socket(domain int, typ int, proto int) (fd int, err error) {
267 fd, e := rawsocketcall(_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0)
274 func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {
275 _, e := socketcall(_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)
282 func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {
283 _, e := socketcall(_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), vallen, 0)
290 func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {
293 base = uintptr(unsafe.Pointer(&p[0]))
295 n, e := socketcall(_RECVFROM, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))
302 func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {
305 base = uintptr(unsafe.Pointer(&p[0]))
307 _, e := socketcall(_SENDTO, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen))
314 func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
315 n, e := socketcall(_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)
322 func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
323 n, e := socketcall(_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)
330 func Listen(s int, n int) (err error) {
331 _, e := socketcall(_LISTEN, uintptr(s), uintptr(n), 0, 0, 0, 0)
338 func Shutdown(s, how int) (err error) {
339 _, e := socketcall(_SHUTDOWN, uintptr(s), uintptr(how), 0, 0, 0, 0)
346 func Fstatfs(fd int, buf *Statfs_t) (err error) {
347 _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
354 func Statfs(path string, buf *Statfs_t) (err error) {
355 pathp, err := BytePtrFromString(path)
359 _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
366 func (r *PtraceRegs) PC() uint64 { return uint64(uint32(r.Eip)) }
368 func (r *PtraceRegs) SetPC(pc uint64) { r.Eip = int32(pc) }
370 func (iov *Iovec) SetLen(length int) {
371 iov.Len = uint32(length)
374 func (msghdr *Msghdr) SetControllen(length int) {
375 msghdr.Controllen = uint32(length)
378 func (cmsg *Cmsghdr) SetLen(length int) {
379 cmsg.Len = uint32(length)