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