Blame


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