xref: /plan9/sys/src/cmd/qi/syscall.c (revision c93608cc76758b2be624199c6208a0f90bad298d)
17d9195a7SDavid du Colombier #include <u.h>
27d9195a7SDavid du Colombier #include <libc.h>
37d9195a7SDavid du Colombier #include <auth.h>
47d9195a7SDavid du Colombier #include <bio.h>
57d9195a7SDavid du Colombier #include <mach.h>
67d9195a7SDavid du Colombier #define Extern extern
77d9195a7SDavid du Colombier #include "power.h"
87d9195a7SDavid du Colombier 
97d9195a7SDavid du Colombier 
107d9195a7SDavid du Colombier #define	REGSP	1
117d9195a7SDavid du Colombier #define	REGRET	3
127d9195a7SDavid du Colombier 
137d9195a7SDavid du Colombier #define	ODIRLEN	116	/* compatibility; used in _stat etc. */
147d9195a7SDavid du Colombier #define	OERRLEN	64	/* compatibility; used in _stat etc. */
157d9195a7SDavid du Colombier 
167d9195a7SDavid du Colombier char 	errbuf[ERRMAX];
177d9195a7SDavid du Colombier ulong	nofunc;
187d9195a7SDavid du Colombier 
197d9195a7SDavid du Colombier #include "/sys/src/libc/9syscall/sys.h"
207d9195a7SDavid du Colombier 
217d9195a7SDavid du Colombier char *sysctab[]={
227d9195a7SDavid du Colombier 	[SYSR1]		"SYSR1",
237d9195a7SDavid du Colombier 	[_ERRSTR]	"_errstr",
247d9195a7SDavid du Colombier 	[BIND]		"Bind",
257d9195a7SDavid du Colombier 	[CHDIR]		"Chdir",
267d9195a7SDavid du Colombier 	[CLOSE]		"Close",
277d9195a7SDavid du Colombier 	[DUP]		"Dup",
287d9195a7SDavid du Colombier 	[ALARM]		"Alarm",
297d9195a7SDavid du Colombier 	[EXEC]		"Exec",
307d9195a7SDavid du Colombier 	[EXITS]		"Exits",
317d9195a7SDavid du Colombier 	[_FSESSION]	"_Fsession",
327d9195a7SDavid du Colombier 	[FAUTH]		"Fauth",
337d9195a7SDavid du Colombier 	[_FSTAT]	"_fstat",
347d9195a7SDavid du Colombier 	[SEGBRK]	"Segbrk",
357d9195a7SDavid du Colombier 	[_MOUNT]	"_Mount",
367d9195a7SDavid du Colombier 	[OPEN]		"Open",
377d9195a7SDavid du Colombier 	[_READ]		"_Read",
387d9195a7SDavid du Colombier 	[OSEEK]		"Oseek",
397d9195a7SDavid du Colombier 	[SLEEP]		"Sleep",
407d9195a7SDavid du Colombier 	[_STAT]		"_Stat",
417d9195a7SDavid du Colombier 	[RFORK]		"Rfork",
427d9195a7SDavid du Colombier 	[_WRITE]	"_Write",
437d9195a7SDavid du Colombier 	[PIPE]		"Pipe",
447d9195a7SDavid du Colombier 	[CREATE]	"Create",
457d9195a7SDavid du Colombier 	[FD2PATH]	"Fd2path",
467d9195a7SDavid du Colombier 	[BRK_]		"Brk_",
477d9195a7SDavid du Colombier 	[REMOVE]	"Remove",
487d9195a7SDavid du Colombier 	[_WSTAT]	"_Wstat",
497d9195a7SDavid du Colombier 	[_FWSTAT]	"_Fwstat",
507d9195a7SDavid du Colombier 	[NOTIFY]	"Notify",
517d9195a7SDavid du Colombier 	[NOTED]		"Noted",
527d9195a7SDavid du Colombier 	[SEGATTACH]	"Segattach",
537d9195a7SDavid du Colombier 	[SEGDETACH]	"Segdetach",
547d9195a7SDavid du Colombier 	[SEGFREE]	"Segfree",
557d9195a7SDavid du Colombier 	[SEGFLUSH]	"Segflush",
567d9195a7SDavid du Colombier 	[RENDEZVOUS]	"Rendezvous",
577d9195a7SDavid du Colombier 	[UNMOUNT]	"Unmount",
587d9195a7SDavid du Colombier 	[_WAIT]		"Wait",
597d9195a7SDavid du Colombier 	[SEEK]		"Seek",
607d9195a7SDavid du Colombier 	[FVERSION]	"Fversion",
617d9195a7SDavid du Colombier 	[ERRSTR]	"Errstr",
627d9195a7SDavid du Colombier 	[STAT]		"Stat",
637d9195a7SDavid du Colombier 	[FSTAT]		"Fstat",
647d9195a7SDavid du Colombier 	[WSTAT]		"Wstat",
657d9195a7SDavid du Colombier 	[FWSTAT]	"Fwstat",
667d9195a7SDavid du Colombier 	[MOUNT]		"Mount",
677d9195a7SDavid du Colombier 	[AWAIT]		"Await",
687d9195a7SDavid du Colombier 	[PREAD]		"Pread",
697d9195a7SDavid du Colombier 	[PWRITE]	"Pwrite",
707d9195a7SDavid du Colombier };
717d9195a7SDavid du Colombier 
sys1(void)727d9195a7SDavid du Colombier void sys1(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
737d9195a7SDavid du Colombier 
747d9195a7SDavid du Colombier void
sys_errstr(void)757d9195a7SDavid du Colombier sys_errstr(void)
767d9195a7SDavid du Colombier {
777d9195a7SDavid du Colombier 	ulong str;
787d9195a7SDavid du Colombier 	char tmp[OERRLEN];
797d9195a7SDavid du Colombier 
807d9195a7SDavid du Colombier 	str = getmem_w(reg.r[REGSP]+4);
817d9195a7SDavid du Colombier 	if(sysdbg)
827d9195a7SDavid du Colombier 		itrace("errstr(0x%lux)", str);
837d9195a7SDavid du Colombier 
847d9195a7SDavid du Colombier 	memio(tmp, str, OERRLEN, MemRead);
857d9195a7SDavid du Colombier 	memio(errbuf, str, OERRLEN, MemWrite);
867d9195a7SDavid du Colombier 	memmove(errbuf, tmp, OERRLEN);
877d9195a7SDavid du Colombier 	errbuf[OERRLEN-1] = 0;
887d9195a7SDavid du Colombier 	reg.r[REGRET] = 0;
897d9195a7SDavid du Colombier }
907d9195a7SDavid du Colombier 
917d9195a7SDavid du Colombier void
syserrstr(void)927d9195a7SDavid du Colombier syserrstr(void)
937d9195a7SDavid du Colombier {
947d9195a7SDavid du Colombier 	ulong str;
957d9195a7SDavid du Colombier 	uint n;
967d9195a7SDavid du Colombier 	char tmp[ERRMAX];
977d9195a7SDavid du Colombier 
987d9195a7SDavid du Colombier 	str = getmem_w(reg.r[REGSP]+4);
997d9195a7SDavid du Colombier 	n = getmem_w(reg.r[REGSP]+8);
1007d9195a7SDavid du Colombier 	if(sysdbg)
1017d9195a7SDavid du Colombier 		itrace("errstr(0x%lux, 0x%lux)", str, n);
1027d9195a7SDavid du Colombier 
1037d9195a7SDavid du Colombier 	if(n > strlen(errbuf)+1)
1047d9195a7SDavid du Colombier 		n = strlen(errbuf)+1;
1057d9195a7SDavid du Colombier 	if(n > ERRMAX)
1067d9195a7SDavid du Colombier 		n = ERRMAX;
1077d9195a7SDavid du Colombier 	memio(tmp, str, n, MemRead);
1087d9195a7SDavid du Colombier 	memio(errbuf, str, n, MemWrite);
1097d9195a7SDavid du Colombier 	memmove(errbuf, tmp, n);
1107d9195a7SDavid du Colombier 	errbuf[ERRMAX-1] = 0;
1117d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
1127d9195a7SDavid du Colombier 
1137d9195a7SDavid du Colombier }
1147d9195a7SDavid du Colombier 
1157d9195a7SDavid du Colombier void
sysfd2path(void)1167d9195a7SDavid du Colombier sysfd2path(void)
1177d9195a7SDavid du Colombier {
118*c93608ccSDavid du Colombier 	int n;
119*c93608ccSDavid du Colombier 	uint fd;
1207d9195a7SDavid du Colombier 	ulong str;
1217d9195a7SDavid du Colombier 	char buf[1024];
1227d9195a7SDavid du Colombier 
1237d9195a7SDavid du Colombier 	fd = getmem_w(reg.r[REGSP]+4);
1247d9195a7SDavid du Colombier 	str = getmem_w(reg.r[REGSP]+8);
1257d9195a7SDavid du Colombier 	n = getmem_w(reg.r[REGSP]+12);
1267d9195a7SDavid du Colombier 	if(sysdbg)
1277d9195a7SDavid du Colombier 		itrace("fd2path(0x%lux, 0x%lux, 0x%lux)", fd, str, n);
1287d9195a7SDavid du Colombier 	reg.r[REGRET] = -1;
1297d9195a7SDavid du Colombier 	if(n > sizeof buf){
1307d9195a7SDavid du Colombier 		strcpy(errbuf, "buffer too big");
1317d9195a7SDavid du Colombier 		return;
1327d9195a7SDavid du Colombier 	}
1337d9195a7SDavid du Colombier 	n = fd2path(fd, buf, sizeof buf);
1347d9195a7SDavid du Colombier 	if(n < 0)
1357d9195a7SDavid du Colombier 		errstr(buf, sizeof buf);
1367d9195a7SDavid du Colombier 	else
1377d9195a7SDavid du Colombier 		memio(errbuf, str, n, MemWrite);
1387d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
1397d9195a7SDavid du Colombier 
1407d9195a7SDavid du Colombier }
1417d9195a7SDavid du Colombier 
1427d9195a7SDavid du Colombier void
sysbind(void)1437d9195a7SDavid du Colombier sysbind(void)
1447d9195a7SDavid du Colombier {
1457d9195a7SDavid du Colombier 	ulong pname, pold, flags;
1467d9195a7SDavid du Colombier 	char name[1024], old[1024];
1477d9195a7SDavid du Colombier 	int n;
1487d9195a7SDavid du Colombier 
1497d9195a7SDavid du Colombier 	pname = getmem_w(reg.r[REGSP]+4);
1507d9195a7SDavid du Colombier 	pold = getmem_w(reg.r[REGSP]+8);
1517d9195a7SDavid du Colombier 	flags = getmem_w(reg.r[REGSP]+12);
1527d9195a7SDavid du Colombier 	memio(name, pname, sizeof(name), MemReadstring);
1537d9195a7SDavid du Colombier 	memio(old, pold, sizeof(old), MemReadstring);
1547d9195a7SDavid du Colombier 	if(sysdbg)
1557d9195a7SDavid du Colombier 		itrace("bind(0x%lux='%s', 0x%lux='%s', 0x%lux)", name, old, flags);
1567d9195a7SDavid du Colombier 
1577d9195a7SDavid du Colombier 	n = bind(name, old, flags);
1587d9195a7SDavid du Colombier 	if(n < 0)
1597d9195a7SDavid du Colombier 		errstr(errbuf, sizeof errbuf);
1607d9195a7SDavid du Colombier 
1617d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
1627d9195a7SDavid du Colombier }
1637d9195a7SDavid du Colombier 
1647d9195a7SDavid du Colombier void
syschdir(void)1657d9195a7SDavid du Colombier syschdir(void)
1667d9195a7SDavid du Colombier {
1677d9195a7SDavid du Colombier 	char file[1024];
1687d9195a7SDavid du Colombier 	int n;
1697d9195a7SDavid du Colombier 	ulong name;
1707d9195a7SDavid du Colombier 
1717d9195a7SDavid du Colombier 	name = getmem_w(reg.r[REGSP]+4);
1727d9195a7SDavid du Colombier 	memio(file, name, sizeof(file), MemReadstring);
1737d9195a7SDavid du Colombier 	if(sysdbg)
1747d9195a7SDavid du Colombier 		itrace("chdir(0x%lux='%s', 0x%lux)", name, file);
1757d9195a7SDavid du Colombier 
1767d9195a7SDavid du Colombier 	n = chdir(file);
1777d9195a7SDavid du Colombier 	if(n < 0)
1787d9195a7SDavid du Colombier 		errstr(errbuf, sizeof errbuf);
1797d9195a7SDavid du Colombier 
1807d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
1817d9195a7SDavid du Colombier }
1827d9195a7SDavid du Colombier 
1837d9195a7SDavid du Colombier void
sysclose(void)1847d9195a7SDavid du Colombier sysclose(void)
1857d9195a7SDavid du Colombier {
1867d9195a7SDavid du Colombier 	int n;
1877d9195a7SDavid du Colombier 	ulong fd;
1887d9195a7SDavid du Colombier 
1897d9195a7SDavid du Colombier 	fd = getmem_w(reg.r[REGSP]+4);
1907d9195a7SDavid du Colombier 	if(sysdbg)
1917d9195a7SDavid du Colombier 		itrace("close(%d)", fd);
1927d9195a7SDavid du Colombier 
1937d9195a7SDavid du Colombier 	n = close(fd);
1947d9195a7SDavid du Colombier 	if(n < 0)
1957d9195a7SDavid du Colombier 		errstr(errbuf, sizeof errbuf);
1967d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
1977d9195a7SDavid du Colombier }
1987d9195a7SDavid du Colombier 
1997d9195a7SDavid du Colombier void
sysdup(void)2007d9195a7SDavid du Colombier sysdup(void)
2017d9195a7SDavid du Colombier {
2027d9195a7SDavid du Colombier 	int oldfd, newfd;
2037d9195a7SDavid du Colombier 	int n;
2047d9195a7SDavid du Colombier 
2057d9195a7SDavid du Colombier 	oldfd = getmem_w(reg.r[REGSP]+4);
2067d9195a7SDavid du Colombier 	newfd = getmem_w(reg.r[REGSP]+8);
2077d9195a7SDavid du Colombier 	if(sysdbg)
2087d9195a7SDavid du Colombier 		itrace("dup(%d, %d)", oldfd, newfd);
2097d9195a7SDavid du Colombier 
2107d9195a7SDavid du Colombier 	n = dup(oldfd, newfd);
2117d9195a7SDavid du Colombier 	if(n < 0)
2127d9195a7SDavid du Colombier 		errstr(errbuf, sizeof errbuf);
2137d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
2147d9195a7SDavid du Colombier }
2157d9195a7SDavid du Colombier 
2167d9195a7SDavid du Colombier void
sysexits(void)2177d9195a7SDavid du Colombier sysexits(void)
2187d9195a7SDavid du Colombier {
2197d9195a7SDavid du Colombier 	char buf[ERRMAX];
2207d9195a7SDavid du Colombier 	ulong str;
2217d9195a7SDavid du Colombier 
2227d9195a7SDavid du Colombier 	str = getmem_w(reg.r[REGSP]+4);
2237d9195a7SDavid du Colombier 	if(sysdbg)
2247d9195a7SDavid du Colombier 		itrace("exits(0x%lux)", str);
2257d9195a7SDavid du Colombier 
2267d9195a7SDavid du Colombier 	count = 1;
2277d9195a7SDavid du Colombier 	if(str != 0) {
2287d9195a7SDavid du Colombier 		memio(buf, str, sizeof buf, MemRead);
2297d9195a7SDavid du Colombier 		buf[ERRMAX-1] = 0;
2307d9195a7SDavid du Colombier 		Bprint(bioout, "exits(%s)\n", buf);
2317d9195a7SDavid du Colombier 	}
2327d9195a7SDavid du Colombier 	else
2337d9195a7SDavid du Colombier 		Bprint(bioout, "exits(0)\n");
2347d9195a7SDavid du Colombier }
2357d9195a7SDavid du Colombier 
2367d9195a7SDavid du Colombier void
sysopen(void)2377d9195a7SDavid du Colombier sysopen(void)
2387d9195a7SDavid du Colombier {
2397d9195a7SDavid du Colombier 	char file[1024];
2407d9195a7SDavid du Colombier 	int n;
2417d9195a7SDavid du Colombier 	ulong mode, name;
2427d9195a7SDavid du Colombier 
2437d9195a7SDavid du Colombier 	name = getmem_w(reg.r[REGSP]+4);
2447d9195a7SDavid du Colombier 	mode = getmem_w(reg.r[REGSP]+8);
2457d9195a7SDavid du Colombier 	memio(file, name, sizeof(file), MemReadstring);
2467d9195a7SDavid du Colombier 	if(sysdbg)
2477d9195a7SDavid du Colombier 		itrace("open(0x%lux='%s', 0x%lux)", name, file, mode);
2487d9195a7SDavid du Colombier 
2497d9195a7SDavid du Colombier 	n = open(file, mode);
2507d9195a7SDavid du Colombier 	if(n < 0)
2517d9195a7SDavid du Colombier 		errstr(errbuf, sizeof errbuf);
2527d9195a7SDavid du Colombier 
2537d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
2547d9195a7SDavid du Colombier };
2557d9195a7SDavid du Colombier 
2567d9195a7SDavid du Colombier void
sysread(vlong offset)2577d9195a7SDavid du Colombier sysread(vlong offset)
2587d9195a7SDavid du Colombier {
2597d9195a7SDavid du Colombier 	int fd;
2607d9195a7SDavid du Colombier 	ulong size, a;
2617d9195a7SDavid du Colombier 	char *buf, *p;
2627d9195a7SDavid du Colombier 	int n, cnt, c;
2637d9195a7SDavid du Colombier 
2647d9195a7SDavid du Colombier 	fd = getmem_w(reg.r[REGSP]+4);
2657d9195a7SDavid du Colombier 	a = getmem_w(reg.r[REGSP]+8);
2667d9195a7SDavid du Colombier 	size = getmem_w(reg.r[REGSP]+12);
2677d9195a7SDavid du Colombier 
2687d9195a7SDavid du Colombier 	buf = emalloc(size);
2697d9195a7SDavid du Colombier 	if(fd == 0) {
2707d9195a7SDavid du Colombier 		print("\nstdin>>");
2717d9195a7SDavid du Colombier 		p = buf;
2727d9195a7SDavid du Colombier 		n = 0;
2737d9195a7SDavid du Colombier 		cnt = size;
2747d9195a7SDavid du Colombier 		while(cnt) {
2757d9195a7SDavid du Colombier 			c = Bgetc(bin);
2767d9195a7SDavid du Colombier 			if(c <= 0)
2777d9195a7SDavid du Colombier 				break;
2787d9195a7SDavid du Colombier 			*p++ = c;
2797d9195a7SDavid du Colombier 			n++;
2807d9195a7SDavid du Colombier 			cnt--;
2817d9195a7SDavid du Colombier 			if(c == '\n')
2827d9195a7SDavid du Colombier 				break;
2837d9195a7SDavid du Colombier 		}
2847d9195a7SDavid du Colombier 	}
2857d9195a7SDavid du Colombier 	else
2867d9195a7SDavid du Colombier 		n = pread(fd, buf, size, offset);
2877d9195a7SDavid du Colombier 
2887d9195a7SDavid du Colombier 	if(n < 0)
2897d9195a7SDavid du Colombier 		errstr(errbuf, sizeof errbuf);
2907d9195a7SDavid du Colombier 	else
2917d9195a7SDavid du Colombier 		memio(buf, a, n, MemWrite);
2927d9195a7SDavid du Colombier 
2937d9195a7SDavid du Colombier 	if(sysdbg)
2947d9195a7SDavid du Colombier 		itrace("read(%d, 0x%lux, %d, 0x%llx) = %d", fd, a, size, offset, n);
2957d9195a7SDavid du Colombier 
2967d9195a7SDavid du Colombier 	free(buf);
2977d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
2987d9195a7SDavid du Colombier }
2997d9195a7SDavid du Colombier 
3007d9195a7SDavid du Colombier void
sys_read(void)3017d9195a7SDavid du Colombier sys_read(void)
3027d9195a7SDavid du Colombier {
3037d9195a7SDavid du Colombier 	sysread(-1LL);
3047d9195a7SDavid du Colombier }
3057d9195a7SDavid du Colombier 
3067d9195a7SDavid du Colombier void
syspread(void)3077d9195a7SDavid du Colombier syspread(void)
3087d9195a7SDavid du Colombier {
3097d9195a7SDavid du Colombier 	union {
3107d9195a7SDavid du Colombier 		vlong v;
3117d9195a7SDavid du Colombier 		ulong u[2];
3127d9195a7SDavid du Colombier 	} o;
3137d9195a7SDavid du Colombier 
3147d9195a7SDavid du Colombier 	o.u[0] = getmem_w(reg.r[REGSP]+16);
3157d9195a7SDavid du Colombier 	o.u[1] = getmem_w(reg.r[REGSP]+20);
3167d9195a7SDavid du Colombier 	sysread(o.v);
3177d9195a7SDavid du Colombier }
3187d9195a7SDavid du Colombier 
3197d9195a7SDavid du Colombier void
sysseek(void)3207d9195a7SDavid du Colombier sysseek(void)
3217d9195a7SDavid du Colombier {
3227d9195a7SDavid du Colombier 	int fd;
3237d9195a7SDavid du Colombier 	ulong mode;
3247d9195a7SDavid du Colombier 	ulong retp;
3257d9195a7SDavid du Colombier 	union {
3267d9195a7SDavid du Colombier 		vlong v;
3277d9195a7SDavid du Colombier 		ulong u[2];
3287d9195a7SDavid du Colombier 	} o;
3297d9195a7SDavid du Colombier 
3307d9195a7SDavid du Colombier 	retp = getmem_w(reg.r[REGSP]+4);
3317d9195a7SDavid du Colombier 	fd = getmem_w(reg.r[REGSP]+8);
3327d9195a7SDavid du Colombier 	o.u[0] = getmem_w(reg.r[REGSP]+12);
3337d9195a7SDavid du Colombier 	o.u[1] = getmem_w(reg.r[REGSP]+16);
3347d9195a7SDavid du Colombier 	mode = getmem_w(reg.r[REGSP]+20);
3357d9195a7SDavid du Colombier 	if(sysdbg)
3367d9195a7SDavid du Colombier 		itrace("seek(%d, %lld, %d)", fd, o.v, mode);
3377d9195a7SDavid du Colombier 
3387d9195a7SDavid du Colombier 	o.v = seek(fd, o.v, mode);
3397d9195a7SDavid du Colombier 	if(o.v < 0)
3407d9195a7SDavid du Colombier 		errstr(errbuf, sizeof errbuf);
3417d9195a7SDavid du Colombier 
3427d9195a7SDavid du Colombier 	memio((char*)o.u, retp, sizeof(vlong), MemWrite);
3437d9195a7SDavid du Colombier }
3447d9195a7SDavid du Colombier 
3457d9195a7SDavid du Colombier void
sysoseek(void)3467d9195a7SDavid du Colombier sysoseek(void)
3477d9195a7SDavid du Colombier {
3487d9195a7SDavid du Colombier 	int fd, n;
3497d9195a7SDavid du Colombier 	ulong off, mode;
3507d9195a7SDavid du Colombier 
3517d9195a7SDavid du Colombier 	fd = getmem_w(reg.r[REGSP]+4);
3527d9195a7SDavid du Colombier 	off = getmem_w(reg.r[REGSP]+8);
3537d9195a7SDavid du Colombier 	mode = getmem_w(reg.r[REGSP]+12);
3547d9195a7SDavid du Colombier 	if(sysdbg)
3557d9195a7SDavid du Colombier 		itrace("seek(%d, %lud, %d)", fd, off, mode);
3567d9195a7SDavid du Colombier 
3577d9195a7SDavid du Colombier 	n = seek(fd, off, mode);
3587d9195a7SDavid du Colombier 	if(n < 0)
3597d9195a7SDavid du Colombier 		errstr(errbuf, sizeof errbuf);
3607d9195a7SDavid du Colombier 
3617d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
3627d9195a7SDavid du Colombier }
3637d9195a7SDavid du Colombier 
3647d9195a7SDavid du Colombier void
sysrfork(void)3657d9195a7SDavid du Colombier sysrfork(void)
3667d9195a7SDavid du Colombier {
3677d9195a7SDavid du Colombier 	int flag;
3687d9195a7SDavid du Colombier 
3697d9195a7SDavid du Colombier 	flag = getmem_w(reg.r[REGSP]+4);
3707d9195a7SDavid du Colombier 	if(sysdbg)
3717d9195a7SDavid du Colombier 		itrace("rfork(%d)", flag);
3727d9195a7SDavid du Colombier 	if(flag & RFPROC) {
3737d9195a7SDavid du Colombier 		Bprint(bioout, "rfork: cannot create process, rfork(0x%.8ux)\n", flag);
3747d9195a7SDavid du Colombier 		exits(0);
3757d9195a7SDavid du Colombier 	}
3767d9195a7SDavid du Colombier 	reg.r[REGRET] = rfork(flag);
3777d9195a7SDavid du Colombier }
3787d9195a7SDavid du Colombier 
3797d9195a7SDavid du Colombier void
syssleep(void)3807d9195a7SDavid du Colombier syssleep(void)
3817d9195a7SDavid du Colombier {
3827d9195a7SDavid du Colombier 	ulong len;
3837d9195a7SDavid du Colombier 	int n;
3847d9195a7SDavid du Colombier 
3857d9195a7SDavid du Colombier 	len = getmem_w(reg.r[REGSP]+4);
3867d9195a7SDavid du Colombier 	if(sysdbg)
3877d9195a7SDavid du Colombier 		itrace("sleep(%d)", len);
3887d9195a7SDavid du Colombier 
3897d9195a7SDavid du Colombier 	n = sleep(len);
3907d9195a7SDavid du Colombier 	if(n < 0)
3917d9195a7SDavid du Colombier 		errstr(errbuf, sizeof errbuf);
3927d9195a7SDavid du Colombier 
3937d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
3947d9195a7SDavid du Colombier }
3957d9195a7SDavid du Colombier 
3967d9195a7SDavid du Colombier void
sys_stat(void)3977d9195a7SDavid du Colombier sys_stat(void)
3987d9195a7SDavid du Colombier {
3997d9195a7SDavid du Colombier 	char nambuf[1024];
4007d9195a7SDavid du Colombier 	char buf[ODIRLEN];
4017d9195a7SDavid du Colombier 	ulong edir, name;
4027d9195a7SDavid du Colombier 	extern int _stat(char*, char*);	/* old system call */
4037d9195a7SDavid du Colombier 	int n;
4047d9195a7SDavid du Colombier 
4057d9195a7SDavid du Colombier 	name = getmem_w(reg.r[REGSP]+4);
4067d9195a7SDavid du Colombier 	edir = getmem_w(reg.r[REGSP]+8);
4077d9195a7SDavid du Colombier 	memio(nambuf, name, sizeof(nambuf), MemReadstring);
4087d9195a7SDavid du Colombier 	if(sysdbg)
4097d9195a7SDavid du Colombier 		itrace("stat(0x%lux='%s', 0x%lux)", name, nambuf, edir);
4107d9195a7SDavid du Colombier 
4117d9195a7SDavid du Colombier 	n = _stat(nambuf, buf);
4127d9195a7SDavid du Colombier 	if(n < 0)
4137d9195a7SDavid du Colombier 		errstr(errbuf, sizeof errbuf);
4147d9195a7SDavid du Colombier 	else
4157d9195a7SDavid du Colombier 		memio(buf, edir, ODIRLEN, MemWrite);
4167d9195a7SDavid du Colombier 
4177d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
4187d9195a7SDavid du Colombier }
4197d9195a7SDavid du Colombier 
4207d9195a7SDavid du Colombier void
sysstat(void)4217d9195a7SDavid du Colombier sysstat(void)
4227d9195a7SDavid du Colombier {
4237d9195a7SDavid du Colombier 	char nambuf[1024];
4247d9195a7SDavid du Colombier 	uchar buf[STATMAX];
4257d9195a7SDavid du Colombier 	ulong edir, name;
4267d9195a7SDavid du Colombier 	int n;
4277d9195a7SDavid du Colombier 
4287d9195a7SDavid du Colombier 	name = getmem_w(reg.r[REGSP]+4);
4297d9195a7SDavid du Colombier 	edir = getmem_w(reg.r[REGSP]+8);
4307d9195a7SDavid du Colombier 	n = getmem_w(reg.r[REGSP]+12);
4317d9195a7SDavid du Colombier 	memio(nambuf, name, sizeof(nambuf), MemReadstring);
4327d9195a7SDavid du Colombier 	if(sysdbg)
4337d9195a7SDavid du Colombier 		itrace("stat(0x%lux='%s', 0x%lux, 0x%lux)", name, nambuf, edir, n);
4347d9195a7SDavid du Colombier 	if(n > sizeof buf)
4357d9195a7SDavid du Colombier 		errstr(errbuf, sizeof errbuf);
4367d9195a7SDavid du Colombier 	else{
4377d9195a7SDavid du Colombier 		n = stat(nambuf, buf, n);
4387d9195a7SDavid du Colombier 		if(n < 0)
4397d9195a7SDavid du Colombier 			errstr(errbuf, sizeof errbuf);
4407d9195a7SDavid du Colombier 		else
4417d9195a7SDavid du Colombier 			memio((char*)buf, edir, n, MemWrite);
4427d9195a7SDavid du Colombier 	}
4437d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
4447d9195a7SDavid du Colombier }
4457d9195a7SDavid du Colombier 
4467d9195a7SDavid du Colombier void
sys_fstat(void)4477d9195a7SDavid du Colombier sys_fstat(void)
4487d9195a7SDavid du Colombier {
4497d9195a7SDavid du Colombier 	char buf[ODIRLEN];
4507d9195a7SDavid du Colombier 	ulong edir;
4517d9195a7SDavid du Colombier 	extern int _fstat(int, char*);	/* old system call */
4527d9195a7SDavid du Colombier 	int n, fd;
4537d9195a7SDavid du Colombier 
4547d9195a7SDavid du Colombier 	fd = getmem_w(reg.r[REGSP]+4);
4557d9195a7SDavid du Colombier 	edir = getmem_w(reg.r[REGSP]+8);
4567d9195a7SDavid du Colombier 	if(sysdbg)
4577d9195a7SDavid du Colombier 		itrace("fstat(%d, 0x%lux)", fd, edir);
4587d9195a7SDavid du Colombier 
4597d9195a7SDavid du Colombier 	n = _fstat(fd, buf);
4607d9195a7SDavid du Colombier 	if(n < 0)
4617d9195a7SDavid du Colombier 		errstr(errbuf, sizeof errbuf);
4627d9195a7SDavid du Colombier 	else
4637d9195a7SDavid du Colombier 		memio(buf, edir, ODIRLEN, MemWrite);
4647d9195a7SDavid du Colombier 
4657d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
4667d9195a7SDavid du Colombier }
4677d9195a7SDavid du Colombier 
4687d9195a7SDavid du Colombier void
sysfstat(void)4697d9195a7SDavid du Colombier sysfstat(void)
4707d9195a7SDavid du Colombier {
4717d9195a7SDavid du Colombier 	uchar buf[STATMAX];
4727d9195a7SDavid du Colombier 	ulong edir;
4737d9195a7SDavid du Colombier 	int n, fd;
4747d9195a7SDavid du Colombier 
4757d9195a7SDavid du Colombier 	fd = getmem_w(reg.r[REGSP]+4);
4767d9195a7SDavid du Colombier 	edir = getmem_w(reg.r[REGSP]+8);
4777d9195a7SDavid du Colombier 	n = getmem_w(reg.r[REGSP]+12);
4787d9195a7SDavid du Colombier 	if(sysdbg)
4797d9195a7SDavid du Colombier 		itrace("fstat(%d, 0x%lux, 0x%lux)", fd, edir, n);
4807d9195a7SDavid du Colombier 
4817d9195a7SDavid du Colombier 	reg.r[REGRET] = -1;
4827d9195a7SDavid du Colombier 	if(n > sizeof buf){
4837d9195a7SDavid du Colombier 		strcpy(errbuf, "stat buffer too big");
4847d9195a7SDavid du Colombier 		return;
4857d9195a7SDavid du Colombier 	}
4867d9195a7SDavid du Colombier 	n = fstat(fd, buf, n);
4877d9195a7SDavid du Colombier 	if(n < 0)
4887d9195a7SDavid du Colombier 		errstr(errbuf, sizeof errbuf);
4897d9195a7SDavid du Colombier 	else
4907d9195a7SDavid du Colombier 		memio((char*)buf, edir, n, MemWrite);
4917d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
4927d9195a7SDavid du Colombier }
4937d9195a7SDavid du Colombier 
4947d9195a7SDavid du Colombier void
syswrite(vlong offset)4957d9195a7SDavid du Colombier syswrite(vlong offset)
4967d9195a7SDavid du Colombier {
4977d9195a7SDavid du Colombier 	int fd;
4987d9195a7SDavid du Colombier 	ulong size, a;
4997d9195a7SDavid du Colombier 	char *buf;
5007d9195a7SDavid du Colombier 	int n;
5017d9195a7SDavid du Colombier 
5027d9195a7SDavid du Colombier 	fd = getmem_w(reg.r[REGSP]+4);
5037d9195a7SDavid du Colombier 	a = getmem_w(reg.r[REGSP]+8);
5047d9195a7SDavid du Colombier 	size = getmem_w(reg.r[REGSP]+12);
5057d9195a7SDavid du Colombier 
5067d9195a7SDavid du Colombier 	Bflush(bioout);
5077d9195a7SDavid du Colombier 	buf = memio(0, a, size, MemRead);
5087d9195a7SDavid du Colombier 	n = pwrite(fd, buf, size, offset);
5097d9195a7SDavid du Colombier 	if(n < 0)
5107d9195a7SDavid du Colombier 		errstr(errbuf, sizeof errbuf);
5117d9195a7SDavid du Colombier 	if(sysdbg)
5127d9195a7SDavid du Colombier 		itrace("write(%d, %lux, %d, 0xllx) = %d", fd, a, size, offset, n);
5137d9195a7SDavid du Colombier 	free(buf);
5147d9195a7SDavid du Colombier 
5157d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
5167d9195a7SDavid du Colombier }
5177d9195a7SDavid du Colombier 
5187d9195a7SDavid du Colombier void
sys_write(void)5197d9195a7SDavid du Colombier sys_write(void)
5207d9195a7SDavid du Colombier {
5217d9195a7SDavid du Colombier 	syswrite(-1LL);
5227d9195a7SDavid du Colombier }
5237d9195a7SDavid du Colombier 
5247d9195a7SDavid du Colombier void
syspwrite(void)5257d9195a7SDavid du Colombier syspwrite(void)
5267d9195a7SDavid du Colombier {
5277d9195a7SDavid du Colombier 	union {
5287d9195a7SDavid du Colombier 		vlong v;
5297d9195a7SDavid du Colombier 		ulong u[2];
5307d9195a7SDavid du Colombier 	} o;
5317d9195a7SDavid du Colombier 
5327d9195a7SDavid du Colombier 	o.u[0] = getmem_w(reg.r[REGSP]+16);
5337d9195a7SDavid du Colombier 	o.u[1] = getmem_w(reg.r[REGSP]+20);
5347d9195a7SDavid du Colombier 	syswrite(o.v);
5357d9195a7SDavid du Colombier }
5367d9195a7SDavid du Colombier 
5377d9195a7SDavid du Colombier void
syspipe(void)5387d9195a7SDavid du Colombier syspipe(void)
5397d9195a7SDavid du Colombier {
5407d9195a7SDavid du Colombier 	int n, p[2];
5417d9195a7SDavid du Colombier 	ulong fd;
5427d9195a7SDavid du Colombier 
5437d9195a7SDavid du Colombier 	fd = getmem_w(reg.r[REGSP]+4);
5447d9195a7SDavid du Colombier 	if(sysdbg)
5457d9195a7SDavid du Colombier 		itrace("pipe(%lux)", fd);
5467d9195a7SDavid du Colombier 
5477d9195a7SDavid du Colombier 	n = pipe(p);
5487d9195a7SDavid du Colombier 	if(n < 0)
5497d9195a7SDavid du Colombier 		errstr(errbuf, sizeof errbuf);
5507d9195a7SDavid du Colombier 	else {
5517d9195a7SDavid du Colombier 		putmem_w(fd, p[0]);
5527d9195a7SDavid du Colombier 		putmem_w(fd+4, p[1]);
5537d9195a7SDavid du Colombier 	}
5547d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
5557d9195a7SDavid du Colombier }
5567d9195a7SDavid du Colombier 
5577d9195a7SDavid du Colombier void
syscreate(void)5587d9195a7SDavid du Colombier syscreate(void)
5597d9195a7SDavid du Colombier {
5607d9195a7SDavid du Colombier 	char file[1024];
5617d9195a7SDavid du Colombier 	int n;
5627d9195a7SDavid du Colombier 	ulong mode, name, perm;
5637d9195a7SDavid du Colombier 
5647d9195a7SDavid du Colombier 	name = getmem_w(reg.r[REGSP]+4);
5657d9195a7SDavid du Colombier 	mode = getmem_w(reg.r[REGSP]+8);
5667d9195a7SDavid du Colombier 	perm = getmem_w(reg.r[REGSP]+12);
5677d9195a7SDavid du Colombier 	memio(file, name, sizeof(file), MemReadstring);
5687d9195a7SDavid du Colombier 	if(sysdbg)
5697d9195a7SDavid du Colombier 		itrace("create(0x%lux='%s', 0x%lux, 0x%lux)", name, file, mode, perm);
5707d9195a7SDavid du Colombier 
5717d9195a7SDavid du Colombier 	n = create(file, mode, perm);
5727d9195a7SDavid du Colombier 	if(n < 0)
5737d9195a7SDavid du Colombier 		errstr(errbuf, sizeof errbuf);
5747d9195a7SDavid du Colombier 
5757d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
5767d9195a7SDavid du Colombier }
5777d9195a7SDavid du Colombier 
5787d9195a7SDavid du Colombier void
sysbrk_(void)5797d9195a7SDavid du Colombier sysbrk_(void)
5807d9195a7SDavid du Colombier {
5817d9195a7SDavid du Colombier 	ulong addr, osize, nsize;
5827d9195a7SDavid du Colombier 	Segment *s;
5837d9195a7SDavid du Colombier 
5847d9195a7SDavid du Colombier 	addr = getmem_w(reg.r[REGSP]+4);
5857d9195a7SDavid du Colombier 	if(sysdbg)
5867d9195a7SDavid du Colombier 		itrace("brk_(0x%lux)", addr);
5877d9195a7SDavid du Colombier 
5887d9195a7SDavid du Colombier 	reg.r[REGRET] = -1;
5897d9195a7SDavid du Colombier 	if(addr < memory.seg[Data].base+datasize) {
5907d9195a7SDavid du Colombier 		strcpy(errbuf, "address below segment");
5917d9195a7SDavid du Colombier 		return;
5927d9195a7SDavid du Colombier 	}
5937d9195a7SDavid du Colombier 	if(addr > memory.seg[Stack].base) {
5947d9195a7SDavid du Colombier 		strcpy(errbuf, "segment too big");
5957d9195a7SDavid du Colombier 		return;
5967d9195a7SDavid du Colombier 	}
5977d9195a7SDavid du Colombier 	s = &memory.seg[Bss];
5987d9195a7SDavid du Colombier 	if(addr > s->end) {
5990ce5db6cSDavid du Colombier 		osize = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
6007d9195a7SDavid du Colombier 		addr = ((addr)+(BY2PG-1))&~(BY2PG-1);
6017d9195a7SDavid du Colombier 		s->end = addr;
6020ce5db6cSDavid du Colombier 		nsize = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
6037d9195a7SDavid du Colombier 		s->table = erealloc(s->table, osize, nsize);
6047d9195a7SDavid du Colombier 	}
6057d9195a7SDavid du Colombier 
6067d9195a7SDavid du Colombier 	reg.r[REGRET] = 0;
6077d9195a7SDavid du Colombier }
6087d9195a7SDavid du Colombier 
6097d9195a7SDavid du Colombier void
sysremove(void)6107d9195a7SDavid du Colombier sysremove(void)
6117d9195a7SDavid du Colombier {
6127d9195a7SDavid du Colombier 	char nambuf[1024];
6137d9195a7SDavid du Colombier 	ulong name;
6147d9195a7SDavid du Colombier 	int n;
6157d9195a7SDavid du Colombier 
6167d9195a7SDavid du Colombier 	name = getmem_w(reg.r[REGSP]+4);
6177d9195a7SDavid du Colombier 	memio(nambuf, name, sizeof(nambuf), MemReadstring);
6187d9195a7SDavid du Colombier 	if(sysdbg)
6197d9195a7SDavid du Colombier 		itrace("remove(0x%lux='%s')", name, nambuf);
6207d9195a7SDavid du Colombier 
6217d9195a7SDavid du Colombier 	n = remove(nambuf);
6227d9195a7SDavid du Colombier 	if(n < 0)
6237d9195a7SDavid du Colombier 		errstr(errbuf, sizeof errbuf);
6247d9195a7SDavid du Colombier 	reg.r[REGRET] = n;
6257d9195a7SDavid du Colombier }
6267d9195a7SDavid du Colombier 
6277d9195a7SDavid du Colombier void
sysnotify(void)6287d9195a7SDavid du Colombier sysnotify(void)
6297d9195a7SDavid du Colombier {
6307d9195a7SDavid du Colombier 	nofunc = getmem_w(reg.r[REGSP]+4);
6317d9195a7SDavid du Colombier 	if(sysdbg)
6327d9195a7SDavid du Colombier 		itrace("notify(0x%lux)", nofunc);
6337d9195a7SDavid du Colombier 
6347d9195a7SDavid du Colombier 	reg.r[REGRET] = 0;
6357d9195a7SDavid du Colombier }
6367d9195a7SDavid du Colombier 
6377d9195a7SDavid du Colombier void
syssegflush(void)6387d9195a7SDavid du Colombier syssegflush(void)
6397d9195a7SDavid du Colombier {
6407d9195a7SDavid du Colombier 	ulong start, len;
6417d9195a7SDavid du Colombier 
6427d9195a7SDavid du Colombier 	start = getmem_w(reg.r[REGSP]+4);
6437d9195a7SDavid du Colombier 	len = getmem_w(reg.r[REGSP]+8);
6447d9195a7SDavid du Colombier 	if(sysdbg)
6457d9195a7SDavid du Colombier 		itrace("segflush(va=0x%lux, n=%lud)", start, len);
6467d9195a7SDavid du Colombier 	reg.r[REGRET] = 0;
6477d9195a7SDavid du Colombier }
6487d9195a7SDavid du Colombier 
sysfversion(void)6497d9195a7SDavid du Colombier void sysfversion(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
sysfsession(void)6507d9195a7SDavid du Colombier void sysfsession(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
sysfauth(void)6517d9195a7SDavid du Colombier void sysfauth(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
syswait(void)6527d9195a7SDavid du Colombier void syswait(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
syswstat(void)6537d9195a7SDavid du Colombier void syswstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sys_wstat(void)6547d9195a7SDavid du Colombier void sys_wstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysfwstat(void)6557d9195a7SDavid du Colombier void sysfwstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sys_fwstat(void)6567d9195a7SDavid du Colombier void sys_fwstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysnoted(void)6577d9195a7SDavid du Colombier void sysnoted(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
syssegattach(void)6587d9195a7SDavid du Colombier void syssegattach(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
syssegdetach(void)6597d9195a7SDavid du Colombier void syssegdetach(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
syssegfree(void)6607d9195a7SDavid du Colombier void syssegfree(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysrendezvous(void)6617d9195a7SDavid du Colombier void sysrendezvous(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysunmount(void)6627d9195a7SDavid du Colombier void sysunmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysfork(void)6637d9195a7SDavid du Colombier void sysfork(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysforkpgrp(void)6647d9195a7SDavid du Colombier void sysforkpgrp(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
syssegbrk(void)6657d9195a7SDavid du Colombier void syssegbrk(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
_sysmount(void)6667d9195a7SDavid du Colombier void _sysmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysalarm(void)6677d9195a7SDavid du Colombier void sysalarm(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysexec(void)6687d9195a7SDavid du Colombier void sysexec(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysmount(void)6697d9195a7SDavid du Colombier void sysmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysawait(void)6707d9195a7SDavid du Colombier void sysawait(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
6717d9195a7SDavid du Colombier 
6727d9195a7SDavid du Colombier void (*systab[])(void)	={
6737d9195a7SDavid du Colombier 	[SYSR1]		sys1,
6747d9195a7SDavid du Colombier 	[_ERRSTR]	sys_errstr,
6757d9195a7SDavid du Colombier 	[BIND]		sysbind,
6767d9195a7SDavid du Colombier 	[CHDIR]		syschdir,
6777d9195a7SDavid du Colombier 	[CLOSE]		sysclose,
6787d9195a7SDavid du Colombier 	[DUP]		sysdup,
6797d9195a7SDavid du Colombier 	[ALARM]		sysalarm,
6807d9195a7SDavid du Colombier 	[EXEC]		sysexec,
6817d9195a7SDavid du Colombier 	[EXITS]		sysexits,
6827d9195a7SDavid du Colombier 	[_FSESSION]	sysfsession,
6837d9195a7SDavid du Colombier 	[FAUTH]		sysfauth,
6847d9195a7SDavid du Colombier 	[_FSTAT]	sys_fstat,
6857d9195a7SDavid du Colombier 	[SEGBRK]	syssegbrk,
6867d9195a7SDavid du Colombier 	[_MOUNT]	_sysmount,
6877d9195a7SDavid du Colombier 	[OPEN]		sysopen,
6887d9195a7SDavid du Colombier 	[_READ]		sys_read,
6897d9195a7SDavid du Colombier 	[OSEEK]		sysoseek,
6907d9195a7SDavid du Colombier 	[SLEEP]		syssleep,
6917d9195a7SDavid du Colombier 	[_STAT]		sys_stat,
6927d9195a7SDavid du Colombier 	[RFORK]		sysrfork,
6937d9195a7SDavid du Colombier 	[_WRITE]	sys_write,
6947d9195a7SDavid du Colombier 	[PIPE]		syspipe,
6957d9195a7SDavid du Colombier 	[CREATE]	syscreate,
6967d9195a7SDavid du Colombier 	[FD2PATH]	sysfd2path,
6977d9195a7SDavid du Colombier 	[BRK_]		sysbrk_,
6987d9195a7SDavid du Colombier 	[REMOVE]	sysremove,
6997d9195a7SDavid du Colombier 	[_WSTAT]	sys_wstat,
7007d9195a7SDavid du Colombier 	[_FWSTAT]	sys_fwstat,
7017d9195a7SDavid du Colombier 	[NOTIFY]	sysnotify,
7027d9195a7SDavid du Colombier 	[NOTED]		sysnoted,
7037d9195a7SDavid du Colombier 	[SEGATTACH]	syssegattach,
7047d9195a7SDavid du Colombier 	[SEGDETACH]	syssegdetach,
7057d9195a7SDavid du Colombier 	[SEGFREE]	syssegfree,
7067d9195a7SDavid du Colombier 	[SEGFLUSH]	syssegflush,
7077d9195a7SDavid du Colombier 	[RENDEZVOUS]	sysrendezvous,
7087d9195a7SDavid du Colombier 	[UNMOUNT]	sysunmount,
7097d9195a7SDavid du Colombier 	[_WAIT]		syswait,
7107d9195a7SDavid du Colombier 	[SEEK]		sysseek,
7117d9195a7SDavid du Colombier 	[FVERSION]	sysfversion,
7127d9195a7SDavid du Colombier 	[ERRSTR]	syserrstr,
7137d9195a7SDavid du Colombier 	[STAT]		sysstat,
7147d9195a7SDavid du Colombier 	[FSTAT]		sysfstat,
7157d9195a7SDavid du Colombier 	[WSTAT]		syswstat,
7167d9195a7SDavid du Colombier 	[FWSTAT]	sysfwstat,
7177d9195a7SDavid du Colombier 	[MOUNT]		sysmount,
7187d9195a7SDavid du Colombier 	[AWAIT]		sysawait,
7197d9195a7SDavid du Colombier 	[PREAD]		syspread,
7207d9195a7SDavid du Colombier 	[PWRITE]	syspwrite,
7217d9195a7SDavid du Colombier };
7227d9195a7SDavid du Colombier 
7237d9195a7SDavid du Colombier void
sc(ulong inst)7247d9195a7SDavid du Colombier sc(ulong inst)
7257d9195a7SDavid du Colombier {
7267d9195a7SDavid du Colombier 	int call;
7277d9195a7SDavid du Colombier 
7287d9195a7SDavid du Colombier 	if(inst != ((17<<26)|2))
7297d9195a7SDavid du Colombier 		undef(inst);
7307d9195a7SDavid du Colombier 	call = reg.r[REGRET];
7317d9195a7SDavid du Colombier 	if(call < 0 || call > PWRITE || systab[call] == nil) {
7327d9195a7SDavid du Colombier 		Bprint(bioout, "Bad system call\n");
7337d9195a7SDavid du Colombier 		dumpreg();
7347d9195a7SDavid du Colombier 	}
7357d9195a7SDavid du Colombier 	if(trace)
7367d9195a7SDavid du Colombier 		itrace("sc\t(%s)", sysctab[call]);
7377d9195a7SDavid du Colombier 
7387d9195a7SDavid du Colombier 	(*systab[call])();
7397d9195a7SDavid du Colombier 	Bflush(bioout);
7407d9195a7SDavid du Colombier }
741