github.com/code-reading/golang@v0.0.0-20220303082512-ba5bc0e589a3/go/src/syscall/syscall_linux_s390x.go (about)

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