1*9a747e4fSDavid du Colombier// print system calls 2*9a747e4fSDavid du Colombierdefn printstring(s) 3*9a747e4fSDavid du Colombier{ 4*9a747e4fSDavid du Colombier print("\"", s, "\""); 5*9a747e4fSDavid du Colombier} 6*9a747e4fSDavid du Colombier 7*9a747e4fSDavid du Colombierdefn printtextordata(addr, n) 8*9a747e4fSDavid du Colombier{ 9*9a747e4fSDavid du Colombier local a, i; 10*9a747e4fSDavid du Colombier 11*9a747e4fSDavid du Colombier a = addr\c; 12*9a747e4fSDavid du Colombier i = 0; 13*9a747e4fSDavid du Colombier loop 1, n do { 14*9a747e4fSDavid du Colombier if (a[i]>=127) then { 15*9a747e4fSDavid du Colombier print(fmt(addr, 'X'), ", ", n\D); 16*9a747e4fSDavid du Colombier return {}; 17*9a747e4fSDavid du Colombier } 18*9a747e4fSDavid du Colombier i = i+1; 19*9a747e4fSDavid du Colombier } 20*9a747e4fSDavid du Colombier 21*9a747e4fSDavid du Colombier print("\""); 22*9a747e4fSDavid du Colombier printstringn(addr, n); 23*9a747e4fSDavid du Colombier print("\""); 24*9a747e4fSDavid du Colombier} 25*9a747e4fSDavid du Colombier 26*9a747e4fSDavid du Colombierdefn printstringn(s, n) 27*9a747e4fSDavid du Colombier{ 28*9a747e4fSDavid du Colombier local m; 29*9a747e4fSDavid du Colombier 30*9a747e4fSDavid du Colombier m = n; 31*9a747e4fSDavid du Colombier if (m > 100) then m = 100; 32*9a747e4fSDavid du Colombier loop 1,m do { 33*9a747e4fSDavid du Colombier print(*(s\c)); s=s+1; 34*9a747e4fSDavid du Colombier } 35*9a747e4fSDavid du Colombier if(m != n) then print("..."); 36*9a747e4fSDavid du Colombier} 37*9a747e4fSDavid du Colombier 38*9a747e4fSDavid du Colombierdefn printsyscall(name, fmt, arg) { 39*9a747e4fSDavid du Colombier local f, i, a, argp, sl; 40*9a747e4fSDavid du Colombier 41*9a747e4fSDavid du Colombier print(name, "("); 42*9a747e4fSDavid du Colombier i = 0; 43*9a747e4fSDavid du Colombier a = eval arg; 44*9a747e4fSDavid du Colombier while fmt[i] != 0 do { 45*9a747e4fSDavid du Colombier if fmt[i] == 's' then { 46*9a747e4fSDavid du Colombier if *a == 0 then 47*9a747e4fSDavid du Colombier print("nil"); 48*9a747e4fSDavid du Colombier else 49*9a747e4fSDavid du Colombier printstring(*(*a\s)); 50*9a747e4fSDavid du Colombier } else if fmt[i] == 'S' then { 51*9a747e4fSDavid du Colombier argp = *a; 52*9a747e4fSDavid du Colombier argl = {}; 53*9a747e4fSDavid du Colombier while *argp != 0 do { 54*9a747e4fSDavid du Colombier argl = append argl, *(*argp\s); 55*9a747e4fSDavid du Colombier argp++; 56*9a747e4fSDavid du Colombier } 57*9a747e4fSDavid du Colombier print(argl); 58*9a747e4fSDavid du Colombier } else if (fmt[i] == 'Z') && (~*a == 0) then { 59*9a747e4fSDavid du Colombier print("-1"); 60*9a747e4fSDavid du Colombier a++; // advance extra word for quadword 61*9a747e4fSDavid du Colombier } else if (fmt[i] == 'Y') || (fmt[i] == 'V') then { 62*9a747e4fSDavid du Colombier print(fmt(*a, fmt[i])); 63*9a747e4fSDavid du Colombier a++; // advance extra word for quadword 64*9a747e4fSDavid du Colombier } else if (fmt[i] == 'T') then { 65*9a747e4fSDavid du Colombier if *a == 0 then 66*9a747e4fSDavid du Colombier print("nil"); 67*9a747e4fSDavid du Colombier else 68*9a747e4fSDavid du Colombier printtextordata(*a, a[1]); 69*9a747e4fSDavid du Colombier } else 70*9a747e4fSDavid du Colombier print(fmt(*a, fmt[i])); 71*9a747e4fSDavid du Colombier if fmt[i+1] != 0 then 72*9a747e4fSDavid du Colombier print(", "); 73*9a747e4fSDavid du Colombier i = i+1; 74*9a747e4fSDavid du Colombier a++; 75*9a747e4fSDavid du Colombier } 76*9a747e4fSDavid du Colombier print(")\n"); 77*9a747e4fSDavid du Colombier} 78*9a747e4fSDavid du Colombier 79*9a747e4fSDavid du Colombierdefn code(*e) { return e; } 80*9a747e4fSDavid du Colombier 81*9a747e4fSDavid du Colombiersyscalls = { 82*9a747e4fSDavid du Colombier { 0, {"sysr1", "s", code(0)}}, 83*9a747e4fSDavid du Colombier { 1, {"_errstr", "s", code(*sys_errstr:arg)}}, 84*9a747e4fSDavid du Colombier { 2, {"bind", "ssX", code(*sysbind:arg)}}, 85*9a747e4fSDavid du Colombier { 3, {"chdir", "s", code(*sysbind:arg)}}, 86*9a747e4fSDavid du Colombier { 4, {"close", "D", code(*sysclose:arg)}}, 87*9a747e4fSDavid du Colombier { 5, {"dup", "DD", code(*sysdup:arg)}}, 88*9a747e4fSDavid du Colombier { 6, {"alarm", "D", code(*sysalarm:arg)}}, 89*9a747e4fSDavid du Colombier { 7, {"exec", "sS", code(*sysexec:arg)}}, 90*9a747e4fSDavid du Colombier { 8, {"exits", "s", code(*sysexits:arg)}}, 91*9a747e4fSDavid du Colombier { 9, {"_fsession", "DX", code(*sys_fsession:arg)}}, 92*9a747e4fSDavid du Colombier {10, {"fauth", "DX", code(*sysfauth:arg)}}, 93*9a747e4fSDavid du Colombier {11, {"_fstat", "DX", code(*sys_fstat:arg)}}, 94*9a747e4fSDavid du Colombier {12, {"segbrk", "XX", code(*syssegbrk:arg)}}, 95*9a747e4fSDavid du Colombier {13, {"_mount", "DsXs", code(*sys_mount:arg)}}, 96*9a747e4fSDavid du Colombier {14, {"open", "sD", code(*sysopen:arg)}}, 97*9a747e4fSDavid du Colombier {15, {"_read", "DXD", code(*sys_read:arg)}}, 98*9a747e4fSDavid du Colombier {16, {"oseek", "DDD", code(*sysoseek:arg)}}, 99*9a747e4fSDavid du Colombier {17, {"sleep", "D", code(*syssleep:arg)}}, 100*9a747e4fSDavid du Colombier {18, {"_stat", "sX", code(*sys_stat:arg)}}, 101*9a747e4fSDavid du Colombier {19, {"rfork", "X", code(*sysstat:arg)}}, 102*9a747e4fSDavid du Colombier {20, {"_write", "DXD", code(*sys_write:arg)}}, 103*9a747e4fSDavid du Colombier {21, {"pipe", "X", code(*syspipe:arg)}}, 104*9a747e4fSDavid du Colombier {22, {"create", "sDO", code(*syscreate:arg)}}, 105*9a747e4fSDavid du Colombier {23, {"fd2path", "DXD", code(*sysfd2path:arg)}}, 106*9a747e4fSDavid du Colombier {24, {"brk_", "X", code(*sysbrk_:arg)}}, 107*9a747e4fSDavid du Colombier {25, {"remove", "s", code(*sysremove:arg)}}, 108*9a747e4fSDavid du Colombier {26, {"_wstat", "sX", code(*sys_wstat:arg)}}, 109*9a747e4fSDavid du Colombier {27, {"_fwstat", "DX", code(*sys_fwstat:arg)}}, 110*9a747e4fSDavid du Colombier {28, {"notify", "X", code(*sysnotify:arg)}}, 111*9a747e4fSDavid du Colombier {29, {"noted", "D", code(*sysnoted:arg)}}, 112*9a747e4fSDavid du Colombier {30, {"segattach", "DsXD", code(*syssegattach:arg)}}, 113*9a747e4fSDavid du Colombier {31, {"segdetach", "X", code(*syssegdetach:arg)}}, 114*9a747e4fSDavid du Colombier {32, {"segfree", "XD", code(*syssegfree:arg)}}, 115*9a747e4fSDavid du Colombier {33, {"segflush", "XD", code(*syssegflush:arg)}}, 116*9a747e4fSDavid du Colombier {34, {"rendezvous", "XX", code(*sysrendezvous:arg)}}, 117*9a747e4fSDavid du Colombier {35, {"unmount", "ss", code(*sysunmount:arg)}}, 118*9a747e4fSDavid du Colombier {36, {"_wait", "X", code(*sys_wait:arg)}}, 119*9a747e4fSDavid du Colombier {39, {"seek", "XDVD", code(*sysseek:arg)}}, 120*9a747e4fSDavid du Colombier {40, {"fversion", "DDsD", code(*sysfversion:arg)}}, 121*9a747e4fSDavid du Colombier {41, {"errstr", "TD", code(*syserrstr:arg)}}, 122*9a747e4fSDavid du Colombier {42, {"stat", "sXD", code(*sysstat:arg)}}, 123*9a747e4fSDavid du Colombier {43, {"fstat", "DXD", code(*sysfstat:arg)}}, 124*9a747e4fSDavid du Colombier {44, {"wstat", "sXD", code(*syswstat:arg)}}, 125*9a747e4fSDavid du Colombier {45, {"fwstat", "DXD", code(*sysfwstat:arg)}}, 126*9a747e4fSDavid du Colombier {46, {"mount", "DDsXs", code(*sysmount:arg)}}, 127*9a747e4fSDavid du Colombier {47, {"await", "TD", code(*sysawait:arg)}}, 128*9a747e4fSDavid du Colombier {50, {"pread", "DXDZ", code(*syspread:arg)}}, 129*9a747e4fSDavid du Colombier {51, {"pwrite", "DTDZ", code(*syspwrite:arg)}}, 130*9a747e4fSDavid du Colombier}; 131*9a747e4fSDavid du Colombier 132*9a747e4fSDavid du Colombierdefn syscall() { 133*9a747e4fSDavid du Colombier local n, sl, h, p; 134*9a747e4fSDavid du Colombier 135*9a747e4fSDavid du Colombier map({"*data", 0, 0xffffffff, 0}); 136*9a747e4fSDavid du Colombier n = *syscall:scallnr; 137*9a747e4fSDavid du Colombier sl = syscalls; 138*9a747e4fSDavid du Colombier while sl != {} do { 139*9a747e4fSDavid du Colombier h = head sl; 140*9a747e4fSDavid du Colombier sl = tail sl; 141*9a747e4fSDavid du Colombier 142*9a747e4fSDavid du Colombier if n == h[0] then { 143*9a747e4fSDavid du Colombier p = h[1]; 144*9a747e4fSDavid du Colombier printsyscall(p[0], p[1], p[2]); 145*9a747e4fSDavid du Colombier } 146*9a747e4fSDavid du Colombier } 147*9a747e4fSDavid du Colombier} 148*9a747e4fSDavid du Colombier 149*9a747e4fSDavid du Colombierdefn UPCSPRET() { 150*9a747e4fSDavid du Colombier // return sys call number, address of first argument, location of syscall return value 151*9a747e4fSDavid du Colombier if objtype == "386" then 152*9a747e4fSDavid du Colombier return { code(*(*PC-4)), code(*SP+4), code(*AX) }; 153*9a747e4fSDavid du Colombier if (objtype == "mips") || (objtype == "mips2") then 154*9a747e4fSDavid du Colombier return { code(*(*PC-4) & 0xffff), code(*SP+4), code(*R1) }; 155*9a747e4fSDavid du Colombier if objtype == "arm" then 156*9a747e4fSDavid du Colombier return { code(*(*PC-4) & 0xffff), code(*SP+4), code(*R0) }; // untested 157*9a747e4fSDavid du Colombier if objtype == "alpha" then 158*9a747e4fSDavid du Colombier return { code(*(*PC-4) & 0xffff), code(*SP+4), code(*R0) }; // untested 159*9a747e4fSDavid du Colombier} 160*9a747e4fSDavid du Colombier 161*9a747e4fSDavid du Colombierdefn trapoffset() { 162*9a747e4fSDavid du Colombier // return offset from entry point to trap instr 163*9a747e4fSDavid du Colombier if objtype == "386" then return 5; 164*9a747e4fSDavid du Colombier if objtype == "mips" then return 8; 165*9a747e4fSDavid du Colombier if objtype == "mips2" then return 8; 166*9a747e4fSDavid du Colombier if objtype == "arm" then return 8; // untested 167*9a747e4fSDavid du Colombier if objtype == "alpha" then return 8; // untested 168*9a747e4fSDavid du Colombier} 169*9a747e4fSDavid du Colombier 170*9a747e4fSDavid du Colombierdefn trapreason() { 171*9a747e4fSDavid du Colombier // return reason for trap 172*9a747e4fSDavid du Colombier if objtype == "386" then return reason(*TRAP); 173*9a747e4fSDavid du Colombier if objtype == "mips" then return reason(*CAUSE); 174*9a747e4fSDavid du Colombier if objtype == "mips2" then return reason(*CAUSE); 175*9a747e4fSDavid du Colombier if objtype == "arm" then return "unknown trap"; // untested 176*9a747e4fSDavid du Colombier if objtype == "alpha" then return reason(cause); // untested 177*9a747e4fSDavid du Colombier} 178*9a747e4fSDavid du Colombier 179*9a747e4fSDavid du Colombier 180*9a747e4fSDavid du Colombierdefn usyscall() { // gives args for system call in user level; not useful with -k 181*9a747e4fSDavid du Colombier local n, sl, h, p; 182*9a747e4fSDavid du Colombier 183*9a747e4fSDavid du Colombier // stopped at TRAP instruction in system call library 184*9a747e4fSDavid du Colombier pcsp = UPCSPRET(); 185*9a747e4fSDavid du Colombier n = eval pcsp[0]; 186*9a747e4fSDavid du Colombier sl = syscalls; 187*9a747e4fSDavid du Colombier while sl != {} do { 188*9a747e4fSDavid du Colombier h = head sl; 189*9a747e4fSDavid du Colombier sl = tail sl; 190*9a747e4fSDavid du Colombier 191*9a747e4fSDavid du Colombier if n == h[0] then { 192*9a747e4fSDavid du Colombier p = h[1]; 193*9a747e4fSDavid du Colombier printsyscall(p[0], p[1], pcsp[1]); 194*9a747e4fSDavid du Colombier } 195*9a747e4fSDavid du Colombier } 196*9a747e4fSDavid du Colombier} 197