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 }