OSDN Git Service

new repo
[bytom/vapor.git] / vendor / golang.org / x / sys / unix / syscall_linux_arm.go
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 // +build arm,linux
6
7 package unix
8
9 import (
10         "syscall"
11         "unsafe"
12 )
13
14 func Getpagesize() int { return 4096 }
15
16 func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
17
18 func NsecToTimespec(nsec int64) (ts Timespec) {
19         ts.Sec = int32(nsec / 1e9)
20         ts.Nsec = int32(nsec % 1e9)
21         return
22 }
23
24 func NsecToTimeval(nsec int64) (tv Timeval) {
25         nsec += 999 // round up to microsecond
26         tv.Sec = int32(nsec / 1e9)
27         tv.Usec = int32(nsec % 1e9 / 1e3)
28         return
29 }
30
31 func Pipe(p []int) (err error) {
32         if len(p) != 2 {
33                 return EINVAL
34         }
35         var pp [2]_C_int
36         err = pipe2(&pp, 0)
37         p[0] = int(pp[0])
38         p[1] = int(pp[1])
39         return
40 }
41
42 //sysnb pipe2(p *[2]_C_int, flags int) (err error)
43
44 func Pipe2(p []int, flags int) (err error) {
45         if len(p) != 2 {
46                 return EINVAL
47         }
48         var pp [2]_C_int
49         err = pipe2(&pp, flags)
50         p[0] = int(pp[0])
51         p[1] = int(pp[1])
52         return
53 }
54
55 // Underlying system call writes to newoffset via pointer.
56 // Implemented in assembly to avoid allocation.
57 func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno)
58
59 func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
60         newoffset, errno := seek(fd, offset, whence)
61         if errno != 0 {
62                 return 0, errno
63         }
64         return newoffset, nil
65 }
66
67 //sys   accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
68 //sys   accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
69 //sys   bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
70 //sys   connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
71 //sysnb getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32
72 //sysnb setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32
73 //sys   getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
74 //sys   setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
75 //sysnb socket(domain int, typ int, proto int) (fd int, err error)
76 //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
77 //sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
78 //sys   recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
79 //sys   sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
80 //sysnb socketpair(domain int, typ int, flags int, fd *[2]int32) (err error)
81 //sys   recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
82 //sys   sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
83
84 // 64-bit file system and 32-bit uid calls
85 // (16-bit uid calls are not always supported in newer kernels)
86 //sys   Dup2(oldfd int, newfd int) (err error)
87 //sys   Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32
88 //sys   Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
89 //sysnb Getegid() (egid int) = SYS_GETEGID32
90 //sysnb Geteuid() (euid int) = SYS_GETEUID32
91 //sysnb Getgid() (gid int) = SYS_GETGID32
92 //sysnb Getuid() (uid int) = SYS_GETUID32
93 //sysnb InotifyInit() (fd int, err error)
94 //sys   Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32
95 //sys   Listen(s int, n int) (err error)
96 //sys   Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
97 //sys   sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
98 //sys   Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
99 //sys   Setfsgid(gid int) (err error) = SYS_SETFSGID32
100 //sys   Setfsuid(uid int) (err error) = SYS_SETFSUID32
101 //sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32
102 //sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32
103 //sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32
104 //sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32
105 //sys   Shutdown(fd int, how int) (err error)
106 //sys   Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
107 //sys   Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
108
109 // Vsyscalls on amd64.
110 //sysnb Gettimeofday(tv *Timeval) (err error)
111 //sys   EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
112 //sys   Pause() (err error)
113
114 func Time(t *Time_t) (Time_t, error) {
115         var tv Timeval
116         err := Gettimeofday(&tv)
117         if err != nil {
118                 return 0, err
119         }
120         if t != nil {
121                 *t = Time_t(tv.Sec)
122         }
123         return Time_t(tv.Sec), nil
124 }
125
126 func Utime(path string, buf *Utimbuf) error {
127         tv := []Timeval{
128                 {Sec: buf.Actime},
129                 {Sec: buf.Modtime},
130         }
131         return Utimes(path, tv)
132 }
133
134 //sys   Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
135 //sys   Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
136 //sys   Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
137 //sys   Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
138
139 func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
140         _, _, e1 := Syscall6(SYS_ARM_FADVISE64_64, uintptr(fd), uintptr(advice), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32))
141         if e1 != 0 {
142                 err = errnoErr(e1)
143         }
144         return
145 }
146
147 //sys   mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)
148
149 func Fstatfs(fd int, buf *Statfs_t) (err error) {
150         _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
151         if e != 0 {
152                 err = e
153         }
154         return
155 }
156
157 func Statfs(path string, buf *Statfs_t) (err error) {
158         pathp, err := BytePtrFromString(path)
159         if err != nil {
160                 return err
161         }
162         _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
163         if e != 0 {
164                 err = e
165         }
166         return
167 }
168
169 func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
170         page := uintptr(offset / 4096)
171         if offset != int64(page)*4096 {
172                 return 0, EINVAL
173         }
174         return mmap2(addr, length, prot, flags, fd, page)
175 }
176
177 type rlimit32 struct {
178         Cur uint32
179         Max uint32
180 }
181
182 //sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_UGETRLIMIT
183
184 const rlimInf32 = ^uint32(0)
185 const rlimInf64 = ^uint64(0)
186
187 func Getrlimit(resource int, rlim *Rlimit) (err error) {
188         err = prlimit(0, resource, nil, rlim)
189         if err != ENOSYS {
190                 return err
191         }
192
193         rl := rlimit32{}
194         err = getrlimit(resource, &rl)
195         if err != nil {
196                 return
197         }
198
199         if rl.Cur == rlimInf32 {
200                 rlim.Cur = rlimInf64
201         } else {
202                 rlim.Cur = uint64(rl.Cur)
203         }
204
205         if rl.Max == rlimInf32 {
206                 rlim.Max = rlimInf64
207         } else {
208                 rlim.Max = uint64(rl.Max)
209         }
210         return
211 }
212
213 //sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
214
215 func Setrlimit(resource int, rlim *Rlimit) (err error) {
216         err = prlimit(0, resource, rlim, nil)
217         if err != ENOSYS {
218                 return err
219         }
220
221         rl := rlimit32{}
222         if rlim.Cur == rlimInf64 {
223                 rl.Cur = rlimInf32
224         } else if rlim.Cur < uint64(rlimInf32) {
225                 rl.Cur = uint32(rlim.Cur)
226         } else {
227                 return EINVAL
228         }
229         if rlim.Max == rlimInf64 {
230                 rl.Max = rlimInf32
231         } else if rlim.Max < uint64(rlimInf32) {
232                 rl.Max = uint32(rlim.Max)
233         } else {
234                 return EINVAL
235         }
236
237         return setrlimit(resource, &rl)
238 }
239
240 func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) }
241
242 func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) }
243
244 func (iov *Iovec) SetLen(length int) {
245         iov.Len = uint32(length)
246 }
247
248 func (msghdr *Msghdr) SetControllen(length int) {
249         msghdr.Controllen = uint32(length)
250 }
251
252 func (cmsg *Cmsghdr) SetLen(length int) {
253         cmsg.Len = uint32(length)
254 }
255
256 //sys   poll(fds *PollFd, nfds int, timeout int) (n int, err error)
257
258 func Poll(fds []PollFd, timeout int) (n int, err error) {
259         if len(fds) == 0 {
260                 return poll(nil, 0, timeout)
261         }
262         return poll(&fds[0], len(fds), timeout)
263 }