diff options
Diffstat (limited to 'src/pkg/runtime/syscall_solaris.goc')
-rw-r--r-- | src/pkg/runtime/syscall_solaris.goc | 374 |
1 files changed, 374 insertions, 0 deletions
diff --git a/src/pkg/runtime/syscall_solaris.goc b/src/pkg/runtime/syscall_solaris.goc new file mode 100644 index 000000000..21bcce4d1 --- /dev/null +++ b/src/pkg/runtime/syscall_solaris.goc @@ -0,0 +1,374 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package syscall +#include "runtime.h" +#include "defs_GOOS_GOARCH.h" +#include "os_GOOS.h" +#include "cgocall.h" +#include "../../cmd/ld/textflag.h" + +#pragma dynimport libc·chdir chdir "libc.so" +#pragma dynimport libc·chroot chroot "libc.so" +#pragma dynimport libc·close close "libc.so" +#pragma dynimport libc·dlclose dlclose "libc.so" +#pragma dynimport libc·dlopen dlopen "libc.so" +#pragma dynimport libc·dlsym dlsym "libc.so" +#pragma dynimport libc·execve execve "libc.so" +#pragma dynimport libc·fcntl fcntl "libc.so" +#pragma dynimport libc·gethostname gethostname "libc.so" +#pragma dynimport libc·ioctl ioctl "libc.so" +#pragma dynimport libc·pipe pipe "libc.so" +#pragma dynimport libc·setgid setgid "libc.so" +#pragma dynimport libc·setgroups setgroups "libc.so" +#pragma dynimport libc·setsid setsid "libc.so" +#pragma dynimport libc·setuid setuid "libc.so" +#pragma dynimport libc·setpgid setsid "libc.so" +#pragma dynimport libc·syscall syscall "libc.so" +#pragma dynimport libc·forkx forkx "libc.so" +#pragma dynimport libc·wait4 wait4 "libc.so" +extern uintptr libc·chdir; +extern uintptr libc·chroot; +extern uintptr libc·close; +extern uintptr libc·dlclose; +extern uintptr libc·dlopen; +extern uintptr libc·dlsym; +extern uintptr libc·execve; +extern uintptr libc·exit; +extern uintptr libc·fcntl; +extern uintptr libc·gethostname; +extern uintptr libc·ioctl; +extern uintptr libc·pipe; +extern uintptr libc·setgid; +extern uintptr libc·setgroups; +extern uintptr libc·setsid; +extern uintptr libc·setuid; +extern uintptr libc·setpgid; +extern uintptr libc·syscall; +extern uintptr libc·forkx; +extern uintptr libc·wait4; +extern uintptr libc·write; + +func sysvicall6(func uintptr, nargs uintptr, a1 uintptr, a2 uintptr, a3 uintptr, a4 uintptr, a5 uintptr, a6 uintptr) (r1 uintptr, r2 uintptr, err uintptr) +{ + LibCall c; + + USED(a2); + USED(a3); + USED(a4); + USED(a5); + USED(a6); + c.fn = (void*)func; + c.n = nargs; + c.args = (void*)&a1; + runtime·cgocall(runtime·asmsysvicall6, &c); + err = c.err; + r1 = c.r1; + r2 = c.r2; +} + +#pragma textflag NOSPLIT +func rawSysvicall6(func uintptr, nargs uintptr, a1 uintptr, a2 uintptr, a3 uintptr, a4 uintptr, a5 uintptr, a6 uintptr) (r1 uintptr, r2 uintptr, err uintptr) +{ + LibCall c; + + USED(a2); + USED(a3); + USED(a4); + USED(a5); + USED(a6); + c.fn = (void*)func; + c.n = nargs; + c.args = (void*)&a1; + runtime·asmcgocall(runtime·asmsysvicall6, &c); + err = c.err; + r1 = c.r1; + r2 = c.r2; +} + +#pragma textflag NOSPLIT +func chdir(path uintptr) (err uintptr) { + LibCall c; + + c.fn = (void*)libc·chdir; + c.n = 1; + c.args = (void*)&path; + runtime·asmcgocall(runtime·asmsysvicall6, &c); + err = c.err; +} + +#pragma textflag NOSPLIT +func chroot1(path uintptr) (err uintptr) { + LibCall c; + + c.fn = (void*)libc·chroot; + c.n = 1; + c.args = (void*)&path; + runtime·asmcgocall(runtime·asmsysvicall6, &c); + err = c.err; +} + +#pragma textflag NOSPLIT +func close(fd uintptr) (err uintptr) { + LibCall c; + + c.fn = (void*)libc·close; + c.n = 1; + c.args = (void*)&fd; + runtime·asmcgocall(runtime·asmsysvicall6, &c); + err = c.err; +} + +func dlclose(handle uintptr) (err uintptr) { + LibCall c; + + USED(handle); + c.fn = (void*)libc·dlclose; + c.n = 1; + c.args = (void*)&handle; + runtime·cgocall(runtime·asmsysvicall6, &c); + err = c.r1; +} + +func dlopen(name *uint8, mode uintptr) (handle uintptr, err uintptr) { + LibCall c; + + USED(mode); + c.fn = (void*)libc·dlopen; + c.n = 2; + c.args = (void*)&name; + runtime·cgocall(runtime·asmsysvicall6, &c); + handle = c.r1; + if(handle == 0) + err = c.err; + else + err = 0; +} + +func dlsym(handle uintptr, name *uint8) (proc uintptr, err uintptr) { + LibCall c; + + USED(name); + c.fn = (void*)libc·dlsym; + c.n = 2; + c.args = &handle; + runtime·cgocall(runtime·asmsysvicall6, &c); + proc = c.r1; + if(proc == 0) + err = c.err; + else + err = 0; +} + +#pragma textflag NOSPLIT +func execve(path uintptr, argv uintptr, envp uintptr) (err uintptr) { + LibCall c; + + USED(argv); + USED(envp); + c.fn = (void*)libc·execve; + c.n = 3; + c.args = (void*)&path; + runtime·asmcgocall(runtime·asmsysvicall6, &c); + err = c.err; +} + +#pragma textflag NOSPLIT +func exit(code uintptr) { + LibCall c; + + c.fn = (void*)libc·exit; + c.n = 1; + c.args = (void*)&code; + runtime·asmcgocall(runtime·asmsysvicall6, &c); +} + +#pragma textflag NOSPLIT +func fcntl1(fd uintptr, cmd uintptr, arg uintptr) (val uintptr, err uintptr) { + LibCall c; + + USED(cmd); + USED(arg); + c.fn = (void*)libc·fcntl; + c.n = 3; + c.args = (void*)&fd; + runtime·asmcgocall(runtime·asmsysvicall6, &c); + err = c.err; + val = c.r1; +} + +func gethostname() (name String, err uintptr) { + struct { uintptr v[2]; } args; + uint8 cname[MAXHOSTNAMELEN]; + LibCall c; + + c.fn = (void*)libc·gethostname; + c.n = 2; + args.v[0] = (uintptr)&cname[0]; + args.v[1] = MAXHOSTNAMELEN; + c.args = (void*)&args; + runtime·cgocall(runtime·asmsysvicall6, &c); + err = c.err; + if(c.r1) { + name = runtime·emptystring; + return; + } + cname[MAXHOSTNAMELEN - 1] = 0; + name = runtime·gostring(cname); +} + +#pragma textflag NOSPLIT +func ioctl(fd uintptr, req uintptr, arg uintptr) (err uintptr) { + LibCall c; + + USED(req); + USED(arg); + c.fn = (void*)libc·ioctl; + c.n = 3; + c.args = (void*)&fd; + runtime·asmcgocall(runtime·asmsysvicall6, &c); + err = c.err; +} + +func wait4(pid uintptr, wstatus *uint32, options uintptr, rusage *void) (wpid int, err uintptr) { + LibCall c; + + USED(wstatus); + USED(options); + USED(rusage); + c.fn = (void*)libc·wait4; + c.n = 4; + c.args = (void*)&pid; + runtime·cgocall(runtime·asmsysvicall6, &c); + err = c.err; + wpid = c.r1; +} + +#pragma textflag NOSPLIT +func setgid(gid uintptr) (err uintptr) { + LibCall c; + + c.fn = (void*)libc·setgid; + c.n = 1; + c.args = (void*)&gid; + runtime·asmcgocall(runtime·asmsysvicall6, &c); + err = c.err; +} + +#pragma textflag NOSPLIT +func setgroups1(ngid uintptr, gid uintptr) (err uintptr) { + LibCall c; + + USED(gid); + c.fn = (void*)libc·setgroups; + c.n = 2; + c.args = (void*)&ngid; + runtime·asmcgocall(runtime·asmsysvicall6, &c); + err = c.err; +} + +#pragma textflag NOSPLIT +func setsid() (pid uintptr, err uintptr) { + LibCall c; + + c.fn = (void*)libc·setsid; + c.n = 0; + c.args = (void*)0; + runtime·asmcgocall(runtime·asmsysvicall6, &c); + err = c.err; + pid = c.r1; +} + +#pragma textflag NOSPLIT +func setuid(uid uintptr) (err uintptr) { + LibCall c; + + c.fn = (void*)libc·setuid; + c.n = 1; + c.args = (void*)&uid; + runtime·asmcgocall(runtime·asmsysvicall6, &c); + err = c.err; +} + +#pragma textflag NOSPLIT +func setpgid(pid uintptr, pgid uintptr) (err uintptr) { + LibCall c; + + USED(pgid); + c.fn = (void*)libc·setpgid; + c.n = 2; + c.args = (void*)&pid; + runtime·asmcgocall(runtime·asmsysvicall6, &c); + err = c.err; +} + +#pragma textflag NOSPLIT +func forkx(flags uintptr) (pid uintptr, err uintptr) { + LibCall c; + + c.fn = (void*)libc·forkx; + c.n = 1; + c.args = (void*)&flags; + runtime·asmcgocall(runtime·asmsysvicall6, &c); + err = c.err; + pid = c.r1; +} + +void runtime·pipe1(void); + +func pipe() (r uintptr, w uintptr, err uintptr) { + LibCall c; + + c.fn = (void*)runtime·pipe1; + c.n = 0; + c.args = (void*)0; + runtime·cgocall(runtime·asmsysvicall6, &c); + err = c.err; + r = c.r1; + w = c.r2; +} + +#pragma textflag NOSPLIT +func write1(fd uintptr, buf uintptr, nbyte uintptr) (n uintptr, err uintptr) { + LibCall c; + + USED(buf); + USED(nbyte); + c.fn = (void*)libc·write; + c.n = 3; + c.args = (void*)fd; + runtime·asmcgocall(runtime·asmsysvicall6, &c); + err = c.err; + n = c.r1; +} + +func Syscall(trap uintptr, a1 uintptr, a2 uintptr, a3 uintptr) (r1 uintptr, r2 uintptr, err uintptr) { + LibCall c; + + USED(a1); + USED(a2); + USED(a3); + c.fn = (void*)libc·syscall; + c.n = 4; + c.args = &trap; + runtime·cgocall(runtime·asmsysvicall6, &c); + err = c.err; + r1 = c.r1; + r2 = c.r2; +} + +func RawSyscall(trap uintptr, a1 uintptr, a2 uintptr, a3 uintptr) (r1 uintptr, r2 uintptr, err uintptr) { + LibCall c; + + USED(a1); + USED(a2); + USED(a3); + c.fn = (void*)libc·syscall; + c.n = 4; + c.args = &trap; + runtime·asmcgocall(runtime·asmsysvicall6, &c); + err = c.err; + r1 = c.r1; + r2 = c.r2; +} |