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 }