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 "sparc.h" 73e12c5d1SDavid du Colombier #undef CHDIR 83e12c5d1SDavid du Colombier 93e12c5d1SDavid du Colombier char errbuf[ERRLEN]; 103e12c5d1SDavid du Colombier ulong nofunc; 113e12c5d1SDavid du Colombier 123e12c5d1SDavid du Colombier #define SYSR1 0 133e12c5d1SDavid du Colombier #define ERRSTR 1 143e12c5d1SDavid du Colombier #define BIND 2 153e12c5d1SDavid du Colombier #define CHDIR 3 163e12c5d1SDavid du Colombier #define CLOSE 4 173e12c5d1SDavid du Colombier #define DUP 5 183e12c5d1SDavid du Colombier #define ALARM 6 193e12c5d1SDavid du Colombier #define EXEC 7 203e12c5d1SDavid du Colombier #define EXITS 8 213e12c5d1SDavid du Colombier #define FORK 9 223e12c5d1SDavid du Colombier #define FORKPGRP 10 233e12c5d1SDavid du Colombier #define FSTAT 11 243e12c5d1SDavid du Colombier #define SEGBRK 12 253e12c5d1SDavid du Colombier #define MOUNT 13 263e12c5d1SDavid du Colombier #define OPEN 14 273e12c5d1SDavid du Colombier #define READ 15 283e12c5d1SDavid du Colombier #define SEEK 16 293e12c5d1SDavid du Colombier #define SLEEP 17 303e12c5d1SDavid du Colombier #define STAT 18 313e12c5d1SDavid du Colombier #define WAIT 19 323e12c5d1SDavid du Colombier #define WRITE 20 333e12c5d1SDavid du Colombier #define PIPE 21 343e12c5d1SDavid du Colombier #define CREATE 22 353e12c5d1SDavid du Colombier #define RFORK 23 363e12c5d1SDavid du Colombier #define BRK_ 24 373e12c5d1SDavid du Colombier #define REMOVE 25 383e12c5d1SDavid du Colombier #define WSTAT 26 393e12c5d1SDavid du Colombier #define FWSTAT 27 403e12c5d1SDavid du Colombier #define NOTIFY 28 413e12c5d1SDavid du Colombier #define NOTED 29 423e12c5d1SDavid du Colombier #define SEGATTACH 30 433e12c5d1SDavid du Colombier #define SEGDETACH 31 443e12c5d1SDavid du Colombier #define SEGFREE 32 453e12c5d1SDavid du Colombier #define SEGFLUSH 33 463e12c5d1SDavid du Colombier #define RENDEZVOUS 34 473e12c5d1SDavid du Colombier #define UNMOUNT 35 483e12c5d1SDavid du Colombier 493e12c5d1SDavid du Colombier char *sysctab[]={ 503e12c5d1SDavid du Colombier [SYSR1] "Running", 513e12c5d1SDavid du Colombier [ERRSTR] "Errstr", 523e12c5d1SDavid du Colombier [BIND] "Bind", 533e12c5d1SDavid du Colombier [CHDIR] "Chdir", 543e12c5d1SDavid du Colombier [CLOSE] "Close", 553e12c5d1SDavid du Colombier [DUP] "Dup", 563e12c5d1SDavid du Colombier [ALARM] "Alarm", 573e12c5d1SDavid du Colombier [EXEC] "Exec", 583e12c5d1SDavid du Colombier [EXITS] "Exits", 593e12c5d1SDavid du Colombier [FORK] "Fork", 603e12c5d1SDavid du Colombier [FORKPGRP] "Forkpgrp", 613e12c5d1SDavid du Colombier [FSTAT] "Fstat", 623e12c5d1SDavid du Colombier [SEGBRK] "Segbrk", 633e12c5d1SDavid du Colombier [MOUNT] "Mount", 643e12c5d1SDavid du Colombier [OPEN] "Open", 653e12c5d1SDavid du Colombier [READ] "Read", 663e12c5d1SDavid du Colombier [SEEK] "Seek", 673e12c5d1SDavid du Colombier [SLEEP] "Sleep", 683e12c5d1SDavid du Colombier [STAT] "Stat", 693e12c5d1SDavid du Colombier [WAIT] "Wait", 703e12c5d1SDavid du Colombier [WRITE] "Write", 713e12c5d1SDavid du Colombier [PIPE] "Pipe", 723e12c5d1SDavid du Colombier [CREATE] "Create", 733e12c5d1SDavid du Colombier [RFORK] "Rfork", 743e12c5d1SDavid du Colombier [BRK_] "Brk", 753e12c5d1SDavid du Colombier [REMOVE] "Remove", 763e12c5d1SDavid du Colombier [WSTAT] "Wstat", 773e12c5d1SDavid du Colombier [FWSTAT] "Fwstat", 783e12c5d1SDavid du Colombier [NOTIFY] "Notify", 793e12c5d1SDavid du Colombier [NOTED] "Noted", 803e12c5d1SDavid du Colombier [SEGATTACH] "Segattach", 813e12c5d1SDavid du Colombier [SEGDETACH] "Segdetach", 823e12c5d1SDavid du Colombier [SEGFREE] "Segfree", 833e12c5d1SDavid du Colombier [SEGFLUSH] "Segflush", 843e12c5d1SDavid du Colombier [RENDEZVOUS] "Rendez", 853e12c5d1SDavid du Colombier [UNMOUNT] "Unmount", 863e12c5d1SDavid du Colombier }; 873e12c5d1SDavid du Colombier 883e12c5d1SDavid du Colombier void sys1(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[7]]); exits(0); } 893e12c5d1SDavid du Colombier 903e12c5d1SDavid du Colombier void 913e12c5d1SDavid du Colombier syserrstr(void) 923e12c5d1SDavid du Colombier { 933e12c5d1SDavid du Colombier ulong str; 943e12c5d1SDavid du Colombier 953e12c5d1SDavid du Colombier str = getmem_w(reg.r[1]+4); 963e12c5d1SDavid du Colombier if(sysdbg) 973e12c5d1SDavid du Colombier itrace("errstr(0x%lux)", str); 983e12c5d1SDavid du Colombier 993e12c5d1SDavid du Colombier memio(errbuf, str, ERRLEN, MemWrite); 1003e12c5d1SDavid du Colombier strcpy(errbuf, "no error"); 1013e12c5d1SDavid du Colombier reg.r[7] = 0; 1023e12c5d1SDavid du Colombier } 1033e12c5d1SDavid du Colombier void 1043e12c5d1SDavid du Colombier sysbind(void) 1053e12c5d1SDavid du Colombier { 1063e12c5d1SDavid du Colombier ulong pname, pold, flags; 1073e12c5d1SDavid du Colombier char name[7024], old[7024]; 1083e12c5d1SDavid du Colombier int n; 1093e12c5d1SDavid du Colombier 1103e12c5d1SDavid du Colombier pname = getmem_w(reg.r[1]+4); 1113e12c5d1SDavid du Colombier pold = getmem_w(reg.r[1]+8); 1123e12c5d1SDavid du Colombier flags = getmem_w(reg.r[1]+12); 1133e12c5d1SDavid du Colombier memio(name, pname, sizeof(name), MemReadstring); 1143e12c5d1SDavid du Colombier memio(old, pold, sizeof(old), MemReadstring); 1153e12c5d1SDavid du Colombier if(sysdbg) 1163e12c5d1SDavid du Colombier itrace("bind(0x%lux='%s', 0x%lux='%s', 0x%lux)", name, old, flags); 1173e12c5d1SDavid du Colombier 1183e12c5d1SDavid du Colombier n = bind(name, old, flags); 1193e12c5d1SDavid du Colombier if(n < 0) 1203e12c5d1SDavid du Colombier errstr(errbuf); 1213e12c5d1SDavid du Colombier 1223e12c5d1SDavid du Colombier reg.r[7] = n; 1233e12c5d1SDavid du Colombier } 1243e12c5d1SDavid du Colombier 1253e12c5d1SDavid du Colombier void 1263e12c5d1SDavid du Colombier syschdir(void) 1273e12c5d1SDavid du Colombier { 1283e12c5d1SDavid du Colombier char file[7024]; 1293e12c5d1SDavid du Colombier int n; 1303e12c5d1SDavid du Colombier ulong name; 1313e12c5d1SDavid du Colombier 1323e12c5d1SDavid du Colombier name = getmem_w(reg.r[1]+4); 1333e12c5d1SDavid du Colombier memio(file, name, sizeof(file), MemReadstring); 1343e12c5d1SDavid du Colombier if(sysdbg) 1353e12c5d1SDavid du Colombier itrace("chdir(0x%lux='%s', 0x%lux)", name, file); 1363e12c5d1SDavid du Colombier 1373e12c5d1SDavid du Colombier n = chdir(file); 1383e12c5d1SDavid du Colombier if(n < 0) 1393e12c5d1SDavid du Colombier errstr(errbuf); 1403e12c5d1SDavid du Colombier 1413e12c5d1SDavid du Colombier reg.r[7] = n; 1423e12c5d1SDavid du Colombier } 1433e12c5d1SDavid du Colombier 1443e12c5d1SDavid du Colombier void 1453e12c5d1SDavid du Colombier sysclose(void) 1463e12c5d1SDavid du Colombier { 1473e12c5d1SDavid du Colombier int n; 1483e12c5d1SDavid du Colombier ulong fd; 1493e12c5d1SDavid du Colombier 1503e12c5d1SDavid du Colombier fd = getmem_w(reg.r[1]+4); 1513e12c5d1SDavid du Colombier if(sysdbg) 1523e12c5d1SDavid du Colombier itrace("close(%d)", fd); 1533e12c5d1SDavid du Colombier 1543e12c5d1SDavid du Colombier n = close(fd); 1553e12c5d1SDavid du Colombier if(n < 0) 1563e12c5d1SDavid du Colombier errstr(errbuf); 1573e12c5d1SDavid du Colombier reg.r[7] = n; 1583e12c5d1SDavid du Colombier } 1593e12c5d1SDavid du Colombier 1603e12c5d1SDavid du Colombier void 1613e12c5d1SDavid du Colombier sysdup(void) 1623e12c5d1SDavid du Colombier { 1633e12c5d1SDavid du Colombier int oldfd, newfd; 1643e12c5d1SDavid du Colombier int n; 1653e12c5d1SDavid du Colombier 1663e12c5d1SDavid du Colombier oldfd = getmem_w(reg.r[1]+4); 1673e12c5d1SDavid du Colombier newfd = getmem_w(reg.r[1]+8); 1683e12c5d1SDavid du Colombier if(sysdbg) 1693e12c5d1SDavid du Colombier itrace("dup(%d, %d)", oldfd, newfd); 1703e12c5d1SDavid du Colombier 1713e12c5d1SDavid du Colombier n = dup(oldfd, newfd); 1723e12c5d1SDavid du Colombier if(n < 0) 1733e12c5d1SDavid du Colombier errstr(errbuf); 1743e12c5d1SDavid du Colombier reg.r[7] = n; 1753e12c5d1SDavid du Colombier } 1763e12c5d1SDavid du Colombier 1773e12c5d1SDavid du Colombier void 1783e12c5d1SDavid du Colombier sysexits(void) 1793e12c5d1SDavid du Colombier { 1803e12c5d1SDavid du Colombier char buf[ERRLEN]; 1813e12c5d1SDavid du Colombier ulong str; 1823e12c5d1SDavid du Colombier 1833e12c5d1SDavid du Colombier str = getmem_w(reg.r[1]+4); 1843e12c5d1SDavid du Colombier if(sysdbg) 1853e12c5d1SDavid du Colombier itrace("exits(0x%lux)", str); 1863e12c5d1SDavid du Colombier 1873e12c5d1SDavid du Colombier count = 1; 1883e12c5d1SDavid du Colombier if(str != 0) { 1893e12c5d1SDavid du Colombier memio(buf, str, ERRLEN, MemRead); 1903e12c5d1SDavid du Colombier Bprint(bioout, "exits(%s)\n", buf); 1913e12c5d1SDavid du Colombier } 1923e12c5d1SDavid du Colombier else 1933e12c5d1SDavid du Colombier Bprint(bioout, "exits(0)\n"); 1943e12c5d1SDavid du Colombier } 1953e12c5d1SDavid du Colombier 1963e12c5d1SDavid du Colombier void 1973e12c5d1SDavid du Colombier sysopen(void) 1983e12c5d1SDavid du Colombier { 1993e12c5d1SDavid du Colombier char file[7024]; 2003e12c5d1SDavid du Colombier int n; 2013e12c5d1SDavid du Colombier ulong mode, name; 2023e12c5d1SDavid du Colombier 2033e12c5d1SDavid du Colombier name = getmem_w(reg.r[1]+4); 2043e12c5d1SDavid du Colombier mode = getmem_w(reg.r[1]+8); 2053e12c5d1SDavid du Colombier memio(file, name, sizeof(file), MemReadstring); 2063e12c5d1SDavid du Colombier if(sysdbg) 2073e12c5d1SDavid du Colombier itrace("open(0x%lux='%s', 0x%lux)", name, file, mode); 2083e12c5d1SDavid du Colombier 2093e12c5d1SDavid du Colombier n = open(file, mode); 2103e12c5d1SDavid du Colombier if(n < 0) 2113e12c5d1SDavid du Colombier errstr(errbuf); 2123e12c5d1SDavid du Colombier 2133e12c5d1SDavid du Colombier reg.r[7] = n; 2143e12c5d1SDavid du Colombier }; 2153e12c5d1SDavid du Colombier 2163e12c5d1SDavid du Colombier void 2173e12c5d1SDavid du Colombier sysread(void) 2183e12c5d1SDavid du Colombier { 2193e12c5d1SDavid du Colombier int fd; 2203e12c5d1SDavid du Colombier ulong size, a; 2213e12c5d1SDavid du Colombier char *buf, *p; 2223e12c5d1SDavid du Colombier int c, n, cnt; 2233e12c5d1SDavid du Colombier 2243e12c5d1SDavid du Colombier fd = getmem_w(reg.r[1]+4); 2253e12c5d1SDavid du Colombier a = getmem_w(reg.r[1]+8); 2263e12c5d1SDavid du Colombier size = getmem_w(reg.r[1]+12); 2273e12c5d1SDavid du Colombier 2283e12c5d1SDavid du Colombier buf = emalloc(size); 2293e12c5d1SDavid du Colombier if(fd == 0) { 2303e12c5d1SDavid du Colombier print("\nstdin>>"); 2313e12c5d1SDavid du Colombier p = buf; 2323e12c5d1SDavid du Colombier n = 0; 2333e12c5d1SDavid du Colombier cnt = size; 2343e12c5d1SDavid du Colombier while(cnt) { 2353e12c5d1SDavid du Colombier c = Bgetc(bin); 2363e12c5d1SDavid du Colombier if(c <= 0) 2373e12c5d1SDavid du Colombier break; 2383e12c5d1SDavid du Colombier *p++ = c; 2393e12c5d1SDavid du Colombier n++; 2403e12c5d1SDavid du Colombier cnt--; 2413e12c5d1SDavid du Colombier if(c == '\n') 2423e12c5d1SDavid du Colombier break; 2433e12c5d1SDavid du Colombier } 2443e12c5d1SDavid du Colombier } 2453e12c5d1SDavid du Colombier else 2463e12c5d1SDavid du Colombier n = read(fd, buf, size); 2473e12c5d1SDavid du Colombier 2483e12c5d1SDavid du Colombier if(n < 0) 2493e12c5d1SDavid du Colombier errstr(errbuf); 2503e12c5d1SDavid du Colombier else 2513e12c5d1SDavid du Colombier memio(buf, a, n, MemWrite); 2523e12c5d1SDavid du Colombier 2533e12c5d1SDavid du Colombier if(sysdbg) 2543e12c5d1SDavid du Colombier itrace("read(%d, 0x%lux, %d) = %d", fd, a, size, n); 2553e12c5d1SDavid du Colombier 2563e12c5d1SDavid du Colombier free(buf); 2573e12c5d1SDavid du Colombier reg.r[7] = n; 2583e12c5d1SDavid du Colombier } 2593e12c5d1SDavid du Colombier 2603e12c5d1SDavid du Colombier void 2613e12c5d1SDavid du Colombier sysseek(void) 2623e12c5d1SDavid du Colombier { 2633e12c5d1SDavid du Colombier int fd, n; 2643e12c5d1SDavid du Colombier ulong off, mode; 2653e12c5d1SDavid du Colombier 2663e12c5d1SDavid du Colombier fd = getmem_w(reg.r[1]+4); 2673e12c5d1SDavid du Colombier off = getmem_w(reg.r[1]+8); 2683e12c5d1SDavid du Colombier mode = getmem_w(reg.r[1]+12); 2693e12c5d1SDavid du Colombier if(sysdbg) 2703e12c5d1SDavid du Colombier itrace("seek(%d, %lud, %d)", fd, off, mode); 2713e12c5d1SDavid du Colombier 2723e12c5d1SDavid du Colombier n = seek(fd, off, mode); 2733e12c5d1SDavid du Colombier if(n < 0) 2743e12c5d1SDavid du Colombier errstr(errbuf); 2753e12c5d1SDavid du Colombier 2763e12c5d1SDavid du Colombier reg.r[7] = n; 2773e12c5d1SDavid du Colombier } 2783e12c5d1SDavid du Colombier 2793e12c5d1SDavid du Colombier void 2803e12c5d1SDavid du Colombier syssleep(void) 2813e12c5d1SDavid du Colombier { 2823e12c5d1SDavid du Colombier ulong len; 2833e12c5d1SDavid du Colombier int n; 2843e12c5d1SDavid du Colombier 2853e12c5d1SDavid du Colombier len = getmem_w(reg.r[1]+4); 2863e12c5d1SDavid du Colombier if(sysdbg) 2873e12c5d1SDavid du Colombier itrace("sleep(%d)", len); 2883e12c5d1SDavid du Colombier 2893e12c5d1SDavid du Colombier n = sleep(len); 2903e12c5d1SDavid du Colombier if(n < 0) 2913e12c5d1SDavid du Colombier errstr(errbuf); 2923e12c5d1SDavid du Colombier 2933e12c5d1SDavid du Colombier reg.r[7] = n; 2943e12c5d1SDavid du Colombier } 2953e12c5d1SDavid du Colombier 2963e12c5d1SDavid du Colombier void 2973e12c5d1SDavid du Colombier sysstat(void) 2983e12c5d1SDavid du Colombier { 2993e12c5d1SDavid du Colombier char nambuf[7024]; 3003e12c5d1SDavid du Colombier char buf[DIRLEN]; 3013e12c5d1SDavid du Colombier ulong edir, name; 3023e12c5d1SDavid du Colombier int n; 3033e12c5d1SDavid du Colombier 3043e12c5d1SDavid du Colombier name = getmem_w(reg.r[1]+4); 3053e12c5d1SDavid du Colombier edir = getmem_w(reg.r[1]+8); 3063e12c5d1SDavid du Colombier memio(nambuf, name, sizeof(nambuf), MemReadstring); 3073e12c5d1SDavid du Colombier if(sysdbg) 3083e12c5d1SDavid du Colombier itrace("stat(0x%lux='%s', 0x%lux)", name, nambuf, edir); 3093e12c5d1SDavid du Colombier 3103e12c5d1SDavid du Colombier n = stat(nambuf, buf); 3113e12c5d1SDavid du Colombier if(n < 0) 3123e12c5d1SDavid du Colombier errstr(errbuf); 3133e12c5d1SDavid du Colombier else 3143e12c5d1SDavid du Colombier memio(buf, edir, DIRLEN, MemWrite); 3153e12c5d1SDavid du Colombier 3163e12c5d1SDavid du Colombier reg.r[7] = n; 3173e12c5d1SDavid du Colombier } 3183e12c5d1SDavid du Colombier 3193e12c5d1SDavid du Colombier void 3203e12c5d1SDavid du Colombier sysfstat(void) 3213e12c5d1SDavid du Colombier { 3223e12c5d1SDavid du Colombier char buf[DIRLEN]; 3233e12c5d1SDavid du Colombier ulong edir; 3243e12c5d1SDavid du Colombier int n, fd; 3253e12c5d1SDavid du Colombier 3263e12c5d1SDavid du Colombier fd = getmem_w(reg.r[1]+4); 3273e12c5d1SDavid du Colombier edir = getmem_w(reg.r[1]+8); 3283e12c5d1SDavid du Colombier if(sysdbg) 3293e12c5d1SDavid du Colombier itrace("fstat(%d, 0x%lux)", fd, edir); 3303e12c5d1SDavid du Colombier 3313e12c5d1SDavid du Colombier n = fstat(fd, buf); 3323e12c5d1SDavid du Colombier if(n < 0) 3333e12c5d1SDavid du Colombier errstr(errbuf); 3343e12c5d1SDavid du Colombier else 3353e12c5d1SDavid du Colombier memio(buf, edir, DIRLEN, MemWrite); 3363e12c5d1SDavid du Colombier 3373e12c5d1SDavid du Colombier reg.r[7] = n; 3383e12c5d1SDavid du Colombier } 3393e12c5d1SDavid du Colombier 3403e12c5d1SDavid du Colombier void 3413e12c5d1SDavid du Colombier syswrite(void) 3423e12c5d1SDavid du Colombier { 3433e12c5d1SDavid du Colombier int fd; 3443e12c5d1SDavid du Colombier ulong size, a; 3453e12c5d1SDavid du Colombier char *buf; 3463e12c5d1SDavid du Colombier int n; 3473e12c5d1SDavid du Colombier 3483e12c5d1SDavid du Colombier fd = getmem_w(reg.r[1]+4); 3493e12c5d1SDavid du Colombier a = getmem_w(reg.r[1]+8); 3503e12c5d1SDavid du Colombier size = getmem_w(reg.r[1]+12); 3513e12c5d1SDavid du Colombier if(sysdbg) 3523e12c5d1SDavid du Colombier itrace("write(%d, %lux, %d)", fd, a, size); 3533e12c5d1SDavid du Colombier 3543e12c5d1SDavid du Colombier buf = memio(0, a, size, MemRead); 3553e12c5d1SDavid du Colombier n = write(fd, buf, size); 3563e12c5d1SDavid du Colombier if(n < 0) 3573e12c5d1SDavid du Colombier errstr(errbuf); 3583e12c5d1SDavid du Colombier free(buf); 3593e12c5d1SDavid du Colombier 3603e12c5d1SDavid du Colombier reg.r[7] = n; 3613e12c5d1SDavid du Colombier } 3623e12c5d1SDavid du Colombier 3633e12c5d1SDavid du Colombier void 3643e12c5d1SDavid du Colombier syspipe(void) 3653e12c5d1SDavid du Colombier { 3663e12c5d1SDavid du Colombier int n, p[2]; 3673e12c5d1SDavid du Colombier ulong fd; 3683e12c5d1SDavid du Colombier 3693e12c5d1SDavid du Colombier fd = getmem_w(reg.r[1]+4); 3703e12c5d1SDavid du Colombier if(sysdbg) 3713e12c5d1SDavid du Colombier itrace("pipe(%lux)", fd); 3723e12c5d1SDavid du Colombier 3733e12c5d1SDavid du Colombier n = pipe(p); 3743e12c5d1SDavid du Colombier if(n < 0) 3753e12c5d1SDavid du Colombier errstr(errbuf); 3763e12c5d1SDavid du Colombier else { 3773e12c5d1SDavid du Colombier putmem_w(fd, p[0]); 3783e12c5d1SDavid du Colombier putmem_w(fd+4, p[1]); 3793e12c5d1SDavid du Colombier } 3803e12c5d1SDavid du Colombier reg.r[7] = n; 3813e12c5d1SDavid du Colombier } 3823e12c5d1SDavid du Colombier 3833e12c5d1SDavid du Colombier void 3843e12c5d1SDavid du Colombier syscreate(void) 3853e12c5d1SDavid du Colombier { 3863e12c5d1SDavid du Colombier char file[7024]; 3873e12c5d1SDavid du Colombier int n; 3883e12c5d1SDavid du Colombier ulong mode, name, perm; 3893e12c5d1SDavid du Colombier 3903e12c5d1SDavid du Colombier name = getmem_w(reg.r[1]+4); 3913e12c5d1SDavid du Colombier mode = getmem_w(reg.r[1]+8); 3923e12c5d1SDavid du Colombier perm = getmem_w(reg.r[1]+12); 3933e12c5d1SDavid du Colombier memio(file, name, sizeof(file), MemReadstring); 3943e12c5d1SDavid du Colombier if(sysdbg) 3953e12c5d1SDavid du Colombier itrace("create(0x%lux='%s', 0x%lux, 0x%lux)", name, file, mode, perm); 3963e12c5d1SDavid du Colombier 3973e12c5d1SDavid du Colombier n = create(file, mode, perm); 3983e12c5d1SDavid du Colombier if(n < 0) 3993e12c5d1SDavid du Colombier errstr(errbuf); 4003e12c5d1SDavid du Colombier 4013e12c5d1SDavid du Colombier reg.r[7] = n; 4023e12c5d1SDavid du Colombier } 4033e12c5d1SDavid du Colombier 4043e12c5d1SDavid du Colombier void 4053e12c5d1SDavid du Colombier sysbrk_(void) 4063e12c5d1SDavid du Colombier { 4073e12c5d1SDavid du Colombier ulong addr, osize, nsize; 4083e12c5d1SDavid du Colombier Segment *s; 4093e12c5d1SDavid du Colombier 4103e12c5d1SDavid du Colombier addr = getmem_w(reg.r[1]+4); 4113e12c5d1SDavid du Colombier if(sysdbg) 4123e12c5d1SDavid du Colombier itrace("brk_(0x%lux)", addr); 4133e12c5d1SDavid du Colombier 4143e12c5d1SDavid du Colombier reg.r[7] = -1; 4153e12c5d1SDavid du Colombier if(addr < memory.seg[Data].base+datasize) { 4163e12c5d1SDavid du Colombier strcpy(errbuf, "address below segment"); 4173e12c5d1SDavid du Colombier return; 4183e12c5d1SDavid du Colombier } 4193e12c5d1SDavid du Colombier if(addr > memory.seg[Stack].base) { 4203e12c5d1SDavid du Colombier strcpy(errbuf, "segment too big"); 4213e12c5d1SDavid du Colombier return; 4223e12c5d1SDavid du Colombier } 4233e12c5d1SDavid du Colombier s = &memory.seg[Bss]; 4243e12c5d1SDavid du Colombier if(addr > s->end) { 4253e12c5d1SDavid du Colombier osize = ((s->end-s->base)/BY2PG)*BY2WD; 4263e12c5d1SDavid du Colombier addr = ((addr)+(BY2PG-1))&~(BY2PG-1); 4273e12c5d1SDavid du Colombier s->end = addr; 4283e12c5d1SDavid du Colombier nsize = ((s->end-s->base)/BY2PG)*BY2WD; 4293e12c5d1SDavid du Colombier s->table = erealloc(s->table, osize, nsize); 4303e12c5d1SDavid du Colombier } 4313e12c5d1SDavid du Colombier 4323e12c5d1SDavid du Colombier reg.r[7] = 0; 4333e12c5d1SDavid du Colombier } 4343e12c5d1SDavid du Colombier 4353e12c5d1SDavid du Colombier void 4363e12c5d1SDavid du Colombier sysremove(void) 4373e12c5d1SDavid du Colombier { 4383e12c5d1SDavid du Colombier char nambuf[7024]; 4393e12c5d1SDavid du Colombier ulong name; 4403e12c5d1SDavid du Colombier int n; 4413e12c5d1SDavid du Colombier 4423e12c5d1SDavid du Colombier name = getmem_w(reg.r[1]+4); 4433e12c5d1SDavid du Colombier memio(nambuf, name, sizeof(nambuf), MemReadstring); 4443e12c5d1SDavid du Colombier if(sysdbg) 4453e12c5d1SDavid du Colombier itrace("remove(0x%lux='%s')", name, nambuf); 4463e12c5d1SDavid du Colombier 4473e12c5d1SDavid du Colombier n = remove(nambuf); 4483e12c5d1SDavid du Colombier if(n < 0) 4493e12c5d1SDavid du Colombier errstr(errbuf); 4503e12c5d1SDavid du Colombier reg.r[7] = n; 4513e12c5d1SDavid du Colombier } 4523e12c5d1SDavid du Colombier 4533e12c5d1SDavid du Colombier void 4543e12c5d1SDavid du Colombier sysnotify(void) 4553e12c5d1SDavid du Colombier { 4563e12c5d1SDavid du Colombier nofunc = getmem_w(reg.r[1]+4); 4573e12c5d1SDavid du Colombier if(sysdbg) 458*219b2ee8SDavid du Colombier itrace("notify(0x%lux)", nofunc); 4593e12c5d1SDavid du Colombier 4603e12c5d1SDavid du Colombier reg.r[7] = 0; 4613e12c5d1SDavid du Colombier } 4623e12c5d1SDavid du Colombier 463*219b2ee8SDavid du Colombier void syssegflush(void) 464*219b2ee8SDavid du Colombier { 465*219b2ee8SDavid du Colombier ulong start, len; 466*219b2ee8SDavid du Colombier 467*219b2ee8SDavid du Colombier start = getmem_w(reg.r[1]+4); 468*219b2ee8SDavid du Colombier len = getmem_w(reg.r[1]+8); 469*219b2ee8SDavid du Colombier if(sysdbg) 470*219b2ee8SDavid du Colombier itrace("segflush(0x%lux, 0x%lux)", start, len); 471*219b2ee8SDavid du Colombier reg.r[7] = 0; 472*219b2ee8SDavid du Colombier } 473*219b2ee8SDavid du Colombier 4743e12c5d1SDavid du Colombier void syswait(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[7]]); exits(0); } 4753e12c5d1SDavid du Colombier void sysrfork(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[7]]); exits(0);} 4763e12c5d1SDavid du Colombier void syswstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[7]]); exits(0);} 4773e12c5d1SDavid du Colombier void sysfwstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[7]]); exits(0);} 4783e12c5d1SDavid du Colombier void sysnoted(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[7]]); exits(0);} 4793e12c5d1SDavid du Colombier void syssegattach(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[7]]); exits(0);} 4803e12c5d1SDavid du Colombier void syssegdetach(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[7]]); exits(0);} 4813e12c5d1SDavid du Colombier void syssegfree(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[7]]); exits(0);} 4823e12c5d1SDavid du Colombier void sysrendezvous(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[7]]); exits(0);} 4833e12c5d1SDavid du Colombier void sysunmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[7]]); exits(0);} 4843e12c5d1SDavid du Colombier void sysfork(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[7]]); exits(0);} 4853e12c5d1SDavid du Colombier void sysforkpgrp(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[7]]); exits(0);} 4863e12c5d1SDavid du Colombier void syssegbrk(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[7]]); exits(0);} 4873e12c5d1SDavid du Colombier void sysmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[7]]); exits(0);} 4883e12c5d1SDavid du Colombier void sysalarm(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[7]]); exits(0);} 4893e12c5d1SDavid du Colombier void sysexec(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[7]]); exits(0);} 4903e12c5d1SDavid du Colombier 4913e12c5d1SDavid du Colombier void (*systab[])(void) ={ 4923e12c5d1SDavid du Colombier [SYSR1] sys1, 4933e12c5d1SDavid du Colombier [ERRSTR] syserrstr, 4943e12c5d1SDavid du Colombier [BIND] sysbind, 4953e12c5d1SDavid du Colombier [CHDIR] syschdir, 4963e12c5d1SDavid du Colombier [CLOSE] sysclose, 4973e12c5d1SDavid du Colombier [DUP] sysdup, 4983e12c5d1SDavid du Colombier [ALARM] sysalarm, 4993e12c5d1SDavid du Colombier [EXEC] sysexec, 5003e12c5d1SDavid du Colombier [EXITS] sysexits, 5013e12c5d1SDavid du Colombier [FORK] sysfork, 5023e12c5d1SDavid du Colombier [FORKPGRP] sysforkpgrp, 5033e12c5d1SDavid du Colombier [FSTAT] sysfstat, 5043e12c5d1SDavid du Colombier [SEGBRK] syssegbrk, 5053e12c5d1SDavid du Colombier [MOUNT] sysmount, 5063e12c5d1SDavid du Colombier [OPEN] sysopen, 5073e12c5d1SDavid du Colombier [READ] sysread, 5083e12c5d1SDavid du Colombier [SEEK] sysseek, 5093e12c5d1SDavid du Colombier [SLEEP] syssleep, 5103e12c5d1SDavid du Colombier [STAT] sysstat, 5113e12c5d1SDavid du Colombier [WAIT] syswait, 5123e12c5d1SDavid du Colombier [WRITE] syswrite, 5133e12c5d1SDavid du Colombier [PIPE] syspipe, 5143e12c5d1SDavid du Colombier [CREATE] syscreate, 5153e12c5d1SDavid du Colombier [RFORK] sysrfork, 5163e12c5d1SDavid du Colombier [BRK_] sysbrk_, 5173e12c5d1SDavid du Colombier [REMOVE] sysremove, 5183e12c5d1SDavid du Colombier [WSTAT] syswstat, 5193e12c5d1SDavid du Colombier [FWSTAT] sysfwstat, 5203e12c5d1SDavid du Colombier [NOTIFY] sysnotify, 5213e12c5d1SDavid du Colombier [NOTED] sysnoted, 5223e12c5d1SDavid du Colombier [SEGATTACH] syssegattach, 5233e12c5d1SDavid du Colombier [SEGDETACH] syssegdetach, 5243e12c5d1SDavid du Colombier [SEGFREE] syssegfree, 5253e12c5d1SDavid du Colombier [SEGFLUSH] syssegflush, 5263e12c5d1SDavid du Colombier [RENDEZVOUS] sysrendezvous, 5273e12c5d1SDavid du Colombier [UNMOUNT] sysunmount, 5283e12c5d1SDavid du Colombier }; 5293e12c5d1SDavid du Colombier 5303e12c5d1SDavid du Colombier void 5313e12c5d1SDavid du Colombier ta(ulong inst) 5323e12c5d1SDavid du Colombier { 5333e12c5d1SDavid du Colombier int call; 5343e12c5d1SDavid du Colombier 5353e12c5d1SDavid du Colombier USED(inst); 5363e12c5d1SDavid du Colombier call = reg.r[7]; 5373e12c5d1SDavid du Colombier if(call < 0 || call > UNMOUNT) { 5383e12c5d1SDavid du Colombier Bprint(bioout, "Bad system call\n"); 5393e12c5d1SDavid du Colombier dumpreg(); 5403e12c5d1SDavid du Colombier } 5413e12c5d1SDavid du Colombier if(trace) 5423e12c5d1SDavid du Colombier itrace("ta\t$0+R0\t%s", sysctab[call]); 5433e12c5d1SDavid du Colombier 5443e12c5d1SDavid du Colombier (*systab[call])(); 5453e12c5d1SDavid du Colombier Bflush(bioout); 5463e12c5d1SDavid du Colombier } 547