13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <bio.h>
4bd389b36SDavid du Colombier #include <mach.h>
53e12c5d1SDavid du Colombier #define Extern extern
63e12c5d1SDavid du Colombier #include "mips.h"
73e12c5d1SDavid du Colombier
89a747e4fSDavid du Colombier #define REGSP 29
99a747e4fSDavid du Colombier #define REGRET 1
109a747e4fSDavid du Colombier
119a747e4fSDavid du Colombier #define ODIRLEN 116 /* compatibility; used in _stat etc. */
129a747e4fSDavid du Colombier #define OERRLEN 64 /* compatibility; used in _stat etc. */
139a747e4fSDavid du Colombier
149a747e4fSDavid du Colombier char errbuf[ERRMAX];
153e12c5d1SDavid du Colombier ulong nofunc;
163e12c5d1SDavid du Colombier
179a747e4fSDavid du Colombier #include "/sys/src/libc/9syscall/sys.h"
183e12c5d1SDavid du Colombier
193e12c5d1SDavid du Colombier char *sysctab[]={
207dd7cddfSDavid du Colombier [SYSR1] "SYSR1",
219a747e4fSDavid du Colombier [_ERRSTR] "_errstr",
229a747e4fSDavid du Colombier [BIND] "Bind",
239a747e4fSDavid du Colombier [CHDIR] "Chdir",
249a747e4fSDavid du Colombier [CLOSE] "Close",
259a747e4fSDavid du Colombier [DUP] "Dup",
269a747e4fSDavid du Colombier [ALARM] "Alarm",
279a747e4fSDavid du Colombier [EXEC] "Exec",
289a747e4fSDavid du Colombier [EXITS] "Exits",
299a747e4fSDavid du Colombier [_FSESSION] "_Fsession",
309a747e4fSDavid du Colombier [FAUTH] "Fauth",
319a747e4fSDavid du Colombier [_FSTAT] "_fstat",
329a747e4fSDavid du Colombier [SEGBRK] "Segbrk",
339a747e4fSDavid du Colombier [_MOUNT] "_Mount",
349a747e4fSDavid du Colombier [OPEN] "Open",
359a747e4fSDavid du Colombier [_READ] "_Read",
369a747e4fSDavid du Colombier [OSEEK] "Oseek",
379a747e4fSDavid du Colombier [SLEEP] "Sleep",
389a747e4fSDavid du Colombier [_STAT] "_Stat",
399a747e4fSDavid du Colombier [RFORK] "Rfork",
409a747e4fSDavid du Colombier [_WRITE] "_Write",
419a747e4fSDavid du Colombier [PIPE] "Pipe",
429a747e4fSDavid du Colombier [CREATE] "Create",
439a747e4fSDavid du Colombier [FD2PATH] "Fd2path",
449a747e4fSDavid du Colombier [BRK_] "Brk_",
459a747e4fSDavid du Colombier [REMOVE] "Remove",
469a747e4fSDavid du Colombier [_WSTAT] "_Wstat",
479a747e4fSDavid du Colombier [_FWSTAT] "_Fwstat",
489a747e4fSDavid du Colombier [NOTIFY] "Notify",
499a747e4fSDavid du Colombier [NOTED] "Noted",
509a747e4fSDavid du Colombier [SEGATTACH] "Segattach",
519a747e4fSDavid du Colombier [SEGDETACH] "Segdetach",
529a747e4fSDavid du Colombier [SEGFREE] "Segfree",
539a747e4fSDavid du Colombier [SEGFLUSH] "Segflush",
549a747e4fSDavid du Colombier [RENDEZVOUS] "Rendezvous",
559a747e4fSDavid du Colombier [UNMOUNT] "Unmount",
569a747e4fSDavid du Colombier [_WAIT] "Wait",
579a747e4fSDavid du Colombier [SEEK] "Seek",
589a747e4fSDavid du Colombier [FVERSION] "Fversion",
599a747e4fSDavid du Colombier [ERRSTR] "Errstr",
609a747e4fSDavid du Colombier [STAT] "Stat",
619a747e4fSDavid du Colombier [FSTAT] "Fstat",
629a747e4fSDavid du Colombier [WSTAT] "Wstat",
639a747e4fSDavid du Colombier [FWSTAT] "Fwstat",
649a747e4fSDavid du Colombier [MOUNT] "Mount",
659a747e4fSDavid du Colombier [AWAIT] "Await",
669a747e4fSDavid du Colombier [PREAD] "Pread",
679a747e4fSDavid du Colombier [PWRITE] "Pwrite",
683e12c5d1SDavid du Colombier };
693e12c5d1SDavid du Colombier
sys1(void)709a747e4fSDavid du Colombier void sys1(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
719a747e4fSDavid du Colombier
729a747e4fSDavid du Colombier void
sys_errstr(void)739a747e4fSDavid du Colombier sys_errstr(void)
749a747e4fSDavid du Colombier {
759a747e4fSDavid du Colombier ulong str;
769a747e4fSDavid du Colombier
779a747e4fSDavid du Colombier str = getmem_w(reg.r[REGSP]+4);
789a747e4fSDavid du Colombier if(sysdbg)
799a747e4fSDavid du Colombier itrace("errstr(0x%lux)", str);
809a747e4fSDavid du Colombier
819a747e4fSDavid du Colombier memio(errbuf, str, OERRLEN, MemWrite);
829a747e4fSDavid du Colombier strcpy(errbuf, "no error");
839a747e4fSDavid du Colombier reg.r[REGRET] = 0;
849a747e4fSDavid du Colombier
859a747e4fSDavid du Colombier }
863e12c5d1SDavid du Colombier
873e12c5d1SDavid du Colombier void
syserrstr(void)883e12c5d1SDavid du Colombier syserrstr(void)
893e12c5d1SDavid du Colombier {
903e12c5d1SDavid du Colombier ulong str;
919a747e4fSDavid du Colombier uint n;
923e12c5d1SDavid du Colombier
939a747e4fSDavid du Colombier str = getmem_w(reg.r[REGSP]+4);
949a747e4fSDavid du Colombier n = getmem_w(reg.r[REGSP]+8);
953e12c5d1SDavid du Colombier if(sysdbg)
969a747e4fSDavid du Colombier itrace("errstr(0x%lux, 0x%lux)", str, n);
973e12c5d1SDavid du Colombier
989a747e4fSDavid du Colombier if(n > strlen(errbuf)+1)
999a747e4fSDavid du Colombier n = strlen(errbuf)+1;
1009a747e4fSDavid du Colombier memio(errbuf, str, n, MemWrite);
1013e12c5d1SDavid du Colombier strcpy(errbuf, "no error");
1029a747e4fSDavid du Colombier reg.r[REGRET] = n;
1033e12c5d1SDavid du Colombier
1043e12c5d1SDavid du Colombier }
1059a747e4fSDavid du Colombier
1069a747e4fSDavid du Colombier void
sysfd2path(void)1079a747e4fSDavid du Colombier sysfd2path(void)
1089a747e4fSDavid du Colombier {
109*c93608ccSDavid du Colombier int n;
110*c93608ccSDavid du Colombier uint fd;
1119a747e4fSDavid du Colombier ulong str;
1129a747e4fSDavid du Colombier char buf[1024];
1139a747e4fSDavid du Colombier
1149a747e4fSDavid du Colombier fd = getmem_w(reg.r[REGSP]+4);
1159a747e4fSDavid du Colombier str = getmem_w(reg.r[REGSP]+8);
1169a747e4fSDavid du Colombier n = getmem_w(reg.r[REGSP]+12);
1179a747e4fSDavid du Colombier if(sysdbg)
1189a747e4fSDavid du Colombier itrace("fd2path(0x%lux, 0x%lux, 0x%lux)", fd, str, n);
1199a747e4fSDavid du Colombier reg.r[REGRET] = -1;
1209a747e4fSDavid du Colombier if(n > sizeof buf){
1219a747e4fSDavid du Colombier strcpy(errbuf, "buffer too big");
1229a747e4fSDavid du Colombier return;
1239a747e4fSDavid du Colombier }
1249a747e4fSDavid du Colombier n = fd2path(fd, buf, sizeof buf);
1259a747e4fSDavid du Colombier if(n < 0)
1269a747e4fSDavid du Colombier errstr(buf, sizeof buf);
1279a747e4fSDavid du Colombier else
1289a747e4fSDavid du Colombier memio(errbuf, str, n, MemWrite);
1299a747e4fSDavid du Colombier reg.r[REGRET] = n;
1309a747e4fSDavid du Colombier
1319a747e4fSDavid du Colombier }
1329a747e4fSDavid du Colombier
1333e12c5d1SDavid du Colombier void
sysbind(void)1343e12c5d1SDavid du Colombier sysbind(void)
1353e12c5d1SDavid du Colombier {
1363e12c5d1SDavid du Colombier ulong pname, pold, flags;
1373e12c5d1SDavid du Colombier char name[1024], old[1024];
1383e12c5d1SDavid du Colombier int n;
1393e12c5d1SDavid du Colombier
1409a747e4fSDavid du Colombier pname = getmem_w(reg.r[REGSP]+4);
1419a747e4fSDavid du Colombier pold = getmem_w(reg.r[REGSP]+8);
1429a747e4fSDavid du Colombier flags = getmem_w(reg.r[REGSP]+12);
1433e12c5d1SDavid du Colombier memio(name, pname, sizeof(name), MemReadstring);
1443e12c5d1SDavid du Colombier memio(old, pold, sizeof(old), MemReadstring);
1453e12c5d1SDavid du Colombier if(sysdbg)
1467dd7cddfSDavid du Colombier itrace("bind(0x%lux='%s', 0x%lux='%s', 0x%lux)", name, name, old, old, flags);
1473e12c5d1SDavid du Colombier
1483e12c5d1SDavid du Colombier n = bind(name, old, flags);
1493e12c5d1SDavid du Colombier if(n < 0)
1509a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
1513e12c5d1SDavid du Colombier
1529a747e4fSDavid du Colombier reg.r[REGRET] = n;
1533e12c5d1SDavid du Colombier }
1543e12c5d1SDavid du Colombier
1553e12c5d1SDavid du Colombier void
syschdir(void)1563e12c5d1SDavid du Colombier syschdir(void)
1573e12c5d1SDavid du Colombier {
1583e12c5d1SDavid du Colombier char file[1024];
1593e12c5d1SDavid du Colombier int n;
1603e12c5d1SDavid du Colombier ulong name;
1613e12c5d1SDavid du Colombier
1629a747e4fSDavid du Colombier name = getmem_w(reg.r[REGSP]+4);
1633e12c5d1SDavid du Colombier memio(file, name, sizeof(file), MemReadstring);
1643e12c5d1SDavid du Colombier if(sysdbg)
1653e12c5d1SDavid du Colombier itrace("chdir(0x%lux='%s', 0x%lux)", name, file);
1663e12c5d1SDavid du Colombier
1673e12c5d1SDavid du Colombier n = chdir(file);
1683e12c5d1SDavid du Colombier if(n < 0)
1699a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
1703e12c5d1SDavid du Colombier
1719a747e4fSDavid du Colombier reg.r[REGRET] = n;
1723e12c5d1SDavid du Colombier }
1733e12c5d1SDavid du Colombier
1743e12c5d1SDavid du Colombier void
sysclose(void)1753e12c5d1SDavid du Colombier sysclose(void)
1763e12c5d1SDavid du Colombier {
1773e12c5d1SDavid du Colombier int n;
1783e12c5d1SDavid du Colombier ulong fd;
1793e12c5d1SDavid du Colombier
1809a747e4fSDavid du Colombier fd = getmem_w(reg.r[REGSP]+4);
1813e12c5d1SDavid du Colombier if(sysdbg)
1823e12c5d1SDavid du Colombier itrace("close(%d)", fd);
1833e12c5d1SDavid du Colombier
1843e12c5d1SDavid du Colombier n = close(fd);
1853e12c5d1SDavid du Colombier if(n < 0)
1869a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
1879a747e4fSDavid du Colombier reg.r[REGRET] = n;
1883e12c5d1SDavid du Colombier }
1893e12c5d1SDavid du Colombier
1903e12c5d1SDavid du Colombier void
sysdup(void)1913e12c5d1SDavid du Colombier sysdup(void)
1923e12c5d1SDavid du Colombier {
1933e12c5d1SDavid du Colombier int oldfd, newfd;
1943e12c5d1SDavid du Colombier int n;
1953e12c5d1SDavid du Colombier
1969a747e4fSDavid du Colombier oldfd = getmem_w(reg.r[REGSP]+4);
1979a747e4fSDavid du Colombier newfd = getmem_w(reg.r[REGSP]+8);
1983e12c5d1SDavid du Colombier if(sysdbg)
1993e12c5d1SDavid du Colombier itrace("dup(%d, %d)", oldfd, newfd);
2003e12c5d1SDavid du Colombier
2013e12c5d1SDavid du Colombier n = dup(oldfd, newfd);
2023e12c5d1SDavid du Colombier if(n < 0)
2039a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
2049a747e4fSDavid du Colombier reg.r[REGRET] = n;
2053e12c5d1SDavid du Colombier }
2063e12c5d1SDavid du Colombier
2073e12c5d1SDavid du Colombier void
sysexits(void)2083e12c5d1SDavid du Colombier sysexits(void)
2093e12c5d1SDavid du Colombier {
2109a747e4fSDavid du Colombier char buf[OERRLEN];
2113e12c5d1SDavid du Colombier ulong str;
2123e12c5d1SDavid du Colombier
2139a747e4fSDavid du Colombier str = getmem_w(reg.r[REGSP]+4);
2143e12c5d1SDavid du Colombier if(sysdbg)
2153e12c5d1SDavid du Colombier itrace("exits(0x%lux)", str);
2163e12c5d1SDavid du Colombier
2173e12c5d1SDavid du Colombier count = 1;
2183e12c5d1SDavid du Colombier if(str != 0) {
2199a747e4fSDavid du Colombier memio(buf, str, sizeof buf, MemRead);
2203e12c5d1SDavid du Colombier Bprint(bioout, "exits(%s)\n", buf);
2213e12c5d1SDavid du Colombier }
2223e12c5d1SDavid du Colombier else
2233e12c5d1SDavid du Colombier Bprint(bioout, "exits(0)\n");
2243e12c5d1SDavid du Colombier }
2253e12c5d1SDavid du Colombier
2263e12c5d1SDavid du Colombier void
sysopen(void)2273e12c5d1SDavid du Colombier sysopen(void)
2283e12c5d1SDavid du Colombier {
2293e12c5d1SDavid du Colombier char file[1024];
2303e12c5d1SDavid du Colombier int n;
2313e12c5d1SDavid du Colombier ulong mode, name;
2323e12c5d1SDavid du Colombier
2339a747e4fSDavid du Colombier name = getmem_w(reg.r[REGSP]+4);
2349a747e4fSDavid du Colombier mode = getmem_w(reg.r[REGSP]+8);
2353e12c5d1SDavid du Colombier memio(file, name, sizeof(file), MemReadstring);
2363e12c5d1SDavid du Colombier if(sysdbg)
2373e12c5d1SDavid du Colombier itrace("open(0x%lux='%s', 0x%lux)", name, file, mode);
2383e12c5d1SDavid du Colombier
2393e12c5d1SDavid du Colombier n = open(file, mode);
2403e12c5d1SDavid du Colombier if(n < 0)
2419a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
2423e12c5d1SDavid du Colombier
2439a747e4fSDavid du Colombier reg.r[REGRET] = n;
2443e12c5d1SDavid du Colombier };
2453e12c5d1SDavid du Colombier
2463e12c5d1SDavid du Colombier void
sysread(vlong offset)2479a747e4fSDavid du Colombier sysread(vlong offset)
2483e12c5d1SDavid du Colombier {
2493e12c5d1SDavid du Colombier int fd;
2503e12c5d1SDavid du Colombier ulong size, a;
2513e12c5d1SDavid du Colombier char *buf, *p;
2523e12c5d1SDavid du Colombier int n, cnt, c;
2533e12c5d1SDavid du Colombier
2549a747e4fSDavid du Colombier fd = getmem_w(reg.r[REGSP]+4);
2559a747e4fSDavid du Colombier a = getmem_w(reg.r[REGSP]+8);
2569a747e4fSDavid du Colombier size = getmem_w(reg.r[REGSP]+12);
2573e12c5d1SDavid du Colombier
2583e12c5d1SDavid du Colombier buf = emalloc(size);
2593e12c5d1SDavid du Colombier if(fd == 0) {
2603e12c5d1SDavid du Colombier print("\nstdin>>");
2613e12c5d1SDavid du Colombier p = buf;
2623e12c5d1SDavid du Colombier n = 0;
2633e12c5d1SDavid du Colombier cnt = size;
2643e12c5d1SDavid du Colombier while(cnt) {
2653e12c5d1SDavid du Colombier c = Bgetc(bin);
2663e12c5d1SDavid du Colombier if(c <= 0)
2673e12c5d1SDavid du Colombier break;
2683e12c5d1SDavid du Colombier *p++ = c;
2693e12c5d1SDavid du Colombier n++;
2703e12c5d1SDavid du Colombier cnt--;
2713e12c5d1SDavid du Colombier if(c == '\n')
2723e12c5d1SDavid du Colombier break;
2733e12c5d1SDavid du Colombier }
2743e12c5d1SDavid du Colombier }
2753e12c5d1SDavid du Colombier else
2769a747e4fSDavid du Colombier n = pread(fd, buf, size, offset);
2773e12c5d1SDavid du Colombier
2783e12c5d1SDavid du Colombier if(n < 0)
2799a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
2803e12c5d1SDavid du Colombier else
2813e12c5d1SDavid du Colombier memio(buf, a, n, MemWrite);
2823e12c5d1SDavid du Colombier
2833e12c5d1SDavid du Colombier if(sysdbg)
2849a747e4fSDavid du Colombier itrace("read(%d, 0x%lux, %d, 0x%llx) = %d", fd, a, size, offset, n);
2853e12c5d1SDavid du Colombier
2863e12c5d1SDavid du Colombier free(buf);
2879a747e4fSDavid du Colombier reg.r[REGRET] = n;
2889a747e4fSDavid du Colombier }
2899a747e4fSDavid du Colombier
2909a747e4fSDavid du Colombier void
sys_read(void)2919a747e4fSDavid du Colombier sys_read(void)
2929a747e4fSDavid du Colombier {
2939a747e4fSDavid du Colombier sysread(-1LL);
2949a747e4fSDavid du Colombier }
2959a747e4fSDavid du Colombier
2969a747e4fSDavid du Colombier void
syspread(void)2979a747e4fSDavid du Colombier syspread(void)
2989a747e4fSDavid du Colombier {
2999a747e4fSDavid du Colombier union {
3009a747e4fSDavid du Colombier vlong v;
3019a747e4fSDavid du Colombier ulong u[2];
3029a747e4fSDavid du Colombier } o;
3039a747e4fSDavid du Colombier
3049a747e4fSDavid du Colombier o.u[0] = getmem_w(reg.r[REGSP]+16);
3057d9195a7SDavid du Colombier o.u[1] = getmem_w(reg.r[REGSP]+20);
3069a747e4fSDavid du Colombier sysread(o.v);
3073e12c5d1SDavid du Colombier }
3083e12c5d1SDavid du Colombier
3093e12c5d1SDavid du Colombier void
sysseek(void)3103e12c5d1SDavid du Colombier sysseek(void)
3113e12c5d1SDavid du Colombier {
3129a747e4fSDavid du Colombier int fd;
3139a747e4fSDavid du Colombier ulong mode;
3149a747e4fSDavid du Colombier ulong retp;
3159a747e4fSDavid du Colombier union {
3169a747e4fSDavid du Colombier vlong v;
3179a747e4fSDavid du Colombier ulong u[2];
3189a747e4fSDavid du Colombier } o;
3199a747e4fSDavid du Colombier
3209a747e4fSDavid du Colombier retp = getmem_w(reg.r[REGSP]+4);
3219a747e4fSDavid du Colombier fd = getmem_w(reg.r[REGSP]+8);
3229a747e4fSDavid du Colombier o.u[0] = getmem_w(reg.r[REGSP]+12);
3237d9195a7SDavid du Colombier o.u[1] = getmem_w(reg.r[REGSP]+16);
3249a747e4fSDavid du Colombier mode = getmem_w(reg.r[REGSP]+20);
3259a747e4fSDavid du Colombier if(sysdbg)
3269a747e4fSDavid du Colombier itrace("seek(%d, %lld, %d)", fd, o.v, mode);
3279a747e4fSDavid du Colombier
3289a747e4fSDavid du Colombier o.v = seek(fd, o.v, mode);
3299a747e4fSDavid du Colombier if(o.v < 0)
3309a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
3319a747e4fSDavid du Colombier
3329a747e4fSDavid du Colombier memio((char*)o.u, retp, sizeof(vlong), MemWrite);
3339a747e4fSDavid du Colombier }
3349a747e4fSDavid du Colombier
3359a747e4fSDavid du Colombier void
sysoseek(void)3369a747e4fSDavid du Colombier sysoseek(void)
3379a747e4fSDavid du Colombier {
3383e12c5d1SDavid du Colombier int fd, n;
3393e12c5d1SDavid du Colombier ulong off, mode;
3403e12c5d1SDavid du Colombier
3419a747e4fSDavid du Colombier fd = getmem_w(reg.r[REGSP]+4);
3429a747e4fSDavid du Colombier off = getmem_w(reg.r[REGSP]+8);
3439a747e4fSDavid du Colombier mode = getmem_w(reg.r[REGSP]+12);
3443e12c5d1SDavid du Colombier if(sysdbg)
3453e12c5d1SDavid du Colombier itrace("seek(%d, %lud, %d)", fd, off, mode);
3463e12c5d1SDavid du Colombier
3473e12c5d1SDavid du Colombier n = seek(fd, off, mode);
3483e12c5d1SDavid du Colombier if(n < 0)
3499a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
3503e12c5d1SDavid du Colombier
3519a747e4fSDavid du Colombier reg.r[REGRET] = n;
3523e12c5d1SDavid du Colombier }
3533e12c5d1SDavid du Colombier
3543e12c5d1SDavid du Colombier void
sysrfork(void)3557dd7cddfSDavid du Colombier sysrfork(void)
3567dd7cddfSDavid du Colombier {
3577dd7cddfSDavid du Colombier int flag;
3587dd7cddfSDavid du Colombier
3599a747e4fSDavid du Colombier flag = getmem_w(reg.r[REGSP]+4);
3607dd7cddfSDavid du Colombier if(sysdbg)
3617dd7cddfSDavid du Colombier itrace("rfork(%d)", flag);
3627dd7cddfSDavid du Colombier if(flag & RFPROC) {
3637dd7cddfSDavid du Colombier Bprint(bioout, "rfork: cannot create process, rfork(0x%.8ux)\n", flag);
3647dd7cddfSDavid du Colombier exits(0);
3657dd7cddfSDavid du Colombier }
3669a747e4fSDavid du Colombier reg.r[REGRET] = rfork(flag);
3677dd7cddfSDavid du Colombier }
3687dd7cddfSDavid du Colombier
3697dd7cddfSDavid du Colombier void
syssleep(void)3703e12c5d1SDavid du Colombier syssleep(void)
3713e12c5d1SDavid du Colombier {
3723e12c5d1SDavid du Colombier ulong len;
3733e12c5d1SDavid du Colombier int n;
3743e12c5d1SDavid du Colombier
3759a747e4fSDavid du Colombier len = getmem_w(reg.r[REGSP]+4);
3763e12c5d1SDavid du Colombier if(sysdbg)
3773e12c5d1SDavid du Colombier itrace("sleep(%d)", len);
3783e12c5d1SDavid du Colombier
3793e12c5d1SDavid du Colombier n = sleep(len);
3803e12c5d1SDavid du Colombier if(n < 0)
3819a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
3823e12c5d1SDavid du Colombier
3839a747e4fSDavid du Colombier reg.r[REGRET] = n;
3849a747e4fSDavid du Colombier }
3859a747e4fSDavid du Colombier
3869a747e4fSDavid du Colombier void
sys_stat(void)3879a747e4fSDavid du Colombier sys_stat(void)
3889a747e4fSDavid du Colombier {
3899a747e4fSDavid du Colombier char nambuf[1024];
3909a747e4fSDavid du Colombier char buf[ODIRLEN];
3919a747e4fSDavid du Colombier ulong edir, name;
3929a747e4fSDavid du Colombier extern int _stat(char*, char*); /* old system call */
3939a747e4fSDavid du Colombier int n;
3949a747e4fSDavid du Colombier
3959a747e4fSDavid du Colombier name = getmem_w(reg.r[REGSP]+4);
3969a747e4fSDavid du Colombier edir = getmem_w(reg.r[REGSP]+8);
3979a747e4fSDavid du Colombier memio(nambuf, name, sizeof(nambuf), MemReadstring);
3989a747e4fSDavid du Colombier if(sysdbg)
3999a747e4fSDavid du Colombier itrace("stat(0x%lux='%s', 0x%lux)", name, nambuf, edir);
4009a747e4fSDavid du Colombier
4019a747e4fSDavid du Colombier n = _stat(nambuf, buf);
4029a747e4fSDavid du Colombier if(n < 0)
4039a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
4049a747e4fSDavid du Colombier else
4059a747e4fSDavid du Colombier memio(buf, edir, ODIRLEN, MemWrite);
4069a747e4fSDavid du Colombier
4079a747e4fSDavid du Colombier reg.r[REGRET] = n;
4083e12c5d1SDavid du Colombier }
4093e12c5d1SDavid du Colombier
4103e12c5d1SDavid du Colombier void
sysstat(void)4113e12c5d1SDavid du Colombier sysstat(void)
4123e12c5d1SDavid du Colombier {
4133e12c5d1SDavid du Colombier char nambuf[1024];
4149a747e4fSDavid du Colombier uchar buf[STATMAX];
4153e12c5d1SDavid du Colombier ulong edir, name;
4163e12c5d1SDavid du Colombier int n;
4173e12c5d1SDavid du Colombier
4189a747e4fSDavid du Colombier name = getmem_w(reg.r[REGSP]+4);
4199a747e4fSDavid du Colombier edir = getmem_w(reg.r[REGSP]+8);
4209a747e4fSDavid du Colombier n = getmem_w(reg.r[REGSP]+12);
4213e12c5d1SDavid du Colombier memio(nambuf, name, sizeof(nambuf), MemReadstring);
4223e12c5d1SDavid du Colombier if(sysdbg)
4239a747e4fSDavid du Colombier itrace("stat(0x%lux='%s', 0x%lux, 0x%lux)", name, nambuf, edir, n);
4249a747e4fSDavid du Colombier if(n > sizeof buf)
4259a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
4269a747e4fSDavid du Colombier else{
4279a747e4fSDavid du Colombier n = stat(nambuf, buf, n);
4283e12c5d1SDavid du Colombier if(n < 0)
4299a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
4303e12c5d1SDavid du Colombier else
4319a747e4fSDavid du Colombier memio((char*)buf, edir, n, MemWrite);
4329a747e4fSDavid du Colombier }
4339a747e4fSDavid du Colombier reg.r[REGRET] = n;
4349a747e4fSDavid du Colombier }
4353e12c5d1SDavid du Colombier
4369a747e4fSDavid du Colombier void
sys_fstat(void)4379a747e4fSDavid du Colombier sys_fstat(void)
4389a747e4fSDavid du Colombier {
4399a747e4fSDavid du Colombier char buf[ODIRLEN];
4409a747e4fSDavid du Colombier ulong edir;
4419a747e4fSDavid du Colombier extern int _fstat(int, char*); /* old system call */
4429a747e4fSDavid du Colombier int n, fd;
4439a747e4fSDavid du Colombier
4449a747e4fSDavid du Colombier fd = getmem_w(reg.r[REGSP]+4);
4459a747e4fSDavid du Colombier edir = getmem_w(reg.r[REGSP]+8);
4469a747e4fSDavid du Colombier if(sysdbg)
4479a747e4fSDavid du Colombier itrace("fstat(%d, 0x%lux)", fd, edir);
4489a747e4fSDavid du Colombier
4499a747e4fSDavid du Colombier n = _fstat(fd, buf);
4509a747e4fSDavid du Colombier if(n < 0)
4519a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
4529a747e4fSDavid du Colombier else
4539a747e4fSDavid du Colombier memio(buf, edir, ODIRLEN, MemWrite);
4549a747e4fSDavid du Colombier
4559a747e4fSDavid du Colombier reg.r[REGRET] = n;
4563e12c5d1SDavid du Colombier }
4573e12c5d1SDavid du Colombier
4583e12c5d1SDavid du Colombier void
sysfstat(void)4593e12c5d1SDavid du Colombier sysfstat(void)
4603e12c5d1SDavid du Colombier {
4619a747e4fSDavid du Colombier uchar buf[STATMAX];
4623e12c5d1SDavid du Colombier ulong edir;
4633e12c5d1SDavid du Colombier int n, fd;
4643e12c5d1SDavid du Colombier
4659a747e4fSDavid du Colombier fd = getmem_w(reg.r[REGSP]+4);
4669a747e4fSDavid du Colombier edir = getmem_w(reg.r[REGSP]+8);
4679a747e4fSDavid du Colombier n = getmem_w(reg.r[REGSP]+12);
4683e12c5d1SDavid du Colombier if(sysdbg)
4699a747e4fSDavid du Colombier itrace("fstat(%d, 0x%lux, 0x%lux)", fd, edir, n);
4703e12c5d1SDavid du Colombier
4719a747e4fSDavid du Colombier reg.r[REGRET] = -1;
4729a747e4fSDavid du Colombier if(n > sizeof buf){
4739a747e4fSDavid du Colombier strcpy(errbuf, "stat buffer too big");
4749a747e4fSDavid du Colombier return;
4759a747e4fSDavid du Colombier }
4769a747e4fSDavid du Colombier n = fstat(fd, buf, n);
4773e12c5d1SDavid du Colombier if(n < 0)
4789a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
4793e12c5d1SDavid du Colombier else
4809a747e4fSDavid du Colombier memio((char*)buf, edir, n, MemWrite);
4819a747e4fSDavid du Colombier reg.r[REGRET] = n;
4823e12c5d1SDavid du Colombier }
4833e12c5d1SDavid du Colombier
4843e12c5d1SDavid du Colombier void
syswrite(vlong offset)4859a747e4fSDavid du Colombier syswrite(vlong offset)
4863e12c5d1SDavid du Colombier {
4873e12c5d1SDavid du Colombier int fd;
4883e12c5d1SDavid du Colombier ulong size, a;
4893e12c5d1SDavid du Colombier char *buf;
4903e12c5d1SDavid du Colombier int n;
4913e12c5d1SDavid du Colombier
4929a747e4fSDavid du Colombier fd = getmem_w(reg.r[REGSP]+4);
4939a747e4fSDavid du Colombier a = getmem_w(reg.r[REGSP]+8);
4949a747e4fSDavid du Colombier size = getmem_w(reg.r[REGSP]+12);
4953e12c5d1SDavid du Colombier
4967dd7cddfSDavid du Colombier Bflush(bioout);
4973e12c5d1SDavid du Colombier buf = memio(0, a, size, MemRead);
4989a747e4fSDavid du Colombier n = pwrite(fd, buf, size, offset);
4993e12c5d1SDavid du Colombier if(n < 0)
5009a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
5019a747e4fSDavid du Colombier if(sysdbg)
5029a747e4fSDavid du Colombier itrace("write(%d, %lux, %d, 0xllx) = %d", fd, a, size, offset, n);
5033e12c5d1SDavid du Colombier free(buf);
5043e12c5d1SDavid du Colombier
5059a747e4fSDavid du Colombier reg.r[REGRET] = n;
5069a747e4fSDavid du Colombier }
5079a747e4fSDavid du Colombier
5089a747e4fSDavid du Colombier void
sys_write(void)5099a747e4fSDavid du Colombier sys_write(void)
5109a747e4fSDavid du Colombier {
5119a747e4fSDavid du Colombier syswrite(-1LL);
5129a747e4fSDavid du Colombier }
5139a747e4fSDavid du Colombier
5149a747e4fSDavid du Colombier void
syspwrite(void)5159a747e4fSDavid du Colombier syspwrite(void)
5169a747e4fSDavid du Colombier {
5179a747e4fSDavid du Colombier union {
5189a747e4fSDavid du Colombier vlong v;
5199a747e4fSDavid du Colombier ulong u[2];
5209a747e4fSDavid du Colombier } o;
5219a747e4fSDavid du Colombier
5229a747e4fSDavid du Colombier o.u[0] = getmem_w(reg.r[REGSP]+16);
5237d9195a7SDavid du Colombier o.u[1] = getmem_w(reg.r[REGSP]+20);
5249a747e4fSDavid du Colombier syswrite(o.v);
5253e12c5d1SDavid du Colombier }
5263e12c5d1SDavid du Colombier
5273e12c5d1SDavid du Colombier void
syspipe(void)5283e12c5d1SDavid du Colombier syspipe(void)
5293e12c5d1SDavid du Colombier {
5303e12c5d1SDavid du Colombier int n, p[2];
5313e12c5d1SDavid du Colombier ulong fd;
5323e12c5d1SDavid du Colombier
5339a747e4fSDavid du Colombier fd = getmem_w(reg.r[REGSP]+4);
5343e12c5d1SDavid du Colombier if(sysdbg)
5353e12c5d1SDavid du Colombier itrace("pipe(%lux)", fd);
5363e12c5d1SDavid du Colombier
5373e12c5d1SDavid du Colombier n = pipe(p);
5383e12c5d1SDavid du Colombier if(n < 0)
5399a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
5403e12c5d1SDavid du Colombier else {
5413e12c5d1SDavid du Colombier putmem_w(fd, p[0]);
5423e12c5d1SDavid du Colombier putmem_w(fd+4, p[1]);
5433e12c5d1SDavid du Colombier }
5449a747e4fSDavid du Colombier reg.r[REGRET] = n;
5453e12c5d1SDavid du Colombier }
5463e12c5d1SDavid du Colombier
5473e12c5d1SDavid du Colombier void
syscreate(void)5483e12c5d1SDavid du Colombier syscreate(void)
5493e12c5d1SDavid du Colombier {
5503e12c5d1SDavid du Colombier char file[1024];
5513e12c5d1SDavid du Colombier int n;
5523e12c5d1SDavid du Colombier ulong mode, name, perm;
5533e12c5d1SDavid du Colombier
5549a747e4fSDavid du Colombier name = getmem_w(reg.r[REGSP]+4);
5559a747e4fSDavid du Colombier mode = getmem_w(reg.r[REGSP]+8);
5569a747e4fSDavid du Colombier perm = getmem_w(reg.r[REGSP]+12);
5573e12c5d1SDavid du Colombier memio(file, name, sizeof(file), MemReadstring);
5583e12c5d1SDavid du Colombier if(sysdbg)
5593e12c5d1SDavid du Colombier itrace("create(0x%lux='%s', 0x%lux, 0x%lux)", name, file, mode, perm);
5603e12c5d1SDavid du Colombier
5613e12c5d1SDavid du Colombier n = create(file, mode, perm);
5623e12c5d1SDavid du Colombier if(n < 0)
5639a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
5643e12c5d1SDavid du Colombier
5659a747e4fSDavid du Colombier reg.r[REGRET] = n;
5663e12c5d1SDavid du Colombier }
5673e12c5d1SDavid du Colombier
5683e12c5d1SDavid du Colombier void
sysbrk_(void)5693e12c5d1SDavid du Colombier sysbrk_(void)
5703e12c5d1SDavid du Colombier {
5713e12c5d1SDavid du Colombier ulong addr, osize, nsize;
5723e12c5d1SDavid du Colombier Segment *s;
5733e12c5d1SDavid du Colombier
5749a747e4fSDavid du Colombier addr = getmem_w(reg.r[REGSP]+4);
5753e12c5d1SDavid du Colombier if(sysdbg)
5763e12c5d1SDavid du Colombier itrace("brk_(0x%lux)", addr);
5773e12c5d1SDavid du Colombier
5789a747e4fSDavid du Colombier reg.r[REGRET] = -1;
5793e12c5d1SDavid du Colombier if(addr < memory.seg[Data].base+datasize) {
5803e12c5d1SDavid du Colombier strcpy(errbuf, "address below segment");
5813e12c5d1SDavid du Colombier return;
5823e12c5d1SDavid du Colombier }
5833e12c5d1SDavid du Colombier if(addr > memory.seg[Stack].base) {
5843e12c5d1SDavid du Colombier strcpy(errbuf, "segment too big");
5853e12c5d1SDavid du Colombier return;
5863e12c5d1SDavid du Colombier }
5873e12c5d1SDavid du Colombier s = &memory.seg[Bss];
5883e12c5d1SDavid du Colombier if(addr > s->end) {
5890ce5db6cSDavid du Colombier osize = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
5903e12c5d1SDavid du Colombier addr = ((addr)+(BY2PG-1))&~(BY2PG-1);
5913e12c5d1SDavid du Colombier s->end = addr;
5920ce5db6cSDavid du Colombier nsize = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
5933e12c5d1SDavid du Colombier s->table = erealloc(s->table, osize, nsize);
5943e12c5d1SDavid du Colombier }
5953e12c5d1SDavid du Colombier
5969a747e4fSDavid du Colombier reg.r[REGRET] = 0;
5973e12c5d1SDavid du Colombier }
5983e12c5d1SDavid du Colombier
5993e12c5d1SDavid du Colombier void
sysremove(void)6003e12c5d1SDavid du Colombier sysremove(void)
6013e12c5d1SDavid du Colombier {
6023e12c5d1SDavid du Colombier char nambuf[1024];
6033e12c5d1SDavid du Colombier ulong name;
6043e12c5d1SDavid du Colombier int n;
6053e12c5d1SDavid du Colombier
6069a747e4fSDavid du Colombier name = getmem_w(reg.r[REGSP]+4);
6073e12c5d1SDavid du Colombier memio(nambuf, name, sizeof(nambuf), MemReadstring);
6083e12c5d1SDavid du Colombier if(sysdbg)
6093e12c5d1SDavid du Colombier itrace("remove(0x%lux='%s')", name, nambuf);
6103e12c5d1SDavid du Colombier
6113e12c5d1SDavid du Colombier n = remove(nambuf);
6123e12c5d1SDavid du Colombier if(n < 0)
6139a747e4fSDavid du Colombier errstr(errbuf, sizeof errbuf);
6149a747e4fSDavid du Colombier reg.r[REGRET] = n;
6159a747e4fSDavid du Colombier }
6169a747e4fSDavid du Colombier
6179a747e4fSDavid du Colombier void
sysnotify(void)6189a747e4fSDavid du Colombier sysnotify(void)
6199a747e4fSDavid du Colombier {
6209a747e4fSDavid du Colombier nofunc = getmem_w(reg.r[REGSP]+4);
6219a747e4fSDavid du Colombier if(sysdbg)
6229a747e4fSDavid du Colombier itrace("notify(0x%lux)\n", nofunc);
6239a747e4fSDavid du Colombier
6249a747e4fSDavid du Colombier reg.r[REGRET] = 0;
6253e12c5d1SDavid du Colombier }
6263e12c5d1SDavid du Colombier
6273e12c5d1SDavid du Colombier void
syssegflush(void)6287dd7cddfSDavid du Colombier syssegflush(void)
6297dd7cddfSDavid du Colombier {
6307dd7cddfSDavid du Colombier int n;
6317dd7cddfSDavid du Colombier ulong va;
6327dd7cddfSDavid du Colombier
6339a747e4fSDavid du Colombier va = getmem_w(reg.r[REGSP]+4);
6349a747e4fSDavid du Colombier n = getmem_w(reg.r[REGSP]+8);
6357dd7cddfSDavid du Colombier if(sysdbg)
6367dd7cddfSDavid du Colombier itrace("segflush(va=0x%lux, n=%d)\n", va, n);
6377dd7cddfSDavid du Colombier
6389a747e4fSDavid du Colombier reg.r[REGRET] = 0;
6397dd7cddfSDavid du Colombier }
6407dd7cddfSDavid du Colombier
sysfversion(void)6419a747e4fSDavid du Colombier void sysfversion(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
sysfsession(void)6429a747e4fSDavid du Colombier void sysfsession(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
sysfauth(void)6439a747e4fSDavid du Colombier void sysfauth(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
syswait(void)6449a747e4fSDavid du Colombier void syswait(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
syswstat(void)6459a747e4fSDavid du Colombier void syswstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sys_wstat(void)6469a747e4fSDavid du Colombier void sys_wstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysfwstat(void)6479a747e4fSDavid du Colombier void sysfwstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sys_fwstat(void)6489a747e4fSDavid du Colombier void sys_fwstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysnoted(void)6499a747e4fSDavid du Colombier void sysnoted(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
syssegattach(void)6509a747e4fSDavid du Colombier void syssegattach(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
syssegdetach(void)6519a747e4fSDavid du Colombier void syssegdetach(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
syssegfree(void)6529a747e4fSDavid du Colombier void syssegfree(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysrendezvous(void)6539a747e4fSDavid du Colombier void sysrendezvous(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysunmount(void)6549a747e4fSDavid du Colombier void sysunmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysfork(void)6559a747e4fSDavid du Colombier void sysfork(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysforkpgrp(void)6569a747e4fSDavid du Colombier void sysforkpgrp(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
syssegbrk(void)6579a747e4fSDavid du Colombier void syssegbrk(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
_sysmount(void)6589a747e4fSDavid du Colombier void _sysmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysalarm(void)6599a747e4fSDavid du Colombier void sysalarm(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysexec(void)6609a747e4fSDavid du Colombier void sysexec(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysmount(void)6619a747e4fSDavid du Colombier void sysmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
sysawait(void)6629a747e4fSDavid du Colombier void sysawait(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
6633e12c5d1SDavid du Colombier
6643e12c5d1SDavid du Colombier void (*systab[])(void) ={
6653e12c5d1SDavid du Colombier [SYSR1] sys1,
6669a747e4fSDavid du Colombier [_ERRSTR] sys_errstr,
6673e12c5d1SDavid du Colombier [BIND] sysbind,
6683e12c5d1SDavid du Colombier [CHDIR] syschdir,
6693e12c5d1SDavid du Colombier [CLOSE] sysclose,
6703e12c5d1SDavid du Colombier [DUP] sysdup,
6713e12c5d1SDavid du Colombier [ALARM] sysalarm,
6723e12c5d1SDavid du Colombier [EXEC] sysexec,
6733e12c5d1SDavid du Colombier [EXITS] sysexits,
6749a747e4fSDavid du Colombier [_FSESSION] sysfsession,
6759a747e4fSDavid du Colombier [FAUTH] sysfauth,
6769a747e4fSDavid du Colombier [_FSTAT] sys_fstat,
6773e12c5d1SDavid du Colombier [SEGBRK] syssegbrk,
6789a747e4fSDavid du Colombier [_MOUNT] _sysmount,
6793e12c5d1SDavid du Colombier [OPEN] sysopen,
6809a747e4fSDavid du Colombier [_READ] sys_read,
6819a747e4fSDavid du Colombier [OSEEK] sysoseek,
6823e12c5d1SDavid du Colombier [SLEEP] syssleep,
6839a747e4fSDavid du Colombier [_STAT] sys_stat,
6849a747e4fSDavid du Colombier [RFORK] sysrfork,
6859a747e4fSDavid du Colombier [_WRITE] sys_write,
6863e12c5d1SDavid du Colombier [PIPE] syspipe,
6873e12c5d1SDavid du Colombier [CREATE] syscreate,
6889a747e4fSDavid du Colombier [FD2PATH] sysfd2path,
6893e12c5d1SDavid du Colombier [BRK_] sysbrk_,
6903e12c5d1SDavid du Colombier [REMOVE] sysremove,
6919a747e4fSDavid du Colombier [_WSTAT] sys_wstat,
6929a747e4fSDavid du Colombier [_FWSTAT] sys_fwstat,
6933e12c5d1SDavid du Colombier [NOTIFY] sysnotify,
6943e12c5d1SDavid du Colombier [NOTED] sysnoted,
6953e12c5d1SDavid du Colombier [SEGATTACH] syssegattach,
6963e12c5d1SDavid du Colombier [SEGDETACH] syssegdetach,
6973e12c5d1SDavid du Colombier [SEGFREE] syssegfree,
6983e12c5d1SDavid du Colombier [SEGFLUSH] syssegflush,
6993e12c5d1SDavid du Colombier [RENDEZVOUS] sysrendezvous,
7003e12c5d1SDavid du Colombier [UNMOUNT] sysunmount,
7019a747e4fSDavid du Colombier [_WAIT] syswait,
7029a747e4fSDavid du Colombier [SEEK] sysseek,
7039a747e4fSDavid du Colombier [FVERSION] sysfversion,
7049a747e4fSDavid du Colombier [ERRSTR] syserrstr,
7059a747e4fSDavid du Colombier [STAT] sysstat,
7069a747e4fSDavid du Colombier [FSTAT] sysfstat,
7079a747e4fSDavid du Colombier [WSTAT] syswstat,
7089a747e4fSDavid du Colombier [FWSTAT] sysfwstat,
7099a747e4fSDavid du Colombier [MOUNT] sysmount,
7109a747e4fSDavid du Colombier [AWAIT] sysawait,
7119a747e4fSDavid du Colombier [PREAD] syspread,
7129a747e4fSDavid du Colombier [PWRITE] syspwrite,
7133e12c5d1SDavid du Colombier };
7143e12c5d1SDavid du Colombier
7153e12c5d1SDavid du Colombier void
Ssyscall(ulong inst)7163e12c5d1SDavid du Colombier Ssyscall(ulong inst)
7173e12c5d1SDavid du Colombier {
7183e12c5d1SDavid du Colombier int call;
7193e12c5d1SDavid du Colombier
7203e12c5d1SDavid du Colombier USED(inst);
7219a747e4fSDavid du Colombier call = reg.r[REGRET];
7229a747e4fSDavid du Colombier if(call < 0 || call > PWRITE || systab[call] == nil) {
7233e12c5d1SDavid du Colombier Bprint(bioout, "Bad system call\n");
7243e12c5d1SDavid du Colombier dumpreg();
7253e12c5d1SDavid du Colombier }
7263e12c5d1SDavid du Colombier if(trace)
7273e12c5d1SDavid du Colombier itrace("sysc\t%s", sysctab[call]);
7283e12c5d1SDavid du Colombier
7293e12c5d1SDavid du Colombier (*systab[call])();
7303e12c5d1SDavid du Colombier Bflush(bioout);
7313e12c5d1SDavid du Colombier }
732