19a747e4fSDavid du Colombier// print system calls 29a747e4fSDavid du Colombierdefn printstring(s) 39a747e4fSDavid du Colombier{ 49a747e4fSDavid du Colombier print("\"", s, "\""); 59a747e4fSDavid du Colombier} 69a747e4fSDavid du Colombier 79a747e4fSDavid du Colombierdefn printtextordata(addr, n) 89a747e4fSDavid du Colombier{ 99a747e4fSDavid du Colombier local a, i; 109a747e4fSDavid du Colombier 119a747e4fSDavid du Colombier a = addr\c; 129a747e4fSDavid du Colombier i = 0; 139a747e4fSDavid du Colombier loop 1, n do { 149a747e4fSDavid du Colombier if (a[i]>=127) then { 159a747e4fSDavid du Colombier print(fmt(addr, 'X'), ", ", n\D); 169a747e4fSDavid du Colombier return {}; 179a747e4fSDavid du Colombier } 189a747e4fSDavid du Colombier i = i+1; 199a747e4fSDavid du Colombier } 209a747e4fSDavid du Colombier 219a747e4fSDavid du Colombier print("\""); 229a747e4fSDavid du Colombier printstringn(addr, n); 239a747e4fSDavid du Colombier print("\""); 249a747e4fSDavid du Colombier} 259a747e4fSDavid du Colombier 269a747e4fSDavid du Colombierdefn printstringn(s, n) 279a747e4fSDavid du Colombier{ 289a747e4fSDavid du Colombier local m; 299a747e4fSDavid du Colombier 309a747e4fSDavid du Colombier m = n; 319a747e4fSDavid du Colombier if (m > 100) then m = 100; 329a747e4fSDavid du Colombier loop 1,m do { 339a747e4fSDavid du Colombier print(*(s\c)); s=s+1; 349a747e4fSDavid du Colombier } 359a747e4fSDavid du Colombier if(m != n) then print("..."); 369a747e4fSDavid du Colombier} 379a747e4fSDavid du Colombier 389a747e4fSDavid du Colombierdefn printsyscall(name, fmt, arg) { 399a747e4fSDavid du Colombier local f, i, a, argp, sl; 409a747e4fSDavid du Colombier 419a747e4fSDavid du Colombier print(name, "("); 429a747e4fSDavid du Colombier i = 0; 439a747e4fSDavid du Colombier a = eval arg; 449a747e4fSDavid du Colombier while fmt[i] != 0 do { 459a747e4fSDavid du Colombier if fmt[i] == 's' then { 469a747e4fSDavid du Colombier if *a == 0 then 479a747e4fSDavid du Colombier print("nil"); 489a747e4fSDavid du Colombier else 499a747e4fSDavid du Colombier printstring(*(*a\s)); 509a747e4fSDavid du Colombier } else if fmt[i] == 'S' then { 519a747e4fSDavid du Colombier argp = *a; 529a747e4fSDavid du Colombier argl = {}; 539a747e4fSDavid du Colombier while *argp != 0 do { 549a747e4fSDavid du Colombier argl = append argl, *(*argp\s); 559a747e4fSDavid du Colombier argp++; 569a747e4fSDavid du Colombier } 579a747e4fSDavid du Colombier print(argl); 589a747e4fSDavid du Colombier } else if (fmt[i] == 'Z') && (~*a == 0) then { 599a747e4fSDavid du Colombier print("-1"); 60*f8bc6aafSDavid du Colombier if fmtsize(a) != 8 then a++; // advance extra word for quadword 619a747e4fSDavid du Colombier } else if (fmt[i] == 'Y') || (fmt[i] == 'V') then { 629a747e4fSDavid du Colombier print(fmt(*a, fmt[i])); 63*f8bc6aafSDavid du Colombier if fmtsize(a) != 8 then a++; // advance extra word for quadword 649a747e4fSDavid du Colombier } else if (fmt[i] == 'T') then { 659a747e4fSDavid du Colombier if *a == 0 then 669a747e4fSDavid du Colombier print("nil"); 679a747e4fSDavid du Colombier else 689a747e4fSDavid du Colombier printtextordata(*a, a[1]); 699a747e4fSDavid du Colombier } else 709a747e4fSDavid du Colombier print(fmt(*a, fmt[i])); 719a747e4fSDavid du Colombier if fmt[i+1] != 0 then 729a747e4fSDavid du Colombier print(", "); 739a747e4fSDavid du Colombier i = i+1; 749a747e4fSDavid du Colombier a++; 759a747e4fSDavid du Colombier } 769a747e4fSDavid du Colombier print(")\n"); 779a747e4fSDavid du Colombier} 789a747e4fSDavid du Colombier 799a747e4fSDavid du Colombierdefn code(*e) { return e; } 809a747e4fSDavid du Colombier 819a747e4fSDavid du Colombiersyscalls = { 829a747e4fSDavid du Colombier { 0, {"sysr1", "s", code(0)}}, 839a747e4fSDavid du Colombier { 1, {"_errstr", "s", code(*sys_errstr:arg)}}, 849a747e4fSDavid du Colombier { 2, {"bind", "ssX", code(*sysbind:arg)}}, 859a747e4fSDavid du Colombier { 3, {"chdir", "s", code(*sysbind:arg)}}, 869a747e4fSDavid du Colombier { 4, {"close", "D", code(*sysclose:arg)}}, 879a747e4fSDavid du Colombier { 5, {"dup", "DD", code(*sysdup:arg)}}, 889a747e4fSDavid du Colombier { 6, {"alarm", "D", code(*sysalarm:arg)}}, 899a747e4fSDavid du Colombier { 7, {"exec", "sS", code(*sysexec:arg)}}, 909a747e4fSDavid du Colombier { 8, {"exits", "s", code(*sysexits:arg)}}, 919a747e4fSDavid du Colombier { 9, {"_fsession", "DX", code(*sys_fsession:arg)}}, 929a747e4fSDavid du Colombier {10, {"fauth", "DX", code(*sysfauth:arg)}}, 939a747e4fSDavid du Colombier {11, {"_fstat", "DX", code(*sys_fstat:arg)}}, 949a747e4fSDavid du Colombier {12, {"segbrk", "XX", code(*syssegbrk:arg)}}, 959a747e4fSDavid du Colombier {13, {"_mount", "DsXs", code(*sys_mount:arg)}}, 969a747e4fSDavid du Colombier {14, {"open", "sD", code(*sysopen:arg)}}, 979a747e4fSDavid du Colombier {15, {"_read", "DXD", code(*sys_read:arg)}}, 989a747e4fSDavid du Colombier {16, {"oseek", "DDD", code(*sysoseek:arg)}}, 999a747e4fSDavid du Colombier {17, {"sleep", "D", code(*syssleep:arg)}}, 1009a747e4fSDavid du Colombier {18, {"_stat", "sX", code(*sys_stat:arg)}}, 1019a747e4fSDavid du Colombier {19, {"rfork", "X", code(*sysstat:arg)}}, 1029a747e4fSDavid du Colombier {20, {"_write", "DXD", code(*sys_write:arg)}}, 1039a747e4fSDavid du Colombier {21, {"pipe", "X", code(*syspipe:arg)}}, 1049a747e4fSDavid du Colombier {22, {"create", "sDO", code(*syscreate:arg)}}, 1059a747e4fSDavid du Colombier {23, {"fd2path", "DXD", code(*sysfd2path:arg)}}, 1069a747e4fSDavid du Colombier {24, {"brk_", "X", code(*sysbrk_:arg)}}, 1079a747e4fSDavid du Colombier {25, {"remove", "s", code(*sysremove:arg)}}, 1089a747e4fSDavid du Colombier {26, {"_wstat", "sX", code(*sys_wstat:arg)}}, 1099a747e4fSDavid du Colombier {27, {"_fwstat", "DX", code(*sys_fwstat:arg)}}, 1109a747e4fSDavid du Colombier {28, {"notify", "X", code(*sysnotify:arg)}}, 1119a747e4fSDavid du Colombier {29, {"noted", "D", code(*sysnoted:arg)}}, 1129a747e4fSDavid du Colombier {30, {"segattach", "DsXD", code(*syssegattach:arg)}}, 1139a747e4fSDavid du Colombier {31, {"segdetach", "X", code(*syssegdetach:arg)}}, 1149a747e4fSDavid du Colombier {32, {"segfree", "XD", code(*syssegfree:arg)}}, 1159a747e4fSDavid du Colombier {33, {"segflush", "XD", code(*syssegflush:arg)}}, 1169a747e4fSDavid du Colombier {34, {"rendezvous", "XX", code(*sysrendezvous:arg)}}, 1179a747e4fSDavid du Colombier {35, {"unmount", "ss", code(*sysunmount:arg)}}, 1189a747e4fSDavid du Colombier {36, {"_wait", "X", code(*sys_wait:arg)}}, 1199a747e4fSDavid du Colombier {39, {"seek", "XDVD", code(*sysseek:arg)}}, 1209a747e4fSDavid du Colombier {40, {"fversion", "DDsD", code(*sysfversion:arg)}}, 1219a747e4fSDavid du Colombier {41, {"errstr", "TD", code(*syserrstr:arg)}}, 1229a747e4fSDavid du Colombier {42, {"stat", "sXD", code(*sysstat:arg)}}, 1239a747e4fSDavid du Colombier {43, {"fstat", "DXD", code(*sysfstat:arg)}}, 1249a747e4fSDavid du Colombier {44, {"wstat", "sXD", code(*syswstat:arg)}}, 1259a747e4fSDavid du Colombier {45, {"fwstat", "DXD", code(*sysfwstat:arg)}}, 1269a747e4fSDavid du Colombier {46, {"mount", "DDsXs", code(*sysmount:arg)}}, 1279a747e4fSDavid du Colombier {47, {"await", "TD", code(*sysawait:arg)}}, 1289a747e4fSDavid du Colombier {50, {"pread", "DXDZ", code(*syspread:arg)}}, 1299a747e4fSDavid du Colombier {51, {"pwrite", "DTDZ", code(*syspwrite:arg)}}, 1309a747e4fSDavid du Colombier}; 1319a747e4fSDavid du Colombier 1329a747e4fSDavid du Colombierdefn syscall() { 1339a747e4fSDavid du Colombier local n, sl, h, p; 1349a747e4fSDavid du Colombier 1359a747e4fSDavid du Colombier map({"*data", 0, 0xffffffff, 0}); 1369a747e4fSDavid du Colombier n = *syscall:scallnr; 1379a747e4fSDavid du Colombier sl = syscalls; 1389a747e4fSDavid du Colombier while sl != {} do { 1399a747e4fSDavid du Colombier h = head sl; 1409a747e4fSDavid du Colombier sl = tail sl; 1419a747e4fSDavid du Colombier 1429a747e4fSDavid du Colombier if n == h[0] then { 1439a747e4fSDavid du Colombier p = h[1]; 1449a747e4fSDavid du Colombier printsyscall(p[0], p[1], p[2]); 1459a747e4fSDavid du Colombier } 1469a747e4fSDavid du Colombier } 1479a747e4fSDavid du Colombier} 1489a747e4fSDavid du Colombier 1499a747e4fSDavid du Colombierdefn UPCSPRET() { 1509a747e4fSDavid du Colombier // return sys call number, address of first argument, location of syscall return value 1519a747e4fSDavid du Colombier if objtype == "386" then 1529a747e4fSDavid du Colombier return { code(*(*PC-4)), code(*SP+4), code(*AX) }; 1539a747e4fSDavid du Colombier if (objtype == "mips") || (objtype == "mips2") then 1549a747e4fSDavid du Colombier return { code(*(*PC-4) & 0xffff), code(*SP+4), code(*R1) }; 155*f8bc6aafSDavid du Colombier if objtype == "mips64" then 156*f8bc6aafSDavid du Colombier return { code(*(*PC-8) & 0xffff), code(*SP), code(*R1) }; 1579a747e4fSDavid du Colombier if objtype == "arm" then 1589a747e4fSDavid du Colombier return { code(*(*PC-4) & 0xffff), code(*SP+4), code(*R0) }; // untested 1599a747e4fSDavid du Colombier if objtype == "alpha" then 1609a747e4fSDavid du Colombier return { code(*(*PC-4) & 0xffff), code(*SP+4), code(*R0) }; // untested 1619a747e4fSDavid du Colombier} 1629a747e4fSDavid du Colombier 1639a747e4fSDavid du Colombierdefn trapoffset() { 1649a747e4fSDavid du Colombier // return offset from entry point to trap instr 1659a747e4fSDavid du Colombier if objtype == "386" then return 5; 1669a747e4fSDavid du Colombier if objtype == "mips" then return 8; 1679a747e4fSDavid du Colombier if objtype == "mips2" then return 8; 168*f8bc6aafSDavid du Colombier if objtype == "mips64" then return 12; 1699a747e4fSDavid du Colombier if objtype == "arm" then return 8; // untested 1709a747e4fSDavid du Colombier if objtype == "alpha" then return 8; // untested 1719a747e4fSDavid du Colombier} 1729a747e4fSDavid du Colombier 1739a747e4fSDavid du Colombierdefn trapreason() { 1749a747e4fSDavid du Colombier // return reason for trap 1759a747e4fSDavid du Colombier if objtype == "386" then return reason(*TRAP); 1769a747e4fSDavid du Colombier if objtype == "mips" then return reason(*CAUSE); 1779a747e4fSDavid du Colombier if objtype == "mips2" then return reason(*CAUSE); 178*f8bc6aafSDavid du Colombier if objtype == "mips64" then return reason(*CAUSE); 1799a747e4fSDavid du Colombier if objtype == "arm" then return "unknown trap"; // untested 1809a747e4fSDavid du Colombier if objtype == "alpha" then return reason(cause); // untested 1819a747e4fSDavid du Colombier} 1829a747e4fSDavid du Colombier 1839a747e4fSDavid du Colombier 1849a747e4fSDavid du Colombierdefn usyscall() { // gives args for system call in user level; not useful with -k 1859a747e4fSDavid du Colombier local n, sl, h, p; 1869a747e4fSDavid du Colombier 1879a747e4fSDavid du Colombier // stopped at TRAP instruction in system call library 1889a747e4fSDavid du Colombier pcsp = UPCSPRET(); 1899a747e4fSDavid du Colombier n = eval pcsp[0]; 1909a747e4fSDavid du Colombier sl = syscalls; 1919a747e4fSDavid du Colombier while sl != {} do { 1929a747e4fSDavid du Colombier h = head sl; 1939a747e4fSDavid du Colombier sl = tail sl; 1949a747e4fSDavid du Colombier 1959a747e4fSDavid du Colombier if n == h[0] then { 1969a747e4fSDavid du Colombier p = h[1]; 1979a747e4fSDavid du Colombier printsyscall(p[0], p[1], pcsp[1]); 1989a747e4fSDavid du Colombier } 1999a747e4fSDavid du Colombier } 2009a747e4fSDavid du Colombier} 201