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