xref: /plan9/sys/src/cmd/5i/syscall.c (revision 514807136a8518a9c368e175000825c6e1429f43)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
47dd7cddfSDavid du Colombier #include <mach.h>
559cc4ca5SDavid du Colombier #define	EXTERN
67dd7cddfSDavid du Colombier #include "arm.h"
77dd7cddfSDavid du Colombier 
89a747e4fSDavid du Colombier #define	ODIRLEN	116	/* compatibility; used in _stat etc. */
99a747e4fSDavid du Colombier #define	OERRLEN	64	/* compatibility; used in _stat etc. */
109a747e4fSDavid du Colombier 
119a747e4fSDavid du Colombier char 	errbuf[ERRMAX];
127dd7cddfSDavid du Colombier ulong	nofunc;
137dd7cddfSDavid du Colombier 
149a747e4fSDavid du Colombier #include "/sys/src/libc/9syscall/sys.h"
159a747e4fSDavid du Colombier 
167dd7cddfSDavid du Colombier 
177dd7cddfSDavid du Colombier char*	sysctab[] =
187dd7cddfSDavid du Colombier {
197dd7cddfSDavid du Colombier 	[SYSR1]		"Running",
209a747e4fSDavid du Colombier 	[_ERRSTR]		"_errstr",
217dd7cddfSDavid du Colombier 	[BIND]		"Bind",
227dd7cddfSDavid du Colombier 	[CHDIR]		"Chdir",
237dd7cddfSDavid du Colombier 	[CLOSE]		"Close",
247dd7cddfSDavid du Colombier 	[DUP]		"Dup",
257dd7cddfSDavid du Colombier 	[ALARM]		"Alarm",
267dd7cddfSDavid du Colombier 	[EXEC]		"Exec",
277dd7cddfSDavid du Colombier 	[EXITS]		"Exits",
289a747e4fSDavid du Colombier 	[_FSESSION]	"_Fsession",
299a747e4fSDavid du Colombier 	[FAUTH]		"Fauth",
309a747e4fSDavid du Colombier 	[_FSTAT]		"_fstat",
317dd7cddfSDavid du Colombier 	[SEGBRK]		"Segbrk",
327dd7cddfSDavid du Colombier 	[MOUNT]		"Mount",
337dd7cddfSDavid du Colombier 	[OPEN]		"Open",
349a747e4fSDavid du Colombier 	[_READ]		"_Read",
359a747e4fSDavid du Colombier 	[OSEEK]		"Oseek",
367dd7cddfSDavid du Colombier 	[SLEEP]		"Sleep",
379a747e4fSDavid du Colombier 	[_STAT]		"_Stat",
389a747e4fSDavid du Colombier 	[RFORK]		"Rfork",
399a747e4fSDavid du Colombier 	[_WRITE]		"_Write",
407dd7cddfSDavid du Colombier 	[PIPE]		"Pipe",
417dd7cddfSDavid du Colombier 	[CREATE]		"Create",
429a747e4fSDavid du Colombier 	[FD2PATH]	"Fd2path",
439a747e4fSDavid du Colombier 	[BRK_]		"Brk_",
447dd7cddfSDavid du Colombier 	[REMOVE]		"Remove",
459a747e4fSDavid du Colombier 	[_WSTAT]		"_Wstat",
469a747e4fSDavid du Colombier 	[_FWSTAT]	"_Fwstat",
477dd7cddfSDavid du Colombier 	[NOTIFY]		"Notify",
487dd7cddfSDavid du Colombier 	[NOTED]		"Noted",
497dd7cddfSDavid du Colombier 	[SEGATTACH]	"Segattach",
507dd7cddfSDavid du Colombier 	[SEGDETACH]	"Segdetach",
517dd7cddfSDavid du Colombier 	[SEGFREE]		"Segfree",
527dd7cddfSDavid du Colombier 	[SEGFLUSH]	"Segflush",
539a747e4fSDavid du Colombier 	[RENDEZVOUS]	"Rendezvous",
547dd7cddfSDavid du Colombier 	[UNMOUNT]	"Unmount",
559a747e4fSDavid du Colombier 	[_WAIT]		"_Wait",
569a747e4fSDavid du Colombier 	[SEEK]		"Seek",
579a747e4fSDavid du Colombier 	[FVERSION]	"Fversion",
589a747e4fSDavid du Colombier 	[ERRSTR]		"Errstr",
599a747e4fSDavid du Colombier 	[STAT]		"Stat",
609a747e4fSDavid du Colombier 	[FSTAT]		"Fstat",
619a747e4fSDavid du Colombier 	[WSTAT]		"Wstat",
629a747e4fSDavid du Colombier 	[FWSTAT]		"Fwstat",
639a747e4fSDavid du Colombier 	[PREAD]		"Pread",
649a747e4fSDavid du Colombier 	[PWRITE]		"Pwrite",
659a747e4fSDavid du Colombier 	[AWAIT]		"Await",
667dd7cddfSDavid du Colombier };
677dd7cddfSDavid du Colombier 
687dd7cddfSDavid du Colombier void
sys1(void)697dd7cddfSDavid du Colombier sys1(void)
707dd7cddfSDavid du Colombier {
7159cc4ca5SDavid du Colombier 	Bprint(bioout, "no system call %s\n", sysctab[reg.r[1]]);
727dd7cddfSDavid du Colombier 	exits(0);
737dd7cddfSDavid du Colombier }
747dd7cddfSDavid du Colombier 
757dd7cddfSDavid du Colombier void
sys_errstr(void)769a747e4fSDavid du Colombier sys_errstr(void)
777dd7cddfSDavid du Colombier {
787dd7cddfSDavid du Colombier 	ulong str;
797dd7cddfSDavid du Colombier 
807dd7cddfSDavid du Colombier 	str = getmem_w(reg.r[13]+4);
817dd7cddfSDavid du Colombier 	if(sysdbg)
827dd7cddfSDavid du Colombier 		itrace("errstr(0x%lux)", str);
837dd7cddfSDavid du Colombier 
849a747e4fSDavid du Colombier 	memio(errbuf, str, OERRLEN, MemWrite);
857dd7cddfSDavid du Colombier 	strcpy(errbuf, "no error");
869a747e4fSDavid du Colombier 	reg.r[REGRET] = 0;
879a747e4fSDavid du Colombier 
889a747e4fSDavid du Colombier }
899a747e4fSDavid du Colombier 
909a747e4fSDavid du Colombier void
syserrstr(void)919a747e4fSDavid du Colombier syserrstr(void)
929a747e4fSDavid du Colombier {
939a747e4fSDavid du Colombier 	ulong str;
949a747e4fSDavid du Colombier 	int n;
959a747e4fSDavid du Colombier 
969a747e4fSDavid du Colombier 	str = getmem_w(reg.r[13]+4);
979a747e4fSDavid du Colombier 	n = getmem_w(reg.r[13]+8);
989a747e4fSDavid du Colombier 	if(sysdbg)
999a747e4fSDavid du Colombier 		itrace("errstr(0x%lux, 0x%lux)", str, n);
1009a747e4fSDavid du Colombier 
1019a747e4fSDavid du Colombier 	if(n > strlen(errbuf)+1)
1029a747e4fSDavid du Colombier 		n = strlen(errbuf)+1;
1039a747e4fSDavid du Colombier 	memio(errbuf, str, n, MemWrite);
1049a747e4fSDavid du Colombier 	strcpy(errbuf, "no error");
1059a747e4fSDavid du Colombier 	reg.r[REGRET] = n;
1067dd7cddfSDavid du Colombier 
1077dd7cddfSDavid du Colombier }
1087dd7cddfSDavid du Colombier void
sysbind(void)1097dd7cddfSDavid du Colombier sysbind(void)
1107dd7cddfSDavid du Colombier {
1117dd7cddfSDavid du Colombier 	ulong pname, pold, flags;
1127dd7cddfSDavid du Colombier 	char name[1024], old[1024];
1137dd7cddfSDavid du Colombier 	int n;
1147dd7cddfSDavid du Colombier 
1157dd7cddfSDavid du Colombier 	pname = getmem_w(reg.r[13]+4);
1167dd7cddfSDavid du Colombier 	pold = getmem_w(reg.r[13]+8);
1177dd7cddfSDavid du Colombier 	flags = getmem_w(reg.r[13]+12);
1187dd7cddfSDavid du Colombier 	memio(name, pname, sizeof(name), MemReadstring);
1197dd7cddfSDavid du Colombier 	memio(old, pold, sizeof(old), MemReadstring);
1207dd7cddfSDavid du Colombier 	if(sysdbg)
1217dd7cddfSDavid du Colombier 		itrace("bind(0x%lux='%s', 0x%lux='%s', 0x%lux)", name, name, old, old, flags);
1227dd7cddfSDavid du Colombier 
1237dd7cddfSDavid du Colombier 	n = bind(name, old, flags);
1247dd7cddfSDavid du Colombier 	if(n < 0)
1259a747e4fSDavid du Colombier 		errstr(errbuf, sizeof errbuf);
1267dd7cddfSDavid du Colombier 
1279a747e4fSDavid du Colombier 	reg.r[REGRET] = n;
1289a747e4fSDavid du Colombier }
1299a747e4fSDavid du Colombier 
1309a747e4fSDavid du Colombier void
sysfd2path(void)1319a747e4fSDavid du Colombier sysfd2path(void)
1329a747e4fSDavid du Colombier {
133c93608ccSDavid du Colombier 	int n;
134c93608ccSDavid du Colombier 	uint fd;
1359a747e4fSDavid du Colombier 	ulong str;
1369a747e4fSDavid du Colombier 	char buf[1024];
1379a747e4fSDavid du Colombier 
1389a747e4fSDavid du Colombier 	fd = getmem_w(reg.r[13]+4);
1399a747e4fSDavid du Colombier 	str = getmem_w(reg.r[13]+8);
1409a747e4fSDavid du Colombier 	n = getmem_w(reg.r[13]+12);
1419a747e4fSDavid du Colombier 	if(sysdbg)
1429a747e4fSDavid du Colombier 		itrace("fd2path(0x%lux, 0x%lux, 0x%lux)", fd, str, n);
1439a747e4fSDavid du Colombier 	reg.r[1] = -1;
1449a747e4fSDavid du Colombier 	if(n > sizeof buf){
1459a747e4fSDavid du Colombier 		strcpy(errbuf, "buffer too big");
1469a747e4fSDavid du Colombier 		return;
1479a747e4fSDavid du Colombier 	}
1489a747e4fSDavid du Colombier 	n = fd2path(fd, buf, sizeof buf);
1499a747e4fSDavid du Colombier 	if(n < 0)
1509a747e4fSDavid du Colombier 		errstr(buf, sizeof buf);
1519a747e4fSDavid du Colombier 	else
1529a747e4fSDavid du Colombier 		memio(errbuf, str, n, MemWrite);
1539a747e4fSDavid du Colombier 	reg.r[REGRET] = n;
1549a747e4fSDavid du Colombier 
1557dd7cddfSDavid du Colombier }
1567dd7cddfSDavid du Colombier 
1577dd7cddfSDavid du Colombier void
syschdir(void)1587dd7cddfSDavid du Colombier syschdir(void)
1597dd7cddfSDavid du Colombier {
1607dd7cddfSDavid du Colombier 	char file[1024];
1617dd7cddfSDavid du Colombier 	int n;
1627dd7cddfSDavid du Colombier 	ulong name;
1637dd7cddfSDavid du Colombier 
1647dd7cddfSDavid du Colombier 	name = getmem_w(reg.r[13]+4);
1657dd7cddfSDavid du Colombier 	memio(file, name, sizeof(file), MemReadstring);
1667dd7cddfSDavid du Colombier 	if(sysdbg)
1677dd7cddfSDavid du Colombier 		itrace("chdir(0x%lux='%s', 0x%lux)", name, file);
1687dd7cddfSDavid du Colombier 
1697dd7cddfSDavid du Colombier 	n = chdir(file);
1707dd7cddfSDavid du Colombier 	if(n < 0)
1719a747e4fSDavid du Colombier 		errstr(errbuf, sizeof errbuf);
1727dd7cddfSDavid du Colombier 
1739a747e4fSDavid du Colombier 	reg.r[REGRET] = n;
1747dd7cddfSDavid du Colombier }
1757dd7cddfSDavid du Colombier 
1767dd7cddfSDavid du Colombier void
sysclose(void)1777dd7cddfSDavid du Colombier sysclose(void)
1787dd7cddfSDavid du Colombier {
1797dd7cddfSDavid du Colombier 	int n;
1807dd7cddfSDavid du Colombier 	ulong fd;
1817dd7cddfSDavid du Colombier 
1827dd7cddfSDavid du Colombier 	fd = getmem_w(reg.r[13]+4);
1837dd7cddfSDavid du Colombier 	if(sysdbg)
1847dd7cddfSDavid du Colombier 		itrace("close(%d)", fd);
1857dd7cddfSDavid du Colombier 
1867dd7cddfSDavid du Colombier 	n = close(fd);
1877dd7cddfSDavid du Colombier 	if(n < 0)
1889a747e4fSDavid du Colombier 		errstr(errbuf, sizeof errbuf);
1899a747e4fSDavid du Colombier 	reg.r[REGRET] = n;
1907dd7cddfSDavid du Colombier }
1917dd7cddfSDavid du Colombier 
1927dd7cddfSDavid du Colombier void
sysdup(void)1937dd7cddfSDavid du Colombier sysdup(void)
1947dd7cddfSDavid du Colombier {
1957dd7cddfSDavid du Colombier 	int oldfd, newfd;
1967dd7cddfSDavid du Colombier 	int n;
1977dd7cddfSDavid du Colombier 
1987dd7cddfSDavid du Colombier 	oldfd = getmem_w(reg.r[13]+4);
1997dd7cddfSDavid du Colombier 	newfd = getmem_w(reg.r[13]+8);
2007dd7cddfSDavid du Colombier 	if(sysdbg)
2017dd7cddfSDavid du Colombier 		itrace("dup(%d, %d)", oldfd, newfd);
2027dd7cddfSDavid du Colombier 
2037dd7cddfSDavid du Colombier 	n = dup(oldfd, newfd);
2047dd7cddfSDavid du Colombier 	if(n < 0)
2059a747e4fSDavid du Colombier 		errstr(errbuf, sizeof errbuf);
20680ee5cbfSDavid du Colombier 	reg.r[REGRET] = n;
2077dd7cddfSDavid du Colombier }
2087dd7cddfSDavid du Colombier 
2097dd7cddfSDavid du Colombier void
sysexits(void)2107dd7cddfSDavid du Colombier sysexits(void)
2117dd7cddfSDavid du Colombier {
2129a747e4fSDavid du Colombier 	char buf[OERRLEN];
2137dd7cddfSDavid du Colombier 	ulong str;
2147dd7cddfSDavid du Colombier 
2157dd7cddfSDavid du Colombier 	str = getmem_w(reg.r[13]+4);
2167dd7cddfSDavid du Colombier 	if(sysdbg)
2177dd7cddfSDavid du Colombier 		itrace("exits(0x%lux)", str);
2187dd7cddfSDavid du Colombier 
2197dd7cddfSDavid du Colombier 	count = 1;
2207dd7cddfSDavid du Colombier 	if(str != 0) {
2219a747e4fSDavid du Colombier 		memio(buf, str, sizeof buf, MemRead);
2227dd7cddfSDavid du Colombier 		Bprint(bioout, "exits(%s)\n", buf);
2237dd7cddfSDavid du Colombier 	}
2247dd7cddfSDavid du Colombier 	else
2257dd7cddfSDavid du Colombier 		Bprint(bioout, "exits(0)\n");
2267dd7cddfSDavid du Colombier }
2277dd7cddfSDavid du Colombier 
2287dd7cddfSDavid du Colombier void
sysopen(void)2297dd7cddfSDavid du Colombier sysopen(void)
2307dd7cddfSDavid du Colombier {
2317dd7cddfSDavid du Colombier 	char file[1024];
2327dd7cddfSDavid du Colombier 	int n;
2337dd7cddfSDavid du Colombier 	ulong mode, name;
2347dd7cddfSDavid du Colombier 
2357dd7cddfSDavid du Colombier 	name = getmem_w(reg.r[13]+4);
2367dd7cddfSDavid du Colombier 	mode = getmem_w(reg.r[13]+8);
2377dd7cddfSDavid du Colombier 	memio(file, name, sizeof(file), MemReadstring);
2387dd7cddfSDavid du Colombier 
2397dd7cddfSDavid du Colombier 	n = open(file, mode);
2407dd7cddfSDavid du Colombier 	if(n < 0)
2419a747e4fSDavid du Colombier 		errstr(errbuf, sizeof errbuf);
2427dd7cddfSDavid du Colombier 
24380ee5cbfSDavid du Colombier 	if(sysdbg)
24480ee5cbfSDavid du Colombier 		itrace("open(0x%lux='%s', 0x%lux) = %d", name, file, mode, n);
24580ee5cbfSDavid du Colombier 
24680ee5cbfSDavid du Colombier 	reg.r[REGRET] = n;
2477dd7cddfSDavid du Colombier };
2487dd7cddfSDavid du Colombier 
2499a747e4fSDavid du Colombier 
2507dd7cddfSDavid du Colombier void
sysread(vlong offset)2519a747e4fSDavid du Colombier sysread(vlong offset)
2527dd7cddfSDavid du Colombier {
2537dd7cddfSDavid du Colombier 	int fd;
2547dd7cddfSDavid du Colombier 	ulong size, a;
2557dd7cddfSDavid du Colombier 	char *buf, *p;
2567dd7cddfSDavid du Colombier 	int n, cnt, c;
2577dd7cddfSDavid du Colombier 
2587dd7cddfSDavid du Colombier 	fd = getmem_w(reg.r[13]+4);
2597dd7cddfSDavid du Colombier 	a = getmem_w(reg.r[13]+8);
2607dd7cddfSDavid du Colombier 	size = getmem_w(reg.r[13]+12);
2617dd7cddfSDavid du Colombier 
2627dd7cddfSDavid du Colombier 	buf = emalloc(size);
2637dd7cddfSDavid du Colombier 	if(fd == 0) {
2647dd7cddfSDavid du Colombier 		print("\nstdin>>");
2657dd7cddfSDavid du Colombier 		p = buf;
2667dd7cddfSDavid du Colombier 		n = 0;
2677dd7cddfSDavid du Colombier 		cnt = size;
2687dd7cddfSDavid du Colombier 		while(cnt) {
2697dd7cddfSDavid du Colombier 			c = Bgetc(bin);
2707dd7cddfSDavid du Colombier 			if(c <= 0)
2717dd7cddfSDavid du Colombier 				break;
2727dd7cddfSDavid du Colombier 			*p++ = c;
2737dd7cddfSDavid du Colombier 			n++;
2747dd7cddfSDavid du Colombier 			cnt--;
2757dd7cddfSDavid du Colombier 			if(c == '\n')
2767dd7cddfSDavid du Colombier 				break;
2777dd7cddfSDavid du Colombier 		}
2787dd7cddfSDavid du Colombier 	}
2797dd7cddfSDavid du Colombier 	else
2809a747e4fSDavid du Colombier 		n = pread(fd, buf, size, offset);
2817dd7cddfSDavid du Colombier 
2827dd7cddfSDavid du Colombier 	if(n < 0)
2839a747e4fSDavid du Colombier 		errstr(errbuf, sizeof errbuf);
2847dd7cddfSDavid du Colombier 	else
2857dd7cddfSDavid du Colombier 		memio(buf, a, n, MemWrite);
2867dd7cddfSDavid du Colombier 
2877dd7cddfSDavid du Colombier 	if(sysdbg)
2889a747e4fSDavid du Colombier 		itrace("read(%d, 0x%lux, %d, 0x%llx) = %d", fd, a, size, offset, n);
2897dd7cddfSDavid du Colombier 
2907dd7cddfSDavid du Colombier 	free(buf);
29180ee5cbfSDavid du Colombier 	reg.r[REGRET] = n;
2927dd7cddfSDavid du Colombier }
2937dd7cddfSDavid du Colombier 
2947dd7cddfSDavid du Colombier void
sys_read(void)2959a747e4fSDavid du Colombier sys_read(void)
2969a747e4fSDavid du Colombier {
2979a747e4fSDavid du Colombier 	sysread(-1LL);
2989a747e4fSDavid du Colombier }
2999a747e4fSDavid du Colombier 
3009a747e4fSDavid du Colombier void
syspread(void)3019a747e4fSDavid du Colombier syspread(void)
3029a747e4fSDavid du Colombier {
303*51480713SDavid du Colombier 	sysread(getmem_v(reg.r[13]+16));
3049a747e4fSDavid du Colombier }
3059a747e4fSDavid du Colombier 
3069a747e4fSDavid du Colombier void
sysseek(void)3077dd7cddfSDavid du Colombier sysseek(void)
3087dd7cddfSDavid du Colombier {
3099a747e4fSDavid du Colombier 	int fd;
3109a747e4fSDavid du Colombier 	ulong mode;
3119a747e4fSDavid du Colombier 	ulong retp;
3129a747e4fSDavid du Colombier 	vlong v;
3139a747e4fSDavid du Colombier 
3149a747e4fSDavid du Colombier 	retp = getmem_w(reg.r[13]+4);
3159a747e4fSDavid du Colombier 	fd = getmem_w(reg.r[13]+8);
316*51480713SDavid du Colombier 	v = getmem_v(reg.r[13]+16);
3179a747e4fSDavid du Colombier 	mode = getmem_w(reg.r[13]+20);
3189a747e4fSDavid du Colombier 	if(sysdbg)
319*51480713SDavid du Colombier 		itrace("seek(%d, %lld, %d)", fd, v, mode);
3209a747e4fSDavid du Colombier 
321*51480713SDavid du Colombier 	v = seek(fd, v, mode);
322*51480713SDavid du Colombier 	if(v < 0)
3239a747e4fSDavid du Colombier 		errstr(errbuf, sizeof errbuf);
3249a747e4fSDavid du Colombier 
325*51480713SDavid du Colombier 	putmem_v(retp, v);
3269a747e4fSDavid du Colombier }
3279a747e4fSDavid du Colombier 
3289a747e4fSDavid du Colombier void
sysoseek(void)3299a747e4fSDavid du Colombier sysoseek(void)
3309a747e4fSDavid du Colombier {
3317dd7cddfSDavid du Colombier 	int fd, n;
3327dd7cddfSDavid du Colombier 	ulong off, mode;
3337dd7cddfSDavid du Colombier 
3347dd7cddfSDavid du Colombier 	fd = getmem_w(reg.r[13]+4);
3357dd7cddfSDavid du Colombier 	off = getmem_w(reg.r[13]+8);
3367dd7cddfSDavid du Colombier 	mode = getmem_w(reg.r[13]+12);
3377dd7cddfSDavid du Colombier 	if(sysdbg)
3387dd7cddfSDavid du Colombier 		itrace("seek(%d, %lud, %d)", fd, off, mode);
3397dd7cddfSDavid du Colombier 
3407dd7cddfSDavid du Colombier 	n = seek(fd, off, mode);
3417dd7cddfSDavid du Colombier 	if(n < 0)
3429a747e4fSDavid du Colombier 		errstr(errbuf, sizeof errbuf);
3437dd7cddfSDavid du Colombier 
34480ee5cbfSDavid du Colombier 	reg.r[REGRET] = n;
3457dd7cddfSDavid du Colombier }
3467dd7cddfSDavid du Colombier 
3477dd7cddfSDavid du Colombier void
syssleep(void)3487dd7cddfSDavid du Colombier syssleep(void)
3497dd7cddfSDavid du Colombier {
3507dd7cddfSDavid du Colombier 	ulong len;
3517dd7cddfSDavid du Colombier 	int n;
3527dd7cddfSDavid du Colombier 
3537dd7cddfSDavid du Colombier 	len = getmem_w(reg.r[13]+4);
3547dd7cddfSDavid du Colombier 	if(sysdbg)
3557dd7cddfSDavid du Colombier 		itrace("sleep(%d)", len);
3567dd7cddfSDavid du Colombier 
3577dd7cddfSDavid du Colombier 	n = sleep(len);
3587dd7cddfSDavid du Colombier 	if(n < 0)
3599a747e4fSDavid du Colombier 		errstr(errbuf, sizeof errbuf);
3607dd7cddfSDavid du Colombier 
36180ee5cbfSDavid du Colombier 	reg.r[REGRET] = n;
3627dd7cddfSDavid du Colombier }
3637dd7cddfSDavid du Colombier 
3647dd7cddfSDavid du Colombier void
sys_stat(void)3659a747e4fSDavid du Colombier sys_stat(void)
3667dd7cddfSDavid du Colombier {
3677dd7cddfSDavid du Colombier 	char nambuf[1024];
3689a747e4fSDavid du Colombier 	char buf[ODIRLEN];
3697dd7cddfSDavid du Colombier 	ulong edir, name;
3709a747e4fSDavid du Colombier 	extern int _stat(char*, char*);	/* old system call */
3717dd7cddfSDavid du Colombier 	int n;
3727dd7cddfSDavid du Colombier 
3737dd7cddfSDavid du Colombier 	name = getmem_w(reg.r[13]+4);
3747dd7cddfSDavid du Colombier 	edir = getmem_w(reg.r[13]+8);
3757dd7cddfSDavid du Colombier 	memio(nambuf, name, sizeof(nambuf), MemReadstring);
3767dd7cddfSDavid du Colombier 	if(sysdbg)
3777dd7cddfSDavid du Colombier 		itrace("stat(0x%lux='%s', 0x%lux)", name, nambuf, edir);
3787dd7cddfSDavid du Colombier 
3799a747e4fSDavid du Colombier 	n = _stat(nambuf, buf);
3807dd7cddfSDavid du Colombier 	if(n < 0)
3819a747e4fSDavid du Colombier 		errstr(errbuf, sizeof errbuf);
3827dd7cddfSDavid du Colombier 	else
3839a747e4fSDavid du Colombier 		memio(buf, edir, ODIRLEN, MemWrite);
3847dd7cddfSDavid du Colombier 
38580ee5cbfSDavid du Colombier 	reg.r[REGRET] = n;
3867dd7cddfSDavid du Colombier }
3877dd7cddfSDavid du Colombier 
3887dd7cddfSDavid du Colombier void
sysstat(void)3899a747e4fSDavid du Colombier sysstat(void)
3907dd7cddfSDavid du Colombier {
3919a747e4fSDavid du Colombier 	char nambuf[1024];
3929a747e4fSDavid du Colombier 	uchar buf[STATMAX];
3939a747e4fSDavid du Colombier 	ulong edir, name;
3949a747e4fSDavid du Colombier 	int n;
3959a747e4fSDavid du Colombier 
3969a747e4fSDavid du Colombier 	name = getmem_w(reg.r[13]+4);
3979a747e4fSDavid du Colombier 	edir = getmem_w(reg.r[13]+8);
3989a747e4fSDavid du Colombier 	n = getmem_w(reg.r[13]+12);
3999a747e4fSDavid du Colombier 	memio(nambuf, name, sizeof(nambuf), MemReadstring);
4009a747e4fSDavid du Colombier 	if(sysdbg)
4019a747e4fSDavid du Colombier 		itrace("stat(0x%lux='%s', 0x%lux, 0x%lux)", name, nambuf, edir, n);
4029a747e4fSDavid du Colombier 	if(n > sizeof buf)
4039a747e4fSDavid du Colombier 		errstr(errbuf, sizeof errbuf);
4049a747e4fSDavid du Colombier 	else{
4059a747e4fSDavid du Colombier 		n = stat(nambuf, buf, n);
4069a747e4fSDavid du Colombier 		if(n < 0)
4079a747e4fSDavid du Colombier 			errstr(errbuf, sizeof errbuf);
4089a747e4fSDavid du Colombier 		else
4099a747e4fSDavid du Colombier 			memio((char*)buf, edir, n, MemWrite);
4109a747e4fSDavid du Colombier 	}
4119a747e4fSDavid du Colombier 	reg.r[REGRET] = n;
4129a747e4fSDavid du Colombier }
4139a747e4fSDavid du Colombier 
4149a747e4fSDavid du Colombier void
sys_fstat(void)4159a747e4fSDavid du Colombier sys_fstat(void)
4169a747e4fSDavid du Colombier {
4179a747e4fSDavid du Colombier 	char buf[ODIRLEN];
4189a747e4fSDavid du Colombier 	extern int _fstat(int, char*);	/* old system call */
4197dd7cddfSDavid du Colombier 	ulong edir;
4207dd7cddfSDavid du Colombier 	int n, fd;
4217dd7cddfSDavid du Colombier 
4227dd7cddfSDavid du Colombier 	fd = getmem_w(reg.r[13]+4);
4237dd7cddfSDavid du Colombier 	edir = getmem_w(reg.r[13]+8);
4247dd7cddfSDavid du Colombier 	if(sysdbg)
4257dd7cddfSDavid du Colombier 		itrace("fstat(%d, 0x%lux)", fd, edir);
4267dd7cddfSDavid du Colombier 
4279a747e4fSDavid du Colombier 	n = _fstat(fd, buf);
4287dd7cddfSDavid du Colombier 	if(n < 0)
4299a747e4fSDavid du Colombier 		errstr(errbuf, sizeof errbuf);
4307dd7cddfSDavid du Colombier 	else
4319a747e4fSDavid du Colombier 		memio(buf, edir, ODIRLEN, MemWrite);
4327dd7cddfSDavid du Colombier 
43380ee5cbfSDavid du Colombier 	reg.r[REGRET] = n;
4347dd7cddfSDavid du Colombier }
4357dd7cddfSDavid du Colombier 
4367dd7cddfSDavid du Colombier void
sysfstat(void)4379a747e4fSDavid du Colombier sysfstat(void)
4389a747e4fSDavid du Colombier {
4399a747e4fSDavid du Colombier 	uchar buf[STATMAX];
4409a747e4fSDavid du Colombier 	ulong edir;
4419a747e4fSDavid du Colombier 	int n, fd;
4429a747e4fSDavid du Colombier 
4439a747e4fSDavid du Colombier 	fd = getmem_w(reg.r[13]+4);
4449a747e4fSDavid du Colombier 	edir = getmem_w(reg.r[13]+8);
4459a747e4fSDavid du Colombier 	n = getmem_w(reg.r[13]+12);
4469a747e4fSDavid du Colombier 	if(sysdbg)
4479a747e4fSDavid du Colombier 		itrace("fstat(%d, 0x%lux, 0x%lux)", fd, edir, n);
4489a747e4fSDavid du Colombier 
4499a747e4fSDavid du Colombier 	reg.r[REGRET] = -1;
4509a747e4fSDavid du Colombier 	if(n > sizeof buf){
4519a747e4fSDavid du Colombier 		strcpy(errbuf, "stat buffer too big");
4529a747e4fSDavid du Colombier 		return;
4539a747e4fSDavid du Colombier 	}
4549a747e4fSDavid du Colombier 	n = fstat(fd, buf, n);
4559a747e4fSDavid du Colombier 	if(n < 0)
4569a747e4fSDavid du Colombier 		errstr(errbuf, sizeof errbuf);
4579a747e4fSDavid du Colombier 	else
4589a747e4fSDavid du Colombier 		memio((char*)buf, edir, n, MemWrite);
4599a747e4fSDavid du Colombier 	reg.r[REGRET] = n;
4609a747e4fSDavid du Colombier }
4619a747e4fSDavid du Colombier 
4629a747e4fSDavid du Colombier void
syswrite(vlong offset)4639a747e4fSDavid du Colombier syswrite(vlong offset)
4647dd7cddfSDavid du Colombier {
4657dd7cddfSDavid du Colombier 	int fd;
4667dd7cddfSDavid du Colombier 	ulong size, a;
4677dd7cddfSDavid du Colombier 	char *buf;
4687dd7cddfSDavid du Colombier 	int n;
4697dd7cddfSDavid du Colombier 
4707dd7cddfSDavid du Colombier 	fd = getmem_w(reg.r[13]+4);
4717dd7cddfSDavid du Colombier 	a = getmem_w(reg.r[13]+8);
4727dd7cddfSDavid du Colombier 	size = getmem_w(reg.r[13]+12);
4739a747e4fSDavid du Colombier 
4749a747e4fSDavid du Colombier 	Bflush(bioout);
4757dd7cddfSDavid du Colombier 	buf = memio(0, a, size, MemRead);
4769a747e4fSDavid du Colombier 	n = pwrite(fd, buf, size, offset);
4777dd7cddfSDavid du Colombier 	if(n < 0)
4789a747e4fSDavid du Colombier 		errstr(errbuf, sizeof errbuf);
4799a747e4fSDavid du Colombier 
4809a747e4fSDavid du Colombier 	if(sysdbg)
4819a747e4fSDavid du Colombier 		itrace("write(%d, %lux, %d, 0x%llx) = %d", fd, a, size, offset, n);
4829a747e4fSDavid du Colombier 
4837dd7cddfSDavid du Colombier 	free(buf);
4847dd7cddfSDavid du Colombier 
48580ee5cbfSDavid du Colombier 	reg.r[REGRET] = n;
4867dd7cddfSDavid du Colombier }
4877dd7cddfSDavid du Colombier 
4887dd7cddfSDavid du Colombier void
sys_write(void)4899a747e4fSDavid du Colombier sys_write(void)
4909a747e4fSDavid du Colombier {
4919a747e4fSDavid du Colombier 	syswrite(-1LL);
4929a747e4fSDavid du Colombier }
4939a747e4fSDavid du Colombier 
4949a747e4fSDavid du Colombier void
syspwrite(void)4959a747e4fSDavid du Colombier syspwrite(void)
4969a747e4fSDavid du Colombier {
497*51480713SDavid du Colombier 	syswrite(getmem_v(reg.r[13]+16));
4989a747e4fSDavid du Colombier }
4999a747e4fSDavid du Colombier 
5009a747e4fSDavid du Colombier void
syspipe(void)5017dd7cddfSDavid du Colombier syspipe(void)
5027dd7cddfSDavid du Colombier {
5037dd7cddfSDavid du Colombier 	int n, p[2];
5047dd7cddfSDavid du Colombier 	ulong fd;
5057dd7cddfSDavid du Colombier 
5067dd7cddfSDavid du Colombier 	fd = getmem_w(reg.r[13]+4);
5077dd7cddfSDavid du Colombier 	if(sysdbg)
5087dd7cddfSDavid du Colombier 		itrace("pipe(%lux)", fd);
5097dd7cddfSDavid du Colombier 
5107dd7cddfSDavid du Colombier 	n = pipe(p);
5117dd7cddfSDavid du Colombier 	if(n < 0)
5129a747e4fSDavid du Colombier 		errstr(errbuf, sizeof errbuf);
5137dd7cddfSDavid du Colombier 	else {
5147dd7cddfSDavid du Colombier 		putmem_w(fd, p[0]);
5157dd7cddfSDavid du Colombier 		putmem_w(fd+4, p[1]);
5167dd7cddfSDavid du Colombier 	}
51780ee5cbfSDavid du Colombier 	reg.r[REGRET] = n;
5187dd7cddfSDavid du Colombier }
5197dd7cddfSDavid du Colombier 
5207dd7cddfSDavid du Colombier void
syscreate(void)5217dd7cddfSDavid du Colombier syscreate(void)
5227dd7cddfSDavid du Colombier {
5237dd7cddfSDavid du Colombier 	char file[1024];
5247dd7cddfSDavid du Colombier 	int n;
5257dd7cddfSDavid du Colombier 	ulong mode, name, perm;
5267dd7cddfSDavid du Colombier 
5277dd7cddfSDavid du Colombier 	name = getmem_w(reg.r[13]+4);
5287dd7cddfSDavid du Colombier 	mode = getmem_w(reg.r[13]+8);
5297dd7cddfSDavid du Colombier 	perm = getmem_w(reg.r[13]+12);
5307dd7cddfSDavid du Colombier 	memio(file, name, sizeof(file), MemReadstring);
5317dd7cddfSDavid du Colombier 	if(sysdbg)
5327dd7cddfSDavid du Colombier 		itrace("create(0x%lux='%s', 0x%lux, 0x%lux)", name, file, mode, perm);
5337dd7cddfSDavid du Colombier 
5347dd7cddfSDavid du Colombier 	n = create(file, mode, perm);
5357dd7cddfSDavid du Colombier 	if(n < 0)
5369a747e4fSDavid du Colombier 		errstr(errbuf, sizeof errbuf);
5377dd7cddfSDavid du Colombier 
53880ee5cbfSDavid du Colombier 	reg.r[REGRET] = n;
5397dd7cddfSDavid du Colombier }
5407dd7cddfSDavid du Colombier 
5417dd7cddfSDavid du Colombier void
sysbrk_(void)5427dd7cddfSDavid du Colombier sysbrk_(void)
5437dd7cddfSDavid du Colombier {
5447dd7cddfSDavid du Colombier 	ulong addr, osize, nsize;
5457dd7cddfSDavid du Colombier 	Segment *s;
5467dd7cddfSDavid du Colombier 
5477dd7cddfSDavid du Colombier 	addr = getmem_w(reg.r[13]+4);
5487dd7cddfSDavid du Colombier 	if(sysdbg)
5497dd7cddfSDavid du Colombier 		itrace("brk_(0x%lux)", addr);
5507dd7cddfSDavid du Colombier 
55180ee5cbfSDavid du Colombier 	reg.r[REGRET] = -1;
5527dd7cddfSDavid du Colombier 	if(addr < memory.seg[Data].base+datasize) {
5537dd7cddfSDavid du Colombier 		strcpy(errbuf, "address below segment");
5547dd7cddfSDavid du Colombier 		return;
5557dd7cddfSDavid du Colombier 	}
5567dd7cddfSDavid du Colombier 	if(addr > memory.seg[Stack].base) {
5577dd7cddfSDavid du Colombier 		strcpy(errbuf, "segment too big");
5587dd7cddfSDavid du Colombier 		return;
5597dd7cddfSDavid du Colombier 	}
5607dd7cddfSDavid du Colombier 	s = &memory.seg[Bss];
5617dd7cddfSDavid du Colombier 	if(addr > s->end) {
5620ce5db6cSDavid du Colombier 		osize = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
5637dd7cddfSDavid du Colombier 		addr = ((addr)+(BY2PG-1))&~(BY2PG-1);
5647dd7cddfSDavid du Colombier 		s->end = addr;
5650ce5db6cSDavid du Colombier 		nsize = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
5667dd7cddfSDavid du Colombier 		s->table = erealloc(s->table, osize, nsize);
5677dd7cddfSDavid du Colombier 	}
5687dd7cddfSDavid du Colombier 
56980ee5cbfSDavid du Colombier 	reg.r[REGRET] = 0;
5707dd7cddfSDavid du Colombier }
5717dd7cddfSDavid du Colombier 
5727dd7cddfSDavid du Colombier void
sysremove(void)5737dd7cddfSDavid du Colombier sysremove(void)
5747dd7cddfSDavid du Colombier {
5757dd7cddfSDavid du Colombier 	char nambuf[1024];
5767dd7cddfSDavid du Colombier 	ulong name;
5777dd7cddfSDavid du Colombier 	int n;
5787dd7cddfSDavid du Colombier 
5797dd7cddfSDavid du Colombier 	name = getmem_w(reg.r[13]+4);
5807dd7cddfSDavid du Colombier 	memio(nambuf, name, sizeof(nambuf), MemReadstring);
5817dd7cddfSDavid du Colombier 	if(sysdbg)
5827dd7cddfSDavid du Colombier 		itrace("remove(0x%lux='%s')", name, nambuf);
5837dd7cddfSDavid du Colombier 
5847dd7cddfSDavid du Colombier 	n = remove(nambuf);
5857dd7cddfSDavid du Colombier 	if(n < 0)
5869a747e4fSDavid du Colombier 		errstr(errbuf, sizeof errbuf);
58780ee5cbfSDavid du Colombier 	reg.r[REGRET] = n;
5887dd7cddfSDavid du Colombier }
5897dd7cddfSDavid du Colombier 
5907dd7cddfSDavid du Colombier void
sysnotify(void)5917dd7cddfSDavid du Colombier sysnotify(void)
5927dd7cddfSDavid du Colombier {
5937dd7cddfSDavid du Colombier 	nofunc = getmem_w(reg.r[13]+4);
5947dd7cddfSDavid du Colombier 	if(sysdbg)
5957dd7cddfSDavid du Colombier 		itrace("notify(0x%lux)\n", nofunc);
5967dd7cddfSDavid du Colombier 
59780ee5cbfSDavid du Colombier 	reg.r[REGRET] = 0;
5987dd7cddfSDavid du Colombier }
5997dd7cddfSDavid du Colombier 
6007dd7cddfSDavid du Colombier void
sys_wait(void)6019a747e4fSDavid du Colombier sys_wait(void)
6029a747e4fSDavid du Colombier {
6039a747e4fSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
6049a747e4fSDavid du Colombier 	exits(0);
6059a747e4fSDavid du Colombier }
6069a747e4fSDavid du Colombier void
sysawait(void)6079a747e4fSDavid du Colombier sysawait(void)
6087dd7cddfSDavid du Colombier {
60980ee5cbfSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
6107dd7cddfSDavid du Colombier 	exits(0);
6117dd7cddfSDavid du Colombier }
6127dd7cddfSDavid du Colombier void
sysrfork(void)6137dd7cddfSDavid du Colombier sysrfork(void)
6147dd7cddfSDavid du Colombier {
61580ee5cbfSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
6167dd7cddfSDavid du Colombier 	exits(0);
6177dd7cddfSDavid du Colombier }
6187dd7cddfSDavid du Colombier void
syswstat(void)6197dd7cddfSDavid du Colombier syswstat(void)
6207dd7cddfSDavid du Colombier {
62180ee5cbfSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
6227dd7cddfSDavid du Colombier 	exits(0);
6237dd7cddfSDavid du Colombier }
6247dd7cddfSDavid du Colombier void
sys_wstat(void)6259a747e4fSDavid du Colombier sys_wstat(void)
6269a747e4fSDavid du Colombier {
6279a747e4fSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
6289a747e4fSDavid du Colombier 	exits(0);
6299a747e4fSDavid du Colombier }
6309a747e4fSDavid du Colombier void
sysfwstat(void)6317dd7cddfSDavid du Colombier sysfwstat(void)
6327dd7cddfSDavid du Colombier {
63380ee5cbfSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
6347dd7cddfSDavid du Colombier 	exits(0);
6357dd7cddfSDavid du Colombier }
6367dd7cddfSDavid du Colombier void
sys_fwstat(void)6379a747e4fSDavid du Colombier sys_fwstat(void)
6389a747e4fSDavid du Colombier {
6399a747e4fSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
6409a747e4fSDavid du Colombier 	exits(0);
6419a747e4fSDavid du Colombier }
6429a747e4fSDavid du Colombier void
sysnoted(void)6437dd7cddfSDavid du Colombier sysnoted(void)
6447dd7cddfSDavid du Colombier {
64580ee5cbfSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
6467dd7cddfSDavid du Colombier 	exits(0);
6477dd7cddfSDavid du Colombier }
6487dd7cddfSDavid du Colombier void
syssegattach(void)6497dd7cddfSDavid du Colombier syssegattach(void)
6507dd7cddfSDavid du Colombier {
65180ee5cbfSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
6527dd7cddfSDavid du Colombier 	exits(0);
6537dd7cddfSDavid du Colombier }
6547dd7cddfSDavid du Colombier void
syssegdetach(void)6557dd7cddfSDavid du Colombier syssegdetach(void)
6567dd7cddfSDavid du Colombier {
65780ee5cbfSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
6587dd7cddfSDavid du Colombier 	exits(0);
6597dd7cddfSDavid du Colombier }
6607dd7cddfSDavid du Colombier void
syssegfree(void)6617dd7cddfSDavid du Colombier syssegfree(void)
6627dd7cddfSDavid du Colombier {
66380ee5cbfSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
6647dd7cddfSDavid du Colombier 	exits(0);
6657dd7cddfSDavid du Colombier }
6667dd7cddfSDavid du Colombier void
syssegflush(void)6677dd7cddfSDavid du Colombier syssegflush(void)
6687dd7cddfSDavid du Colombier {
66980ee5cbfSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
6707dd7cddfSDavid du Colombier 	exits(0);
6717dd7cddfSDavid du Colombier }
6727dd7cddfSDavid du Colombier void
sysrendezvous(void)6737dd7cddfSDavid du Colombier sysrendezvous(void)
6747dd7cddfSDavid du Colombier {
67580ee5cbfSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
6767dd7cddfSDavid du Colombier 	exits(0);
6777dd7cddfSDavid du Colombier }
6787dd7cddfSDavid du Colombier void
sysunmount(void)6797dd7cddfSDavid du Colombier sysunmount(void)
6807dd7cddfSDavid du Colombier {
68180ee5cbfSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
6827dd7cddfSDavid du Colombier 	exits(0);
6837dd7cddfSDavid du Colombier }
6847dd7cddfSDavid du Colombier void
sysfork(void)6857dd7cddfSDavid du Colombier sysfork(void)
6867dd7cddfSDavid du Colombier {
68780ee5cbfSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
6887dd7cddfSDavid du Colombier 	exits(0);
6897dd7cddfSDavid du Colombier }
6907dd7cddfSDavid du Colombier void
sysforkpgrp(void)6917dd7cddfSDavid du Colombier sysforkpgrp(void)
6927dd7cddfSDavid du Colombier {
69380ee5cbfSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
6947dd7cddfSDavid du Colombier 	exits(0);
6957dd7cddfSDavid du Colombier }
6967dd7cddfSDavid du Colombier void
syssegbrk(void)6977dd7cddfSDavid du Colombier syssegbrk(void)
6987dd7cddfSDavid du Colombier {
69980ee5cbfSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
7007dd7cddfSDavid du Colombier 	exits(0);
7017dd7cddfSDavid du Colombier }
7027dd7cddfSDavid du Colombier void
sysmount(void)7037dd7cddfSDavid du Colombier sysmount(void)
7047dd7cddfSDavid du Colombier {
70580ee5cbfSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
7067dd7cddfSDavid du Colombier 	exits(0);
7077dd7cddfSDavid du Colombier }
7087dd7cddfSDavid du Colombier void
sysalarm(void)7097dd7cddfSDavid du Colombier sysalarm(void)
7107dd7cddfSDavid du Colombier {
71180ee5cbfSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
7127dd7cddfSDavid du Colombier 	exits(0);
7137dd7cddfSDavid du Colombier }
7147dd7cddfSDavid du Colombier void
sysexec(void)7157dd7cddfSDavid du Colombier sysexec(void)
7167dd7cddfSDavid du Colombier {
71780ee5cbfSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
7187dd7cddfSDavid du Colombier  	exits(0);
7197dd7cddfSDavid du Colombier }
7209a747e4fSDavid du Colombier void
sys_fsession(void)7219a747e4fSDavid du Colombier sys_fsession(void)
7229a747e4fSDavid du Colombier {
7239a747e4fSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
7249a747e4fSDavid du Colombier  	exits(0);
7259a747e4fSDavid du Colombier }
7269a747e4fSDavid du Colombier void
sysfauth(void)7279a747e4fSDavid du Colombier sysfauth(void)
7289a747e4fSDavid du Colombier {
7299a747e4fSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
7309a747e4fSDavid du Colombier  	exits(0);
7319a747e4fSDavid du Colombier }
7329a747e4fSDavid du Colombier void
sysfversion(void)7339a747e4fSDavid du Colombier sysfversion(void)
7349a747e4fSDavid du Colombier {
7359a747e4fSDavid du Colombier 	Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
7369a747e4fSDavid du Colombier  	exits(0);
7379a747e4fSDavid du Colombier }
7387dd7cddfSDavid du Colombier 
7397dd7cddfSDavid du Colombier void	(*systab[])(void) =
7407dd7cddfSDavid du Colombier {
7417dd7cddfSDavid du Colombier 	[SYSR1]		sys1,
7429a747e4fSDavid du Colombier 	[_ERRSTR]		sys_errstr,
7437dd7cddfSDavid du Colombier 	[BIND]		sysbind,
7447dd7cddfSDavid du Colombier 	[CHDIR]		syschdir,
7457dd7cddfSDavid du Colombier 	[CLOSE]		sysclose,
7467dd7cddfSDavid du Colombier 	[DUP]		sysdup,
7477dd7cddfSDavid du Colombier 	[ALARM]		sysalarm,
7487dd7cddfSDavid du Colombier 	[EXEC]		sysexec,
7497dd7cddfSDavid du Colombier 	[EXITS]		sysexits,
7509a747e4fSDavid du Colombier 	[_FSESSION]	sys_fsession,
7519a747e4fSDavid du Colombier 	[FAUTH]		sysfauth,
7529a747e4fSDavid du Colombier 	[_FSTAT]		sys_fstat,
7537dd7cddfSDavid du Colombier 	[SEGBRK]		syssegbrk,
7547dd7cddfSDavid du Colombier 	[MOUNT]		sysmount,
7557dd7cddfSDavid du Colombier 	[OPEN]		sysopen,
7569a747e4fSDavid du Colombier 	[_READ]		sys_read,
7579a747e4fSDavid du Colombier 	[OSEEK]		sysoseek,
7587dd7cddfSDavid du Colombier 	[SLEEP]		syssleep,
7599a747e4fSDavid du Colombier 	[_STAT]		sys_stat,
7609a747e4fSDavid du Colombier 	[RFORK]		sysrfork,
7619a747e4fSDavid du Colombier 	[_WRITE]		sys_write,
7627dd7cddfSDavid du Colombier 	[PIPE]		syspipe,
7637dd7cddfSDavid du Colombier 	[CREATE]		syscreate,
7649a747e4fSDavid du Colombier 	[FD2PATH]	sysfd2path,
7657dd7cddfSDavid du Colombier 	[BRK_]		sysbrk_,
7667dd7cddfSDavid du Colombier 	[REMOVE]		sysremove,
7679a747e4fSDavid du Colombier 	[_WSTAT]		sys_wstat,
7689a747e4fSDavid du Colombier 	[_FWSTAT]	sys_fwstat,
7697dd7cddfSDavid du Colombier 	[NOTIFY]		sysnotify,
7707dd7cddfSDavid du Colombier 	[NOTED]		sysnoted,
7717dd7cddfSDavid du Colombier 	[SEGATTACH]	syssegattach,
7727dd7cddfSDavid du Colombier 	[SEGDETACH]	syssegdetach,
7737dd7cddfSDavid du Colombier 	[SEGFREE]		syssegfree,
7747dd7cddfSDavid du Colombier 	[SEGFLUSH]	syssegflush,
7757dd7cddfSDavid du Colombier 	[RENDEZVOUS]	sysrendezvous,
7767dd7cddfSDavid du Colombier 	[UNMOUNT]	sysunmount,
7779a747e4fSDavid du Colombier 	[_WAIT]		sys_wait,
7789a747e4fSDavid du Colombier 	[SEEK]		sysseek,
7799a747e4fSDavid du Colombier 	[FVERSION]	sysfversion,
7809a747e4fSDavid du Colombier 	[ERRSTR]		syserrstr,
7819a747e4fSDavid du Colombier 	[STAT]		sysstat,
7829a747e4fSDavid du Colombier 	[FSTAT]		sysfstat,
7839a747e4fSDavid du Colombier 	[WSTAT]		syswstat,
7849a747e4fSDavid du Colombier 	[FWSTAT]		sysfwstat,
7859a747e4fSDavid du Colombier 	[PREAD]		syspread,
7869a747e4fSDavid du Colombier 	[PWRITE]		syspwrite,
7879a747e4fSDavid du Colombier 	[AWAIT]		sysawait,
7887dd7cddfSDavid du Colombier };
7897dd7cddfSDavid du Colombier 
7907dd7cddfSDavid du Colombier void
Ssyscall(ulong)7917dd7cddfSDavid du Colombier Ssyscall(ulong)
7927dd7cddfSDavid du Colombier {
7937dd7cddfSDavid du Colombier 	int call;
7947dd7cddfSDavid du Colombier 
79580ee5cbfSDavid du Colombier 	call = reg.r[REGARG];
796*51480713SDavid du Colombier 	if(call < 0 || call >= nelem(systab) || systab[call] == nil) {
797*51480713SDavid du Colombier 		Bprint(bioout, "bad system call %d (%#ux)\n", call, call);
7987dd7cddfSDavid du Colombier 		dumpreg();
799*51480713SDavid du Colombier 		Bflush(bioout);
800*51480713SDavid du Colombier 		return;
8017dd7cddfSDavid du Colombier 	}
8029a747e4fSDavid du Colombier 
8037dd7cddfSDavid du Colombier 	if(trace)
8047dd7cddfSDavid du Colombier 		itrace("SWI\t%s", sysctab[call]);
8057dd7cddfSDavid du Colombier 	(*systab[call])();
8067dd7cddfSDavid du Colombier 	Bflush(bioout);
8077dd7cddfSDavid du Colombier }
808