]> Cypherpunks.ru repositories - gostls13.git/blob - src/syscall/syscall_linux_s390x.go
44990f2b1bf99df81c1908403c4c184a91cfc01c
[gostls13.git] / src / syscall / syscall_linux_s390x.go
1 // Copyright 2016 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_SETGROUPS
11         _SYS_clone3     = 435
12         _SYS_faccessat2 = 439
13 )
14
15 //sys   Dup2(oldfd int, newfd int) (err error)
16 //sys   EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
17 //sys   Fchown(fd int, uid int, gid int) (err error)
18 //sys   Fstat(fd int, stat *Stat_t) (err error)
19 //sys   fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT
20 //sys   Fstatfs(fd int, buf *Statfs_t) (err error)
21 //sys   Ftruncate(fd int, length int64) (err error)
22 //sysnb Getegid() (egid int)
23 //sysnb Geteuid() (euid int)
24 //sysnb Getgid() (gid int)
25 //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = SYS_GETRLIMIT
26 //sysnb Getuid() (uid int)
27 //sysnb InotifyInit() (fd int, err error)
28 //sys   Lchown(path string, uid int, gid int) (err error)
29 //sys   Lstat(path string, stat *Stat_t) (err error)
30 //sys   Pause() (err error)
31 //sys   pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
32 //sys   pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
33 //sys   Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
34 //sys   Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
35 //sys   Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
36 //sys   sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
37 //sys   Setfsgid(gid int) (err error)
38 //sys   Setfsuid(uid int) (err error)
39 //sysnb setrlimit(resource int, rlim *Rlimit) (err error) = SYS_SETRLIMIT
40 //sys   Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
41 //sys   Stat(path string, stat *Stat_t) (err error)
42 //sys   Statfs(path string, buf *Statfs_t) (err error)
43 //sys   SyncFileRange(fd int, off int64, n int64, flags int) (err error) = SYS_SYNC_FILE_RANGE
44 //sys   Truncate(path string, length int64) (err error)
45 //sys   Ustat(dev int, ubuf *Ustat_t) (err error)
46 //sysnb getgroups(n int, list *_Gid_t) (nn int, err error)
47
48 //sys   futimesat(dirfd int, path string, times *[2]Timeval) (err error)
49 //sysnb Gettimeofday(tv *Timeval) (err error)
50
51 func Time(t *Time_t) (tt Time_t, err error) {
52         var tv Timeval
53         err = Gettimeofday(&tv)
54         if err != nil {
55                 return 0, err
56         }
57         if t != nil {
58                 *t = Time_t(tv.Sec)
59         }
60         return Time_t(tv.Sec), nil
61 }
62
63 //sys   Utime(path string, buf *Utimbuf) (err error)
64 //sys   utimes(path string, times *[2]Timeval) (err error)
65
66 func setTimespec(sec, nsec int64) Timespec {
67         return Timespec{Sec: sec, Nsec: nsec}
68 }
69
70 func setTimeval(sec, usec int64) Timeval {
71         return Timeval{Sec: sec, Usec: usec}
72 }
73
74 // Linux on s390x uses the old mmap interface, which requires arguments to be passed in a struct.
75 // mmap2 also requires arguments to be passed in a struct; it is currently not exposed in <asm/unistd.h>.
76 func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
77         mmap_args := [6]uintptr{addr, length, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)}
78         r0, _, e1 := Syscall(SYS_MMAP, uintptr(unsafe.Pointer(&mmap_args[0])), 0, 0)
79         xaddr = uintptr(r0)
80         if e1 != 0 {
81                 err = errnoErr(e1)
82         }
83         return
84 }
85
86 // On s390x Linux, all the socket calls go through an extra indirection.
87 // The arguments to the underlying system call are the number below
88 // and a pointer to an array of uintptr.  We hide the pointer in the
89 // socketcall assembly to avoid allocation on every system call.
90
91 const (
92         // see linux/net.h
93         _SOCKET      = 1
94         _BIND        = 2
95         _CONNECT     = 3
96         _LISTEN      = 4
97         _ACCEPT      = 5
98         _GETSOCKNAME = 6
99         _GETPEERNAME = 7
100         _SOCKETPAIR  = 8
101         _SEND        = 9
102         _RECV        = 10
103         _SENDTO      = 11
104         _RECVFROM    = 12
105         _SHUTDOWN    = 13
106         _SETSOCKOPT  = 14
107         _GETSOCKOPT  = 15
108         _SENDMSG     = 16
109         _RECVMSG     = 17
110         _ACCEPT4     = 18
111         _RECVMMSG    = 19
112         _SENDMMSG    = 20
113 )
114
115 func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err Errno)
116 func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err Errno)
117
118 func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {
119         fd, e := socketcall(_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)
120         if e != 0 {
121                 err = e
122         }
123         return
124 }
125
126 func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {
127         _, e := rawsocketcall(_GETSOCKNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)
128         if e != 0 {
129                 err = e
130         }
131         return
132 }
133
134 func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {
135         _, e := rawsocketcall(_GETPEERNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)
136         if e != 0 {
137                 err = e
138         }
139         return
140 }
141
142 func socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) {
143         _, e := rawsocketcall(_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0)
144         if e != 0 {
145                 err = e
146         }
147         return
148 }
149
150 func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {
151         _, e := socketcall(_BIND, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0)
152         if e != 0 {
153                 err = e
154         }
155         return
156 }
157
158 func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {
159         _, e := socketcall(_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0)
160         if e != 0 {
161                 err = e
162         }
163         return
164 }
165
166 func socket(domain int, typ int, proto int) (fd int, err error) {
167         fd, e := rawsocketcall(_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0)
168         if e != 0 {
169                 err = e
170         }
171         return
172 }
173
174 func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {
175         _, e := socketcall(_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)
176         if e != 0 {
177                 err = e
178         }
179         return
180 }
181
182 func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {
183         _, e := socketcall(_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), vallen, 0)
184         if e != 0 {
185                 err = e
186         }
187         return
188 }
189
190 func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {
191         var base uintptr
192         if len(p) > 0 {
193                 base = uintptr(unsafe.Pointer(&p[0]))
194         }
195         n, e := socketcall(_RECVFROM, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))
196         if e != 0 {
197                 err = e
198         }
199         return
200 }
201
202 func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {
203         var base uintptr
204         if len(p) > 0 {
205                 base = uintptr(unsafe.Pointer(&p[0]))
206         }
207         _, e := socketcall(_SENDTO, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen))
208         if e != 0 {
209                 err = e
210         }
211         return
212 }
213
214 func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
215         n, e := socketcall(_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)
216         if e != 0 {
217                 err = e
218         }
219         return
220 }
221
222 func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
223         n, e := socketcall(_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)
224         if e != 0 {
225                 err = e
226         }
227         return
228 }
229
230 func Listen(s int, n int) (err error) {
231         _, e := socketcall(_LISTEN, uintptr(s), uintptr(n), 0, 0, 0, 0)
232         if e != 0 {
233                 err = e
234         }
235         return
236 }
237
238 func Shutdown(s, how int) (err error) {
239         _, e := socketcall(_SHUTDOWN, uintptr(s), uintptr(how), 0, 0, 0, 0)
240         if e != 0 {
241                 err = e
242         }
243         return
244 }
245
246 //go:nosplit
247 func rawSetrlimit(resource int, rlim *Rlimit) Errno {
248         _, _, errno := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
249         return errno
250 }
251
252 func (r *PtraceRegs) PC() uint64 { return r.Psw.Addr }
253
254 func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.Addr = pc }
255
256 func (iov *Iovec) SetLen(length int) {
257         iov.Len = uint64(length)
258 }
259
260 func (msghdr *Msghdr) SetControllen(length int) {
261         msghdr.Controllen = uint64(length)
262 }
263
264 func (cmsg *Cmsghdr) SetLen(length int) {
265         cmsg.Len = uint64(length)
266 }