github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/runtime/syscall_solaris.go (about)

     1  // Copyright 2014 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 runtime
     6  
     7  import "unsafe"
     8  
     9  var (
    10  	libc_chdir,
    11  	libc_chroot,
    12  	libc_close,
    13  	libc_execve,
    14  	libc_fcntl,
    15  	libc_forkx,
    16  	libc_gethostname,
    17  	libc_getpid,
    18  	libc_ioctl,
    19  	libc_setgid,
    20  	libc_setgroups,
    21  	libc_setrlimit,
    22  	libc_setsid,
    23  	libc_setuid,
    24  	libc_setpgid,
    25  	libc_syscall,
    26  	libc_wait4 libcFunc
    27  )
    28  
    29  // Many of these are exported via linkname to assembly in the syscall
    30  // package.
    31  
    32  //go:nosplit
    33  //go:linkname syscall_sysvicall6
    34  //go:cgo_unsafe_args
    35  func syscall_sysvicall6(fn, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
    36  	call := libcall{
    37  		fn:   fn,
    38  		n:    nargs,
    39  		args: uintptr(unsafe.Pointer(&a1)),
    40  	}
    41  	entersyscallblock()
    42  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
    43  	exitsyscall()
    44  	return call.r1, call.r2, call.err
    45  }
    46  
    47  //go:nosplit
    48  //go:linkname syscall_rawsysvicall6
    49  //go:cgo_unsafe_args
    50  func syscall_rawsysvicall6(fn, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
    51  	call := libcall{
    52  		fn:   fn,
    53  		n:    nargs,
    54  		args: uintptr(unsafe.Pointer(&a1)),
    55  	}
    56  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
    57  	return call.r1, call.r2, call.err
    58  }
    59  
    60  // TODO(aram): Once we remove all instances of C calling sysvicallN, make
    61  // sysvicallN return errors and replace the body of the following functions
    62  // with calls to sysvicallN.
    63  
    64  //go:nosplit
    65  //go:linkname syscall_chdir
    66  func syscall_chdir(path uintptr) (err uintptr) {
    67  	call := libcall{
    68  		fn:   uintptr(unsafe.Pointer(&libc_chdir)),
    69  		n:    1,
    70  		args: uintptr(unsafe.Pointer(&path)),
    71  	}
    72  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
    73  	return call.err
    74  }
    75  
    76  //go:nosplit
    77  //go:linkname syscall_chroot
    78  func syscall_chroot(path uintptr) (err uintptr) {
    79  	call := libcall{
    80  		fn:   uintptr(unsafe.Pointer(&libc_chroot)),
    81  		n:    1,
    82  		args: uintptr(unsafe.Pointer(&path)),
    83  	}
    84  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
    85  	return call.err
    86  }
    87  
    88  // like close, but must not split stack, for forkx.
    89  //
    90  //go:nosplit
    91  //go:linkname syscall_close
    92  func syscall_close(fd int32) int32 {
    93  	return int32(sysvicall1(&libc_close, uintptr(fd)))
    94  }
    95  
    96  const _F_DUP2FD = 0x9
    97  
    98  //go:nosplit
    99  //go:linkname syscall_dup2
   100  func syscall_dup2(oldfd, newfd uintptr) (val, err uintptr) {
   101  	return syscall_fcntl(oldfd, _F_DUP2FD, newfd)
   102  }
   103  
   104  //go:nosplit
   105  //go:linkname syscall_execve
   106  //go:cgo_unsafe_args
   107  func syscall_execve(path, argv, envp uintptr) (err uintptr) {
   108  	call := libcall{
   109  		fn:   uintptr(unsafe.Pointer(&libc_execve)),
   110  		n:    3,
   111  		args: uintptr(unsafe.Pointer(&path)),
   112  	}
   113  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
   114  	return call.err
   115  }
   116  
   117  // like exit, but must not split stack, for forkx.
   118  //
   119  //go:nosplit
   120  //go:linkname syscall_exit
   121  func syscall_exit(code uintptr) {
   122  	sysvicall1(&libc_exit, code)
   123  }
   124  
   125  //go:nosplit
   126  //go:linkname syscall_fcntl
   127  //go:cgo_unsafe_args
   128  func syscall_fcntl(fd, cmd, arg uintptr) (val, err uintptr) {
   129  	call := libcall{
   130  		fn:   uintptr(unsafe.Pointer(&libc_fcntl)),
   131  		n:    3,
   132  		args: uintptr(unsafe.Pointer(&fd)),
   133  	}
   134  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
   135  	return call.r1, call.err
   136  }
   137  
   138  //go:nosplit
   139  //go:linkname syscall_forkx
   140  func syscall_forkx(flags uintptr) (pid uintptr, err uintptr) {
   141  	call := libcall{
   142  		fn:   uintptr(unsafe.Pointer(&libc_forkx)),
   143  		n:    1,
   144  		args: uintptr(unsafe.Pointer(&flags)),
   145  	}
   146  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
   147  	if int(call.r1) != -1 {
   148  		call.err = 0
   149  	}
   150  	return call.r1, call.err
   151  }
   152  
   153  //go:linkname syscall_gethostname
   154  func syscall_gethostname() (name string, err uintptr) {
   155  	cname := new([_MAXHOSTNAMELEN]byte)
   156  	var args = [2]uintptr{uintptr(unsafe.Pointer(&cname[0])), _MAXHOSTNAMELEN}
   157  	call := libcall{
   158  		fn:   uintptr(unsafe.Pointer(&libc_gethostname)),
   159  		n:    2,
   160  		args: uintptr(unsafe.Pointer(&args[0])),
   161  	}
   162  	entersyscallblock()
   163  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
   164  	exitsyscall()
   165  	if call.r1 != 0 {
   166  		return "", call.err
   167  	}
   168  	cname[_MAXHOSTNAMELEN-1] = 0
   169  	return gostringnocopy(&cname[0]), 0
   170  }
   171  
   172  //go:nosplit
   173  //go:linkname syscall_getpid
   174  func syscall_getpid() (pid, err uintptr) {
   175  	call := libcall{
   176  		fn:   uintptr(unsafe.Pointer(&libc_getpid)),
   177  		n:    0,
   178  		args: uintptr(unsafe.Pointer(&libc_getpid)), // it's unused but must be non-nil, otherwise crashes
   179  	}
   180  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
   181  	return call.r1, call.err
   182  }
   183  
   184  //go:nosplit
   185  //go:linkname syscall_ioctl
   186  //go:cgo_unsafe_args
   187  func syscall_ioctl(fd, req, arg uintptr) (err uintptr) {
   188  	call := libcall{
   189  		fn:   uintptr(unsafe.Pointer(&libc_ioctl)),
   190  		n:    3,
   191  		args: uintptr(unsafe.Pointer(&fd)),
   192  	}
   193  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
   194  	return call.err
   195  }
   196  
   197  // This is syscall.RawSyscall, it exists to satisfy some build dependency,
   198  // but it doesn't work.
   199  //
   200  //go:linkname syscall_rawsyscall
   201  func syscall_rawsyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
   202  	panic("RawSyscall not available on Solaris")
   203  }
   204  
   205  // This is syscall.RawSyscall6, it exists to avoid a linker error because
   206  // syscall.RawSyscall6 is already declared. See golang.org/issue/24357
   207  //
   208  //go:linkname syscall_rawsyscall6
   209  func syscall_rawsyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
   210  	panic("RawSyscall6 not available on Solaris")
   211  }
   212  
   213  //go:nosplit
   214  //go:linkname syscall_setgid
   215  func syscall_setgid(gid uintptr) (err uintptr) {
   216  	call := libcall{
   217  		fn:   uintptr(unsafe.Pointer(&libc_setgid)),
   218  		n:    1,
   219  		args: uintptr(unsafe.Pointer(&gid)),
   220  	}
   221  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
   222  	return call.err
   223  }
   224  
   225  //go:nosplit
   226  //go:linkname syscall_setgroups
   227  //go:cgo_unsafe_args
   228  func syscall_setgroups(ngid, gid uintptr) (err uintptr) {
   229  	call := libcall{
   230  		fn:   uintptr(unsafe.Pointer(&libc_setgroups)),
   231  		n:    2,
   232  		args: uintptr(unsafe.Pointer(&ngid)),
   233  	}
   234  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
   235  	return call.err
   236  }
   237  
   238  //go:nosplit
   239  //go:linkname syscall_setrlimit
   240  //go:cgo_unsafe_args
   241  func syscall_setrlimit(which uintptr, lim unsafe.Pointer) (err uintptr) {
   242  	call := libcall{
   243  		fn:   uintptr(unsafe.Pointer(&libc_setrlimit)),
   244  		n:    2,
   245  		args: uintptr(unsafe.Pointer(&which)),
   246  	}
   247  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
   248  	return call.err
   249  }
   250  
   251  //go:nosplit
   252  //go:linkname syscall_setsid
   253  func syscall_setsid() (pid, err uintptr) {
   254  	call := libcall{
   255  		fn:   uintptr(unsafe.Pointer(&libc_setsid)),
   256  		n:    0,
   257  		args: uintptr(unsafe.Pointer(&libc_setsid)), // it's unused but must be non-nil, otherwise crashes
   258  	}
   259  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
   260  	return call.r1, call.err
   261  }
   262  
   263  //go:nosplit
   264  //go:linkname syscall_setuid
   265  func syscall_setuid(uid uintptr) (err uintptr) {
   266  	call := libcall{
   267  		fn:   uintptr(unsafe.Pointer(&libc_setuid)),
   268  		n:    1,
   269  		args: uintptr(unsafe.Pointer(&uid)),
   270  	}
   271  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
   272  	return call.err
   273  }
   274  
   275  //go:nosplit
   276  //go:linkname syscall_setpgid
   277  //go:cgo_unsafe_args
   278  func syscall_setpgid(pid, pgid uintptr) (err uintptr) {
   279  	call := libcall{
   280  		fn:   uintptr(unsafe.Pointer(&libc_setpgid)),
   281  		n:    2,
   282  		args: uintptr(unsafe.Pointer(&pid)),
   283  	}
   284  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
   285  	return call.err
   286  }
   287  
   288  //go:linkname syscall_syscall
   289  //go:cgo_unsafe_args
   290  func syscall_syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
   291  	call := libcall{
   292  		fn:   uintptr(unsafe.Pointer(&libc_syscall)),
   293  		n:    4,
   294  		args: uintptr(unsafe.Pointer(&trap)),
   295  	}
   296  	entersyscallblock()
   297  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
   298  	exitsyscall()
   299  	return call.r1, call.r2, call.err
   300  }
   301  
   302  //go:linkname syscall_wait4
   303  //go:cgo_unsafe_args
   304  func syscall_wait4(pid uintptr, wstatus *uint32, options uintptr, rusage unsafe.Pointer) (wpid int, err uintptr) {
   305  	call := libcall{
   306  		fn:   uintptr(unsafe.Pointer(&libc_wait4)),
   307  		n:    4,
   308  		args: uintptr(unsafe.Pointer(&pid)),
   309  	}
   310  	entersyscallblock()
   311  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
   312  	exitsyscall()
   313  	KeepAlive(wstatus)
   314  	KeepAlive(rusage)
   315  	return int(call.r1), call.err
   316  }
   317  
   318  //go:nosplit
   319  //go:linkname syscall_write
   320  //go:cgo_unsafe_args
   321  func syscall_write(fd, buf, nbyte uintptr) (n, err uintptr) {
   322  	call := libcall{
   323  		fn:   uintptr(unsafe.Pointer(&libc_write)),
   324  		n:    3,
   325  		args: uintptr(unsafe.Pointer(&fd)),
   326  	}
   327  	asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&call))
   328  	return call.r1, call.err
   329  }