You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

syscall_linux_s390x.go 9.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  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. //go:build s390x && linux
  5. // +build s390x,linux
  6. package unix
  7. import (
  8. "unsafe"
  9. )
  10. //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
  11. //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64
  12. //sys Fchown(fd int, uid int, gid int) (err error)
  13. //sys Fstat(fd int, stat *Stat_t) (err error)
  14. //sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT
  15. //sys Fstatfs(fd int, buf *Statfs_t) (err error)
  16. //sys Ftruncate(fd int, length int64) (err error)
  17. //sysnb Getegid() (egid int)
  18. //sysnb Geteuid() (euid int)
  19. //sysnb Getgid() (gid int)
  20. //sysnb Getrlimit(resource int, rlim *Rlimit) (err error)
  21. //sysnb Getuid() (uid int)
  22. //sys Lchown(path string, uid int, gid int) (err error)
  23. //sys Lstat(path string, stat *Stat_t) (err error)
  24. //sys Pause() (err error)
  25. //sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
  26. //sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
  27. //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
  28. //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
  29. //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
  30. //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
  31. //sys setfsgid(gid int) (prev int, err error)
  32. //sys setfsuid(uid int) (prev int, err error)
  33. //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
  34. //sys Stat(path string, stat *Stat_t) (err error)
  35. //sys Statfs(path string, buf *Statfs_t) (err error)
  36. //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error)
  37. //sys Truncate(path string, length int64) (err error)
  38. //sys Ustat(dev int, ubuf *Ustat_t) (err error)
  39. //sysnb getgroups(n int, list *_Gid_t) (nn int, err error)
  40. //sysnb setgroups(n int, list *_Gid_t) (err error)
  41. //sys futimesat(dirfd int, path string, times *[2]Timeval) (err error)
  42. //sysnb Gettimeofday(tv *Timeval) (err error)
  43. func Time(t *Time_t) (tt Time_t, err error) {
  44. var tv Timeval
  45. err = Gettimeofday(&tv)
  46. if err != nil {
  47. return 0, err
  48. }
  49. if t != nil {
  50. *t = Time_t(tv.Sec)
  51. }
  52. return Time_t(tv.Sec), nil
  53. }
  54. //sys Utime(path string, buf *Utimbuf) (err error)
  55. //sys utimes(path string, times *[2]Timeval) (err error)
  56. func setTimespec(sec, nsec int64) Timespec {
  57. return Timespec{Sec: sec, Nsec: nsec}
  58. }
  59. func setTimeval(sec, usec int64) Timeval {
  60. return Timeval{Sec: sec, Usec: usec}
  61. }
  62. func Ioperm(from int, num int, on int) (err error) {
  63. return ENOSYS
  64. }
  65. func Iopl(level int) (err error) {
  66. return ENOSYS
  67. }
  68. func (r *PtraceRegs) PC() uint64 { return r.Psw.Addr }
  69. func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.Addr = pc }
  70. func (iov *Iovec) SetLen(length int) {
  71. iov.Len = uint64(length)
  72. }
  73. func (msghdr *Msghdr) SetControllen(length int) {
  74. msghdr.Controllen = uint64(length)
  75. }
  76. func (msghdr *Msghdr) SetIovlen(length int) {
  77. msghdr.Iovlen = uint64(length)
  78. }
  79. func (cmsg *Cmsghdr) SetLen(length int) {
  80. cmsg.Len = uint64(length)
  81. }
  82. func (rsa *RawSockaddrNFCLLCP) SetServiceNameLen(length int) {
  83. rsa.Service_name_len = uint64(length)
  84. }
  85. // Linux on s390x uses the old mmap interface, which requires arguments to be passed in a struct.
  86. // mmap2 also requires arguments to be passed in a struct; it is currently not exposed in <asm/unistd.h>.
  87. func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
  88. mmap_args := [6]uintptr{addr, length, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)}
  89. r0, _, e1 := Syscall(SYS_MMAP, uintptr(unsafe.Pointer(&mmap_args[0])), 0, 0)
  90. xaddr = uintptr(r0)
  91. if e1 != 0 {
  92. err = errnoErr(e1)
  93. }
  94. return
  95. }
  96. // On s390x Linux, all the socket calls go through an extra indirection.
  97. // The arguments to the underlying system call (SYS_SOCKETCALL) are the
  98. // number below and a pointer to an array of uintptr.
  99. const (
  100. // see linux/net.h
  101. netSocket = 1
  102. netBind = 2
  103. netConnect = 3
  104. netListen = 4
  105. netAccept = 5
  106. netGetSockName = 6
  107. netGetPeerName = 7
  108. netSocketPair = 8
  109. netSend = 9
  110. netRecv = 10
  111. netSendTo = 11
  112. netRecvFrom = 12
  113. netShutdown = 13
  114. netSetSockOpt = 14
  115. netGetSockOpt = 15
  116. netSendMsg = 16
  117. netRecvMsg = 17
  118. netAccept4 = 18
  119. netRecvMMsg = 19
  120. netSendMMsg = 20
  121. )
  122. func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (int, error) {
  123. args := [4]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags)}
  124. fd, _, err := Syscall(SYS_SOCKETCALL, netAccept4, uintptr(unsafe.Pointer(&args)), 0)
  125. if err != 0 {
  126. return 0, err
  127. }
  128. return int(fd), nil
  129. }
  130. func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error {
  131. args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))}
  132. _, _, err := RawSyscall(SYS_SOCKETCALL, netGetSockName, uintptr(unsafe.Pointer(&args)), 0)
  133. if err != 0 {
  134. return err
  135. }
  136. return nil
  137. }
  138. func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error {
  139. args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))}
  140. _, _, err := RawSyscall(SYS_SOCKETCALL, netGetPeerName, uintptr(unsafe.Pointer(&args)), 0)
  141. if err != 0 {
  142. return err
  143. }
  144. return nil
  145. }
  146. func socketpair(domain int, typ int, flags int, fd *[2]int32) error {
  147. args := [4]uintptr{uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd))}
  148. _, _, err := RawSyscall(SYS_SOCKETCALL, netSocketPair, uintptr(unsafe.Pointer(&args)), 0)
  149. if err != 0 {
  150. return err
  151. }
  152. return nil
  153. }
  154. func bind(s int, addr unsafe.Pointer, addrlen _Socklen) error {
  155. args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)}
  156. _, _, err := Syscall(SYS_SOCKETCALL, netBind, uintptr(unsafe.Pointer(&args)), 0)
  157. if err != 0 {
  158. return err
  159. }
  160. return nil
  161. }
  162. func connect(s int, addr unsafe.Pointer, addrlen _Socklen) error {
  163. args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)}
  164. _, _, err := Syscall(SYS_SOCKETCALL, netConnect, uintptr(unsafe.Pointer(&args)), 0)
  165. if err != 0 {
  166. return err
  167. }
  168. return nil
  169. }
  170. func socket(domain int, typ int, proto int) (int, error) {
  171. args := [3]uintptr{uintptr(domain), uintptr(typ), uintptr(proto)}
  172. fd, _, err := RawSyscall(SYS_SOCKETCALL, netSocket, uintptr(unsafe.Pointer(&args)), 0)
  173. if err != 0 {
  174. return 0, err
  175. }
  176. return int(fd), nil
  177. }
  178. func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) error {
  179. args := [5]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen))}
  180. _, _, err := Syscall(SYS_SOCKETCALL, netGetSockOpt, uintptr(unsafe.Pointer(&args)), 0)
  181. if err != 0 {
  182. return err
  183. }
  184. return nil
  185. }
  186. func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) error {
  187. args := [5]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val), vallen}
  188. _, _, err := Syscall(SYS_SOCKETCALL, netSetSockOpt, uintptr(unsafe.Pointer(&args)), 0)
  189. if err != 0 {
  190. return err
  191. }
  192. return nil
  193. }
  194. func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (int, error) {
  195. var base uintptr
  196. if len(p) > 0 {
  197. base = uintptr(unsafe.Pointer(&p[0]))
  198. }
  199. args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))}
  200. n, _, err := Syscall(SYS_SOCKETCALL, netRecvFrom, uintptr(unsafe.Pointer(&args)), 0)
  201. if err != 0 {
  202. return 0, err
  203. }
  204. return int(n), nil
  205. }
  206. func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) error {
  207. var base uintptr
  208. if len(p) > 0 {
  209. base = uintptr(unsafe.Pointer(&p[0]))
  210. }
  211. args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen)}
  212. _, _, err := Syscall(SYS_SOCKETCALL, netSendTo, uintptr(unsafe.Pointer(&args)), 0)
  213. if err != 0 {
  214. return err
  215. }
  216. return nil
  217. }
  218. func recvmsg(s int, msg *Msghdr, flags int) (int, error) {
  219. args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)}
  220. n, _, err := Syscall(SYS_SOCKETCALL, netRecvMsg, uintptr(unsafe.Pointer(&args)), 0)
  221. if err != 0 {
  222. return 0, err
  223. }
  224. return int(n), nil
  225. }
  226. func sendmsg(s int, msg *Msghdr, flags int) (int, error) {
  227. args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)}
  228. n, _, err := Syscall(SYS_SOCKETCALL, netSendMsg, uintptr(unsafe.Pointer(&args)), 0)
  229. if err != 0 {
  230. return 0, err
  231. }
  232. return int(n), nil
  233. }
  234. func Listen(s int, n int) error {
  235. args := [2]uintptr{uintptr(s), uintptr(n)}
  236. _, _, err := Syscall(SYS_SOCKETCALL, netListen, uintptr(unsafe.Pointer(&args)), 0)
  237. if err != 0 {
  238. return err
  239. }
  240. return nil
  241. }
  242. func Shutdown(s, how int) error {
  243. args := [2]uintptr{uintptr(s), uintptr(how)}
  244. _, _, err := Syscall(SYS_SOCKETCALL, netShutdown, uintptr(unsafe.Pointer(&args)), 0)
  245. if err != 0 {
  246. return err
  247. }
  248. return nil
  249. }
  250. //sys kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error)
  251. func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error {
  252. cmdlineLen := len(cmdline)
  253. if cmdlineLen > 0 {
  254. // Account for the additional NULL byte added by
  255. // BytePtrFromString in kexecFileLoad. The kexec_file_load
  256. // syscall expects a NULL-terminated string.
  257. cmdlineLen++
  258. }
  259. return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags)
  260. }