]> Cypherpunks.ru repositories - gostls13.git/blob - src/syscall/syscall_linux_arm.go
600ec3552db520bfe637271f3ef3ac7a3ac072a7
[gostls13.git] / src / syscall / 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 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 }