| // 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; |
| } |