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