rsc.io/go@v0.0.0-20150416155037-e040fd465409/src/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 _SYS_dup = SYS_DUP2 10 11 func Getpagesize() int { return 4096 } 12 13 func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } 14 15 func NsecToTimespec(nsec int64) (ts Timespec) { 16 ts.Sec = int32(nsec / 1e9) 17 ts.Nsec = int32(nsec % 1e9) 18 return 19 } 20 21 func NsecToTimeval(nsec int64) (tv Timeval) { 22 nsec += 999 // round up to microsecond 23 tv.Sec = int32(nsec / 1e9) 24 tv.Usec = int32(nsec % 1e9 / 1e3) 25 return 26 } 27 28 func Pipe(p []int) (err error) { 29 if len(p) != 2 { 30 return EINVAL 31 } 32 var pp [2]_C_int 33 err = pipe2(&pp, 0) 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 //sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32 85 //sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 86 //sysnb Getegid() (egid int) = SYS_GETEGID32 87 //sysnb Geteuid() (euid int) = SYS_GETEUID32 88 //sysnb Getgid() (gid int) = SYS_GETGID32 89 //sysnb Getuid() (uid int) = SYS_GETUID32 90 //sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32 91 //sys Listen(s int, n int) (err error) 92 //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 93 //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 94 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT 95 //sys Setfsgid(gid int) (err error) = SYS_SETFSGID32 96 //sys Setfsuid(uid int) (err error) = SYS_SETFSUID32 97 //sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32 98 //sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32 99 //sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32 100 //sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32 101 //sys Shutdown(fd int, how int) (err error) 102 //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) 103 //sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 104 105 // Vsyscalls on amd64. 106 //sysnb Gettimeofday(tv *Timeval) (err error) 107 //sysnb Time(t *Time_t) (tt Time_t, err error) 108 109 //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 110 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 111 //sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 112 //sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 113 114 //sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) 115 116 func Fstatfs(fd int, buf *Statfs_t) (err error) { 117 _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) 118 if e != 0 { 119 err = e 120 } 121 return 122 } 123 124 func Statfs(path string, buf *Statfs_t) (err error) { 125 pathp, err := BytePtrFromString(path) 126 if err != nil { 127 return err 128 } 129 _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) 130 use(unsafe.Pointer(pathp)) 131 if e != 0 { 132 err = e 133 } 134 return 135 } 136 137 func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { 138 page := uintptr(offset / 4096) 139 if offset != int64(page)*4096 { 140 return 0, EINVAL 141 } 142 return mmap2(addr, length, prot, flags, fd, page) 143 } 144 145 type rlimit32 struct { 146 Cur uint32 147 Max uint32 148 } 149 150 //sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT 151 152 const rlimInf32 = ^uint32(0) 153 const rlimInf64 = ^uint64(0) 154 155 func Getrlimit(resource int, rlim *Rlimit) (err error) { 156 err = prlimit(0, resource, nil, rlim) 157 if err != ENOSYS { 158 return err 159 } 160 161 rl := rlimit32{} 162 err = getrlimit(resource, &rl) 163 if err != nil { 164 return 165 } 166 167 if rl.Cur == rlimInf32 { 168 rlim.Cur = rlimInf64 169 } else { 170 rlim.Cur = uint64(rl.Cur) 171 } 172 173 if rl.Max == rlimInf32 { 174 rlim.Max = rlimInf64 175 } else { 176 rlim.Max = uint64(rl.Max) 177 } 178 return 179 } 180 181 //sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT 182 183 func Setrlimit(resource int, rlim *Rlimit) (err error) { 184 err = prlimit(0, resource, rlim, nil) 185 if err != ENOSYS { 186 return err 187 } 188 189 rl := rlimit32{} 190 if rlim.Cur == rlimInf64 { 191 rl.Cur = rlimInf32 192 } else if rlim.Cur < uint64(rlimInf32) { 193 rl.Cur = uint32(rlim.Cur) 194 } else { 195 return EINVAL 196 } 197 if rlim.Max == rlimInf64 { 198 rl.Max = rlimInf32 199 } else if rlim.Max < uint64(rlimInf32) { 200 rl.Max = uint32(rlim.Max) 201 } else { 202 return EINVAL 203 } 204 205 return setrlimit(resource, &rl) 206 } 207 208 func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) } 209 210 func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) } 211 212 func (iov *Iovec) SetLen(length int) { 213 iov.Len = uint32(length) 214 } 215 216 func (msghdr *Msghdr) SetControllen(length int) { 217 msghdr.Controllen = uint32(length) 218 } 219 220 func (cmsg *Cmsghdr) SetLen(length int) { 221 cmsg.Len = uint32(length) 222 }