Blame


1 0a61c07d 2004-04-19 devnull // portable acid for all architectures
2 0a61c07d 2004-04-19 devnull
3 0a61c07d 2004-04-19 devnull defn pfl(addr)
4 0a61c07d 2004-04-19 devnull {
5 0a61c07d 2004-04-19 devnull print(pcfile(addr), ":", pcline(addr), "\n");
6 0a61c07d 2004-04-19 devnull }
7 0a61c07d 2004-04-19 devnull
8 0a61c07d 2004-04-19 devnull defn
9 0a61c07d 2004-04-19 devnull notestk(addr)
10 0a61c07d 2004-04-19 devnull {
11 0a61c07d 2004-04-19 devnull local pc, sp;
12 0a61c07d 2004-04-19 devnull complex Ureg addr;
13 0a61c07d 2004-04-19 devnull
14 0a61c07d 2004-04-19 devnull pc = addr.pc\X;
15 0a61c07d 2004-04-19 devnull sp = addr.sp\X;
16 0a61c07d 2004-04-19 devnull
17 0a61c07d 2004-04-19 devnull print("Note pc:", pc, " sp:", sp, " ", fmt(pc, 'a'), " ");
18 0a61c07d 2004-04-19 devnull pfl(pc);
19 0a61c07d 2004-04-19 devnull _stk({"PC", pc, "SP", sp, linkreg(addr)}, 1);
20 0a61c07d 2004-04-19 devnull }
21 0a61c07d 2004-04-19 devnull
22 0a61c07d 2004-04-19 devnull defn
23 0a61c07d 2004-04-19 devnull notelstk(addr)
24 0a61c07d 2004-04-19 devnull {
25 0a61c07d 2004-04-19 devnull local pc, sp;
26 0a61c07d 2004-04-19 devnull complex Ureg addr;
27 0a61c07d 2004-04-19 devnull
28 0a61c07d 2004-04-19 devnull pc = addr.pc\X;
29 0a61c07d 2004-04-19 devnull sp = addr.sp\X;
30 0a61c07d 2004-04-19 devnull
31 0a61c07d 2004-04-19 devnull print("Note pc:", pc, " sp:", sp, " ", fmt(pc, 'a'), " ");
32 0a61c07d 2004-04-19 devnull pfl(pc);
33 0a61c07d 2004-04-19 devnull _stk({"PC", pc, "SP", sp, linkreg(addr)}, 1);
34 0a61c07d 2004-04-19 devnull }
35 0a61c07d 2004-04-19 devnull
36 0a61c07d 2004-04-19 devnull defn params(param)
37 0a61c07d 2004-04-19 devnull {
38 0a61c07d 2004-04-19 devnull while param do {
39 0a61c07d 2004-04-19 devnull sym = head param;
40 029e5020 2005-03-18 devnull print(sym[0], "=", itoa(sym[1], "%#ux"));
41 0a61c07d 2004-04-19 devnull param = tail param;
42 0a61c07d 2004-04-19 devnull if param then
43 0a61c07d 2004-04-19 devnull print (",");
44 0a61c07d 2004-04-19 devnull }
45 0a61c07d 2004-04-19 devnull }
46 0a61c07d 2004-04-19 devnull
47 0a61c07d 2004-04-19 devnull stkprefix = "";
48 0a61c07d 2004-04-19 devnull stkignore = {};
49 0a61c07d 2004-04-19 devnull stkend = 0;
50 0a61c07d 2004-04-19 devnull
51 0a61c07d 2004-04-19 devnull defn locals(l)
52 0a61c07d 2004-04-19 devnull {
53 0a61c07d 2004-04-19 devnull local sym;
54 0a61c07d 2004-04-19 devnull
55 0a61c07d 2004-04-19 devnull while l do {
56 0a61c07d 2004-04-19 devnull sym = head l;
57 029e5020 2005-03-18 devnull print(stkprefix, "\t", sym[0], "=", itoa(sym[1], "%#ux"), "\n");
58 0a61c07d 2004-04-19 devnull l = tail l;
59 0a61c07d 2004-04-19 devnull }
60 0a61c07d 2004-04-19 devnull }
61 0a61c07d 2004-04-19 devnull
62 7284df18 2004-04-19 devnull defn _stkign(frame)
63 0a61c07d 2004-04-19 devnull {
64 7284df18 2004-04-19 devnull local file;
65 7284df18 2004-04-19 devnull
66 7284df18 2004-04-19 devnull file = pcfile(frame[0]);
67 0a61c07d 2004-04-19 devnull s = stkignore;
68 0a61c07d 2004-04-19 devnull while s do {
69 0a61c07d 2004-04-19 devnull if regexp(head s, file) then
70 0a61c07d 2004-04-19 devnull return 1;
71 0a61c07d 2004-04-19 devnull s = tail s;
72 0a61c07d 2004-04-19 devnull }
73 0a61c07d 2004-04-19 devnull return 0;
74 0a61c07d 2004-04-19 devnull }
75 0a61c07d 2004-04-19 devnull
76 0a61c07d 2004-04-19 devnull // print a stack trace
77 0a61c07d 2004-04-19 devnull //
78 0a61c07d 2004-04-19 devnull // in a run of leading frames in files matched by regexps in stkignore,
79 0a61c07d 2004-04-19 devnull // only print the last one.
80 0a61c07d 2004-04-19 devnull defn _stk(regs, dolocals)
81 0a61c07d 2004-04-19 devnull {
82 08ddcb74 2005-02-11 devnull local stk, frame, pc, fn, done, callerpc, paramlist, locallist;
83 0a61c07d 2004-04-19 devnull
84 0a61c07d 2004-04-19 devnull stk = strace(regs);
85 0a61c07d 2004-04-19 devnull if stkignore then {
86 7284df18 2004-04-19 devnull while stk && tail stk && _stkign(head tail stk) do
87 0a61c07d 2004-04-19 devnull stk = tail stk;
88 0a61c07d 2004-04-19 devnull }
89 0a61c07d 2004-04-19 devnull
90 0a61c07d 2004-04-19 devnull callerpc = 0;
91 d89ce51a 2005-02-11 devnull done = 0;
92 d89ce51a 2005-02-11 devnull while stk && !done do {
93 0a61c07d 2004-04-19 devnull frame = head stk;
94 0a61c07d 2004-04-19 devnull stk = tail stk;
95 0a61c07d 2004-04-19 devnull fn = frame[0];
96 0a61c07d 2004-04-19 devnull pc = frame[1];
97 0a61c07d 2004-04-19 devnull callerpc = frame[2];
98 0a61c07d 2004-04-19 devnull paramlist = frame[3];
99 0a61c07d 2004-04-19 devnull locallist = frame[4];
100 0a61c07d 2004-04-19 devnull
101 0a61c07d 2004-04-19 devnull print(stkprefix, fmt(fn, 'a'), "(");
102 0a61c07d 2004-04-19 devnull params(paramlist);
103 0a61c07d 2004-04-19 devnull print(")");
104 0a61c07d 2004-04-19 devnull if pc != fn then
105 029e5020 2005-03-18 devnull print("+", itoa(pc-fn, "%#ux"));
106 0a61c07d 2004-04-19 devnull print(" ");
107 0a61c07d 2004-04-19 devnull pfl(pc);
108 0a61c07d 2004-04-19 devnull if dolocals then
109 0a61c07d 2004-04-19 devnull locals(locallist);
110 d89ce51a 2005-02-11 devnull if fn == var("threadmain") || fn == var("p9main") then
111 d89ce51a 2005-02-11 devnull done=1;
112 d89ce51a 2005-02-11 devnull if fn == var("threadstart") || fn == var("scheduler") then
113 d89ce51a 2005-02-11 devnull done=1;
114 d89ce51a 2005-02-11 devnull if callerpc == 0 then
115 d89ce51a 2005-02-11 devnull done=1;
116 0a61c07d 2004-04-19 devnull }
117 d89ce51a 2005-02-11 devnull if callerpc && !done then {
118 0a61c07d 2004-04-19 devnull print(stkprefix, fmt(callerpc, 'a'), " ");
119 0a61c07d 2004-04-19 devnull pfl(callerpc);
120 0a61c07d 2004-04-19 devnull }
121 0a61c07d 2004-04-19 devnull }
122 0a61c07d 2004-04-19 devnull
123 0a61c07d 2004-04-19 devnull defn findsrc(file)
124 0a61c07d 2004-04-19 devnull {
125 0a61c07d 2004-04-19 devnull local lst, src;
126 0a61c07d 2004-04-19 devnull
127 0a61c07d 2004-04-19 devnull if file[0] == '/' then {
128 0a61c07d 2004-04-19 devnull src = file(file);
129 0a61c07d 2004-04-19 devnull if src != {} then {
130 0a61c07d 2004-04-19 devnull srcfiles = append srcfiles, file;
131 0a61c07d 2004-04-19 devnull srctext = append srctext, src;
132 0a61c07d 2004-04-19 devnull return src;
133 0a61c07d 2004-04-19 devnull }
134 0a61c07d 2004-04-19 devnull return {};
135 0a61c07d 2004-04-19 devnull }
136 0a61c07d 2004-04-19 devnull
137 0a61c07d 2004-04-19 devnull lst = srcpath;
138 0a61c07d 2004-04-19 devnull while head lst do {
139 0a61c07d 2004-04-19 devnull src = file(head lst+file);
140 0a61c07d 2004-04-19 devnull if src != {} then {
141 0a61c07d 2004-04-19 devnull srcfiles = append srcfiles, file;
142 0a61c07d 2004-04-19 devnull srctext = append srctext, src;
143 0a61c07d 2004-04-19 devnull return src;
144 0a61c07d 2004-04-19 devnull }
145 0a61c07d 2004-04-19 devnull lst = tail lst;
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 line(addr)
150 0a61c07d 2004-04-19 devnull {
151 0a61c07d 2004-04-19 devnull local src, file;
152 0a61c07d 2004-04-19 devnull
153 0a61c07d 2004-04-19 devnull file = pcfile(addr);
154 0a61c07d 2004-04-19 devnull src = match(file, srcfiles);
155 0a61c07d 2004-04-19 devnull
156 0a61c07d 2004-04-19 devnull if src >= 0 then
157 0a61c07d 2004-04-19 devnull src = srctext[src];
158 0a61c07d 2004-04-19 devnull else
159 0a61c07d 2004-04-19 devnull src = findsrc(file);
160 0a61c07d 2004-04-19 devnull
161 0a61c07d 2004-04-19 devnull if src == {} then {
162 0a61c07d 2004-04-19 devnull print("no source for ", file, "\n");
163 0a61c07d 2004-04-19 devnull return {};
164 0a61c07d 2004-04-19 devnull }
165 0a61c07d 2004-04-19 devnull line = pcline(addr)-1;
166 0a61c07d 2004-04-19 devnull print(file, ":", src[line], "\n");
167 0a61c07d 2004-04-19 devnull }
168 0a61c07d 2004-04-19 devnull
169 0a61c07d 2004-04-19 devnull defn addsrcdir(dir)
170 0a61c07d 2004-04-19 devnull {
171 0a61c07d 2004-04-19 devnull dir = dir+"/";
172 0a61c07d 2004-04-19 devnull
173 0a61c07d 2004-04-19 devnull if match(dir, srcpath) >= 0 then {
174 0a61c07d 2004-04-19 devnull print("already in srcpath\n");
175 0a61c07d 2004-04-19 devnull return {};
176 0a61c07d 2004-04-19 devnull }
177 0a61c07d 2004-04-19 devnull
178 0a61c07d 2004-04-19 devnull srcpath = {dir}+srcpath;
179 0a61c07d 2004-04-19 devnull }
180 0a61c07d 2004-04-19 devnull
181 0a61c07d 2004-04-19 devnull defn source()
182 0a61c07d 2004-04-19 devnull {
183 0a61c07d 2004-04-19 devnull local l;
184 0a61c07d 2004-04-19 devnull
185 0a61c07d 2004-04-19 devnull l = srcpath;
186 0a61c07d 2004-04-19 devnull while l do {
187 0a61c07d 2004-04-19 devnull print(head l, "\n");
188 0a61c07d 2004-04-19 devnull l = tail l;
189 0a61c07d 2004-04-19 devnull }
190 0a61c07d 2004-04-19 devnull l = srcfiles;
191 0a61c07d 2004-04-19 devnull
192 0a61c07d 2004-04-19 devnull while l do {
193 0a61c07d 2004-04-19 devnull print("\t", head l, "\n");
194 0a61c07d 2004-04-19 devnull l = tail l;
195 0a61c07d 2004-04-19 devnull }
196 0a61c07d 2004-04-19 devnull }
197 0a61c07d 2004-04-19 devnull
198 0a61c07d 2004-04-19 devnull defn Bsrc(addr)
199 0a61c07d 2004-04-19 devnull {
200 0a61c07d 2004-04-19 devnull local lst;
201 0a61c07d 2004-04-19 devnull
202 0a61c07d 2004-04-19 devnull lst = srcpath;
203 0a61c07d 2004-04-19 devnull file = pcfile(addr);
204 0a61c07d 2004-04-19 devnull if file[0] == '/' && access(file) then {
205 0a61c07d 2004-04-19 devnull rc("B "+file+":"+itoa(pcline(addr)));
206 0a61c07d 2004-04-19 devnull return {};
207 0a61c07d 2004-04-19 devnull }
208 0a61c07d 2004-04-19 devnull while head lst do {
209 0a61c07d 2004-04-19 devnull name = head lst+file;
210 0a61c07d 2004-04-19 devnull if access(name) then {
211 0a61c07d 2004-04-19 devnull rc("B "+name+":"+itoa(pcline(addr)));
212 0a61c07d 2004-04-19 devnull return {};
213 0a61c07d 2004-04-19 devnull }
214 0a61c07d 2004-04-19 devnull lst = tail lst;
215 0a61c07d 2004-04-19 devnull }
216 0a61c07d 2004-04-19 devnull print("no source for ", file, "\n");
217 0a61c07d 2004-04-19 devnull }
218 0a61c07d 2004-04-19 devnull
219 0a61c07d 2004-04-19 devnull defn srcline(addr)
220 0a61c07d 2004-04-19 devnull {
221 0a61c07d 2004-04-19 devnull local text, cline, line, file, src;
222 0a61c07d 2004-04-19 devnull file = pcfile(addr);
223 0a61c07d 2004-04-19 devnull src = match(file,srcfiles);
224 0a61c07d 2004-04-19 devnull if (src>=0) then
225 0a61c07d 2004-04-19 devnull src = srctext[src];
226 0a61c07d 2004-04-19 devnull else
227 0a61c07d 2004-04-19 devnull src = findsrc(file);
228 0a61c07d 2004-04-19 devnull if (src=={}) then
229 0a61c07d 2004-04-19 devnull {
230 0a61c07d 2004-04-19 devnull return "(no source)";
231 0a61c07d 2004-04-19 devnull }
232 0a61c07d 2004-04-19 devnull return src[pcline(addr)-1];
233 0a61c07d 2004-04-19 devnull }
234 0a61c07d 2004-04-19 devnull
235 0a61c07d 2004-04-19 devnull defn src(addr)
236 0a61c07d 2004-04-19 devnull {
237 0a61c07d 2004-04-19 devnull local src, file, line, cline, text;
238 0a61c07d 2004-04-19 devnull
239 0a61c07d 2004-04-19 devnull file = pcfile(addr);
240 0a61c07d 2004-04-19 devnull src = match(file, srcfiles);
241 0a61c07d 2004-04-19 devnull
242 0a61c07d 2004-04-19 devnull if src >= 0 then
243 0a61c07d 2004-04-19 devnull src = srctext[src];
244 0a61c07d 2004-04-19 devnull else
245 0a61c07d 2004-04-19 devnull src = findsrc(file);
246 0a61c07d 2004-04-19 devnull
247 0a61c07d 2004-04-19 devnull if src == {} then {
248 0a61c07d 2004-04-19 devnull print("no source for ", file, "\n");
249 0a61c07d 2004-04-19 devnull return {};
250 0a61c07d 2004-04-19 devnull }
251 0a61c07d 2004-04-19 devnull
252 0a61c07d 2004-04-19 devnull cline = pcline(addr)-1;
253 0a61c07d 2004-04-19 devnull print(file, ":", cline+1, "\n");
254 0a61c07d 2004-04-19 devnull line = cline-5;
255 0a61c07d 2004-04-19 devnull loop 0,10 do {
256 0a61c07d 2004-04-19 devnull if line >= 0 then {
257 0a61c07d 2004-04-19 devnull if line == cline then
258 0a61c07d 2004-04-19 devnull print(">");
259 0a61c07d 2004-04-19 devnull else
260 0a61c07d 2004-04-19 devnull print(" ");
261 0a61c07d 2004-04-19 devnull text = src[line];
262 0a61c07d 2004-04-19 devnull if text == {} then
263 0a61c07d 2004-04-19 devnull return {};
264 0a61c07d 2004-04-19 devnull print(line+1, "\t", text, "\n");
265 0a61c07d 2004-04-19 devnull }
266 0a61c07d 2004-04-19 devnull line = line+1;
267 0a61c07d 2004-04-19 devnull }
268 0a61c07d 2004-04-19 devnull }
269 0a61c07d 2004-04-19 devnull
270 0a61c07d 2004-04-19 devnull defn step() // single step the process
271 0a61c07d 2004-04-19 devnull {
272 0a61c07d 2004-04-19 devnull local lst, lpl, addr, bput;
273 0a61c07d 2004-04-19 devnull
274 0a61c07d 2004-04-19 devnull bput = 0;
275 0a61c07d 2004-04-19 devnull if match(*PC, bplist) >= 0 then { // Sitting on a breakpoint
276 0a61c07d 2004-04-19 devnull bput = fmt(*PC, bpfmt);
277 0a61c07d 2004-04-19 devnull *bput = @bput;
278 0a61c07d 2004-04-19 devnull }
279 0a61c07d 2004-04-19 devnull
280 0a61c07d 2004-04-19 devnull lst = follow(*PC);
281 0a61c07d 2004-04-19 devnull
282 0a61c07d 2004-04-19 devnull lpl = lst;
283 0a61c07d 2004-04-19 devnull while lpl do { // place break points
284 0a61c07d 2004-04-19 devnull *(head lpl) = bpinst;
285 0a61c07d 2004-04-19 devnull lpl = tail lpl;
286 0a61c07d 2004-04-19 devnull }
287 0a61c07d 2004-04-19 devnull
288 0a61c07d 2004-04-19 devnull startstop(pid); // do the step
289 0a61c07d 2004-04-19 devnull
290 0a61c07d 2004-04-19 devnull while lst do { // remove the breakpoints
291 0a61c07d 2004-04-19 devnull addr = fmt(head lst, bpfmt);
292 0a61c07d 2004-04-19 devnull *addr = @addr;
293 0a61c07d 2004-04-19 devnull lst = tail lst;
294 0a61c07d 2004-04-19 devnull }
295 0a61c07d 2004-04-19 devnull if bput != 0 then
296 0a61c07d 2004-04-19 devnull *bput = bpinst;
297 0a61c07d 2004-04-19 devnull }
298 0a61c07d 2004-04-19 devnull
299 0a61c07d 2004-04-19 devnull defn bpset(addr) // set a breakpoint
300 0a61c07d 2004-04-19 devnull {
301 0a61c07d 2004-04-19 devnull if status(pid) != "Stopped" then {
302 0a61c07d 2004-04-19 devnull print("Waiting...\n");
303 0a61c07d 2004-04-19 devnull stop(pid);
304 0a61c07d 2004-04-19 devnull }
305 0a61c07d 2004-04-19 devnull if match(addr, bplist) >= 0 then
306 0a61c07d 2004-04-19 devnull print("breakpoint already set at ", fmt(addr, 'a'), "\n");
307 0a61c07d 2004-04-19 devnull else {
308 0a61c07d 2004-04-19 devnull *fmt(addr, bpfmt) = bpinst;
309 0a61c07d 2004-04-19 devnull bplist = append bplist, addr;
310 0a61c07d 2004-04-19 devnull }
311 0a61c07d 2004-04-19 devnull }
312 0a61c07d 2004-04-19 devnull
313 0a61c07d 2004-04-19 devnull defn bptab() // print a table of breakpoints
314 0a61c07d 2004-04-19 devnull {
315 0a61c07d 2004-04-19 devnull local lst, addr;
316 0a61c07d 2004-04-19 devnull
317 0a61c07d 2004-04-19 devnull lst = bplist;
318 0a61c07d 2004-04-19 devnull while lst do {
319 0a61c07d 2004-04-19 devnull addr = head lst;
320 0a61c07d 2004-04-19 devnull print("\t", fmt(addr, 'X'), " ", fmt(addr, 'a'), " ", fmt(addr, 'i'), "\n");
321 0a61c07d 2004-04-19 devnull lst = tail lst;
322 0a61c07d 2004-04-19 devnull }
323 0a61c07d 2004-04-19 devnull }
324 0a61c07d 2004-04-19 devnull
325 0a61c07d 2004-04-19 devnull defn bpdel(addr) // delete a breakpoint
326 0a61c07d 2004-04-19 devnull {
327 0a61c07d 2004-04-19 devnull local n, pc, nbplist;
328 74685416 2005-11-28 devnull
329 74685416 2005-11-28 devnull if addr == 0 then {
330 74685416 2005-11-28 devnull while bplist do {
331 74685416 2005-11-28 devnull pc = head bplist;
332 74685416 2005-11-28 devnull pc = fmt(pc, bpfmt);
333 74685416 2005-11-28 devnull *pc = @pc;
334 74685416 2005-11-28 devnull bplist = tail bplist;
335 74685416 2005-11-28 devnull }
336 74685416 2005-11-28 devnull return {};
337 74685416 2005-11-28 devnull }
338 0a61c07d 2004-04-19 devnull
339 0a61c07d 2004-04-19 devnull n = match(addr, bplist);
340 0a61c07d 2004-04-19 devnull if n < 0 then {
341 0a61c07d 2004-04-19 devnull print("no breakpoint at ", fmt(addr, 'a'), "\n");
342 0a61c07d 2004-04-19 devnull return {};
343 0a61c07d 2004-04-19 devnull }
344 0a61c07d 2004-04-19 devnull
345 0a61c07d 2004-04-19 devnull addr = fmt(addr, bpfmt);
346 0a61c07d 2004-04-19 devnull *addr = @addr;
347 0a61c07d 2004-04-19 devnull
348 0a61c07d 2004-04-19 devnull nbplist = {}; // delete from list
349 0a61c07d 2004-04-19 devnull while bplist do {
350 0a61c07d 2004-04-19 devnull pc = head bplist;
351 0a61c07d 2004-04-19 devnull if pc != addr then
352 0a61c07d 2004-04-19 devnull nbplist = append nbplist, pc;
353 0a61c07d 2004-04-19 devnull bplist = tail bplist;
354 0a61c07d 2004-04-19 devnull }
355 0a61c07d 2004-04-19 devnull bplist = nbplist; // delete from memory
356 0a61c07d 2004-04-19 devnull }
357 0a61c07d 2004-04-19 devnull
358 0a61c07d 2004-04-19 devnull defn cont() // continue execution
359 0a61c07d 2004-04-19 devnull {
360 0a61c07d 2004-04-19 devnull local addr;
361 0a61c07d 2004-04-19 devnull
362 0a61c07d 2004-04-19 devnull addr = fmt(*PC, bpfmt);
363 0a61c07d 2004-04-19 devnull if match(addr, bplist) >= 0 then { // Sitting on a breakpoint
364 0a61c07d 2004-04-19 devnull *addr = @addr;
365 0a61c07d 2004-04-19 devnull step(); // Step over
366 0a61c07d 2004-04-19 devnull *addr = bpinst;
367 0a61c07d 2004-04-19 devnull }
368 0a61c07d 2004-04-19 devnull startstop(pid); // Run
369 0a61c07d 2004-04-19 devnull }
370 0a61c07d 2004-04-19 devnull
371 0a61c07d 2004-04-19 devnull defn stopped(pid) // called from acid when a process changes state
372 0a61c07d 2004-04-19 devnull {
373 74685416 2005-11-28 devnull pfixstop(pid);
374 0a61c07d 2004-04-19 devnull pstop(pid); // stub so this is easy to replace
375 0a61c07d 2004-04-19 devnull }
376 0a61c07d 2004-04-19 devnull
377 0a61c07d 2004-04-19 devnull defn procs() // print status of processes
378 0a61c07d 2004-04-19 devnull {
379 0a61c07d 2004-04-19 devnull local c, lst, cpid;
380 0a61c07d 2004-04-19 devnull
381 0a61c07d 2004-04-19 devnull cpid = pid;
382 0a61c07d 2004-04-19 devnull lst = proclist;
383 0a61c07d 2004-04-19 devnull while lst do {
384 0a61c07d 2004-04-19 devnull np = head lst;
385 0a61c07d 2004-04-19 devnull setproc(np);
386 0a61c07d 2004-04-19 devnull if np == cpid then
387 0a61c07d 2004-04-19 devnull c = '>';
388 0a61c07d 2004-04-19 devnull else
389 0a61c07d 2004-04-19 devnull c = ' ';
390 0a61c07d 2004-04-19 devnull print(fmt(c, 'c'), np, ": ", status(np), " at ", fmt(*PC, 'a'), " setproc(", np, ")\n");
391 0a61c07d 2004-04-19 devnull lst = tail lst;
392 0a61c07d 2004-04-19 devnull }
393 0a61c07d 2004-04-19 devnull pid = cpid;
394 0a61c07d 2004-04-19 devnull if pid != 0 then
395 0a61c07d 2004-04-19 devnull setproc(pid);
396 0a61c07d 2004-04-19 devnull }
397 0a61c07d 2004-04-19 devnull
398 0a61c07d 2004-04-19 devnull _asmlines = 30;
399 0a61c07d 2004-04-19 devnull
400 0a61c07d 2004-04-19 devnull defn asm(addr)
401 0a61c07d 2004-04-19 devnull {
402 0a61c07d 2004-04-19 devnull local bound;
403 0a61c07d 2004-04-19 devnull
404 0a61c07d 2004-04-19 devnull bound = fnbound(addr);
405 0a61c07d 2004-04-19 devnull
406 0a61c07d 2004-04-19 devnull addr = fmt(addr, 'i');
407 0a61c07d 2004-04-19 devnull loop 1,_asmlines do {
408 0a61c07d 2004-04-19 devnull print(fmt(addr, 'a'), " ", fmt(addr, 'X'));
409 0a61c07d 2004-04-19 devnull print("\t", @addr++, "\n");
410 0a61c07d 2004-04-19 devnull if bound != {} && addr > bound[1] then {
411 0a61c07d 2004-04-19 devnull lasmaddr = addr;
412 0a61c07d 2004-04-19 devnull return {};
413 0a61c07d 2004-04-19 devnull }
414 0a61c07d 2004-04-19 devnull }
415 0a61c07d 2004-04-19 devnull lasmaddr = addr;
416 0a61c07d 2004-04-19 devnull }
417 0a61c07d 2004-04-19 devnull
418 0a61c07d 2004-04-19 devnull defn casm()
419 0a61c07d 2004-04-19 devnull {
420 0a61c07d 2004-04-19 devnull asm(lasmaddr);
421 95f5b525 2005-01-23 devnull }
422 95f5b525 2005-01-23 devnull
423 95f5b525 2005-01-23 devnull defn xasm(addr)
424 95f5b525 2005-01-23 devnull {
425 95f5b525 2005-01-23 devnull local bound;
426 95f5b525 2005-01-23 devnull
427 95f5b525 2005-01-23 devnull bound = fnbound(addr);
428 95f5b525 2005-01-23 devnull
429 95f5b525 2005-01-23 devnull addr = fmt(addr, 'i');
430 95f5b525 2005-01-23 devnull loop 1,_asmlines do {
431 95f5b525 2005-01-23 devnull print(fmt(addr, 'a'), " ", fmt(addr, 'X'));
432 95f5b525 2005-01-23 devnull print("\t", *addr++, "\n");
433 95f5b525 2005-01-23 devnull if bound != {} && addr > bound[1] then {
434 95f5b525 2005-01-23 devnull lasmaddr = addr;
435 95f5b525 2005-01-23 devnull return {};
436 95f5b525 2005-01-23 devnull }
437 95f5b525 2005-01-23 devnull }
438 95f5b525 2005-01-23 devnull lasmaddr = addr;
439 95f5b525 2005-01-23 devnull }
440 95f5b525 2005-01-23 devnull
441 95f5b525 2005-01-23 devnull defn xcasm()
442 95f5b525 2005-01-23 devnull {
443 95f5b525 2005-01-23 devnull xasm(lasmaddr);
444 0a61c07d 2004-04-19 devnull }
445 0a61c07d 2004-04-19 devnull
446 0a61c07d 2004-04-19 devnull defn win()
447 0a61c07d 2004-04-19 devnull {
448 0a61c07d 2004-04-19 devnull local npid, estr;
449 0a61c07d 2004-04-19 devnull
450 0a61c07d 2004-04-19 devnull bplist = {};
451 0a61c07d 2004-04-19 devnull notes = {};
452 0a61c07d 2004-04-19 devnull
453 0a61c07d 2004-04-19 devnull estr = "/sys/lib/acid/window '0 0 600 400' "+textfile;
454 0a61c07d 2004-04-19 devnull if progargs != "" then
455 0a61c07d 2004-04-19 devnull estr = estr+" "+progargs;
456 0a61c07d 2004-04-19 devnull
457 0a61c07d 2004-04-19 devnull npid = rc(estr);
458 0a61c07d 2004-04-19 devnull npid = atoi(npid);
459 0a61c07d 2004-04-19 devnull if npid == 0 then
460 0a61c07d 2004-04-19 devnull error("win failed to create process");
461 0a61c07d 2004-04-19 devnull
462 0a61c07d 2004-04-19 devnull setproc(npid);
463 0a61c07d 2004-04-19 devnull stopped(npid);
464 0a61c07d 2004-04-19 devnull }
465 0a61c07d 2004-04-19 devnull
466 0a61c07d 2004-04-19 devnull defn win2()
467 0a61c07d 2004-04-19 devnull {
468 0a61c07d 2004-04-19 devnull local npid, estr;
469 0a61c07d 2004-04-19 devnull
470 0a61c07d 2004-04-19 devnull bplist = {};
471 0a61c07d 2004-04-19 devnull notes = {};
472 0a61c07d 2004-04-19 devnull
473 0a61c07d 2004-04-19 devnull estr = "/sys/lib/acid/transcript '0 0 600 400' '100 100 700 500' "+textfile;
474 0a61c07d 2004-04-19 devnull if progargs != "" then
475 0a61c07d 2004-04-19 devnull estr = estr+" "+progargs;
476 0a61c07d 2004-04-19 devnull
477 0a61c07d 2004-04-19 devnull npid = rc(estr);
478 0a61c07d 2004-04-19 devnull npid = atoi(npid);
479 0a61c07d 2004-04-19 devnull if npid == 0 then
480 0a61c07d 2004-04-19 devnull error("win failed to create process");
481 0a61c07d 2004-04-19 devnull
482 0a61c07d 2004-04-19 devnull setproc(npid);
483 0a61c07d 2004-04-19 devnull stopped(npid);
484 0a61c07d 2004-04-19 devnull }
485 0a61c07d 2004-04-19 devnull
486 74685416 2005-11-28 devnull printstopped = 1;
487 0a61c07d 2004-04-19 devnull defn new()
488 0a61c07d 2004-04-19 devnull {
489 74685416 2005-11-28 devnull local a;
490 74685416 2005-11-28 devnull
491 0a61c07d 2004-04-19 devnull bplist = {};
492 0a61c07d 2004-04-19 devnull newproc(progargs);
493 74685416 2005-11-28 devnull a = var("p9main");
494 74685416 2005-11-28 devnull if a == {} then
495 74685416 2005-11-28 devnull a = var("main");
496 74685416 2005-11-28 devnull if a == {} then
497 74685416 2005-11-28 devnull return {};
498 74685416 2005-11-28 devnull bpset(a);
499 74685416 2005-11-28 devnull while *PC != a do
500 74685416 2005-11-28 devnull cont();
501 74685416 2005-11-28 devnull bpdel(a);
502 0a61c07d 2004-04-19 devnull }
503 0a61c07d 2004-04-19 devnull
504 0a61c07d 2004-04-19 devnull defn stmnt() // step one statement
505 0a61c07d 2004-04-19 devnull {
506 0a61c07d 2004-04-19 devnull local line;
507 0a61c07d 2004-04-19 devnull
508 0a61c07d 2004-04-19 devnull line = pcline(*PC);
509 0a61c07d 2004-04-19 devnull while 1 do {
510 0a61c07d 2004-04-19 devnull step();
511 0a61c07d 2004-04-19 devnull if line != pcline(*PC) then {
512 0a61c07d 2004-04-19 devnull src(*PC);
513 0a61c07d 2004-04-19 devnull return {};
514 0a61c07d 2004-04-19 devnull }
515 0a61c07d 2004-04-19 devnull }
516 0a61c07d 2004-04-19 devnull }
517 0a61c07d 2004-04-19 devnull
518 0a61c07d 2004-04-19 devnull defn func() // step until we leave the current function
519 0a61c07d 2004-04-19 devnull {
520 0a61c07d 2004-04-19 devnull local bound, end, start, pc;
521 0a61c07d 2004-04-19 devnull
522 0a61c07d 2004-04-19 devnull bound = fnbound(*PC);
523 0a61c07d 2004-04-19 devnull if bound == {} then {
524 0a61c07d 2004-04-19 devnull print("cannot locate text symbol\n");
525 0a61c07d 2004-04-19 devnull return {};
526 0a61c07d 2004-04-19 devnull }
527 0a61c07d 2004-04-19 devnull
528 0a61c07d 2004-04-19 devnull pc = *PC;
529 0a61c07d 2004-04-19 devnull start = bound[0];
530 0a61c07d 2004-04-19 devnull end = bound[1];
531 0a61c07d 2004-04-19 devnull while pc >= start && pc < end do {
532 0a61c07d 2004-04-19 devnull step();
533 0a61c07d 2004-04-19 devnull pc = *PC;
534 0a61c07d 2004-04-19 devnull }
535 0a61c07d 2004-04-19 devnull }
536 0a61c07d 2004-04-19 devnull
537 0a61c07d 2004-04-19 devnull defn next()
538 0a61c07d 2004-04-19 devnull {
539 74685416 2005-11-28 devnull local sp, bound, pc;
540 0a61c07d 2004-04-19 devnull
541 0a61c07d 2004-04-19 devnull sp = *SP;
542 0a61c07d 2004-04-19 devnull bound = fnbound(*PC);
543 74685416 2005-11-28 devnull if bound == {} then {
544 74685416 2005-11-28 devnull print("cannot locate text symbol\n");
545 74685416 2005-11-28 devnull return {};
546 74685416 2005-11-28 devnull }
547 0a61c07d 2004-04-19 devnull stmnt();
548 0a61c07d 2004-04-19 devnull pc = *PC;
549 0a61c07d 2004-04-19 devnull if pc >= bound[0] && pc < bound[1] then
550 0a61c07d 2004-04-19 devnull return {};
551 0a61c07d 2004-04-19 devnull
552 0a61c07d 2004-04-19 devnull while (pc < bound[0] || pc > bound[1]) && sp >= *SP do {
553 0a61c07d 2004-04-19 devnull step();
554 0a61c07d 2004-04-19 devnull pc = *PC;
555 0a61c07d 2004-04-19 devnull }
556 0a61c07d 2004-04-19 devnull src(*PC);
557 0a61c07d 2004-04-19 devnull }
558 0a61c07d 2004-04-19 devnull
559 0a61c07d 2004-04-19 devnull defn maps()
560 0a61c07d 2004-04-19 devnull {
561 0a61c07d 2004-04-19 devnull local m, mm;
562 0a61c07d 2004-04-19 devnull
563 0a61c07d 2004-04-19 devnull m = map();
564 0a61c07d 2004-04-19 devnull while m != {} do {
565 0a61c07d 2004-04-19 devnull mm = head m;
566 0a61c07d 2004-04-19 devnull m = tail m;
567 0a61c07d 2004-04-19 devnull print(mm[2]\X, " ", mm[3]\X, " ", mm[4]\X, " ", mm[0], " ", mm[1], "\n");
568 0a61c07d 2004-04-19 devnull }
569 0a61c07d 2004-04-19 devnull }
570 0a61c07d 2004-04-19 devnull
571 0a61c07d 2004-04-19 devnull defn dump(addr, n, fmt)
572 0a61c07d 2004-04-19 devnull {
573 0a61c07d 2004-04-19 devnull loop 0, n do {
574 0a61c07d 2004-04-19 devnull print(fmt(addr, 'X'), ": ");
575 0a61c07d 2004-04-19 devnull addr = mem(addr, fmt);
576 0a61c07d 2004-04-19 devnull }
577 0a61c07d 2004-04-19 devnull }
578 0a61c07d 2004-04-19 devnull
579 0a61c07d 2004-04-19 devnull defn mem(addr, fmt)
580 0a61c07d 2004-04-19 devnull {
581 0a61c07d 2004-04-19 devnull
582 0a61c07d 2004-04-19 devnull local i, c, n;
583 0a61c07d 2004-04-19 devnull
584 0a61c07d 2004-04-19 devnull i = 0;
585 0a61c07d 2004-04-19 devnull while fmt[i] != 0 do {
586 0a61c07d 2004-04-19 devnull c = fmt[i];
587 0a61c07d 2004-04-19 devnull n = 0;
588 0a61c07d 2004-04-19 devnull while '0' <= fmt[i] && fmt[i] <= '9' do {
589 0a61c07d 2004-04-19 devnull n = 10*n + fmt[i]-'0';
590 0a61c07d 2004-04-19 devnull i = i+1;
591 0a61c07d 2004-04-19 devnull }
592 0a61c07d 2004-04-19 devnull if n <= 0 then n = 1;
593 0a61c07d 2004-04-19 devnull addr = fmt(addr, fmt[i]);
594 0a61c07d 2004-04-19 devnull while n > 0 do {
595 0a61c07d 2004-04-19 devnull print(*addr++, " ");
596 0a61c07d 2004-04-19 devnull n = n-1;
597 0a61c07d 2004-04-19 devnull }
598 0a61c07d 2004-04-19 devnull i = i+1;
599 0a61c07d 2004-04-19 devnull }
600 0a61c07d 2004-04-19 devnull print("\n");
601 0a61c07d 2004-04-19 devnull return addr;
602 0a61c07d 2004-04-19 devnull }
603 0a61c07d 2004-04-19 devnull
604 0a61c07d 2004-04-19 devnull defn symbols(pattern)
605 0a61c07d 2004-04-19 devnull {
606 a4b21877 2006-02-14 devnull local l, s, name;
607 a4b21877 2006-02-14 devnull
608 0a61c07d 2004-04-19 devnull l = symbols;
609 0a61c07d 2004-04-19 devnull while l do {
610 0a61c07d 2004-04-19 devnull s = head l;
611 a4b21877 2006-02-14 devnull if regexp(pattern, s[0]) then {
612 a4b21877 2006-02-14 devnull name = s[4];
613 a4b21877 2006-02-14 devnull if name == {} then
614 a4b21877 2006-02-14 devnull name = "";
615 a4b21877 2006-02-14 devnull print(s[0], "\t", s[1], "\t", s[2], "\t", s[3], "\t", name, "\n");
616 a4b21877 2006-02-14 devnull }
617 0a61c07d 2004-04-19 devnull l = tail l;
618 0a61c07d 2004-04-19 devnull }
619 0a61c07d 2004-04-19 devnull }
620 0a61c07d 2004-04-19 devnull
621 0a61c07d 2004-04-19 devnull defn havesymbol(name)
622 0a61c07d 2004-04-19 devnull {
623 0a61c07d 2004-04-19 devnull local l, s;
624 0a61c07d 2004-04-19 devnull
625 0a61c07d 2004-04-19 devnull l = symbols;
626 0a61c07d 2004-04-19 devnull while l do {
627 0a61c07d 2004-04-19 devnull s = head l;
628 0a61c07d 2004-04-19 devnull l = tail l;
629 0a61c07d 2004-04-19 devnull if s[0] == name then
630 0a61c07d 2004-04-19 devnull return 1;
631 0a61c07d 2004-04-19 devnull }
632 0a61c07d 2004-04-19 devnull return 0;
633 0a61c07d 2004-04-19 devnull }
634 0a61c07d 2004-04-19 devnull
635 0a61c07d 2004-04-19 devnull defn spsrch(len)
636 0a61c07d 2004-04-19 devnull {
637 0a61c07d 2004-04-19 devnull local addr, a, s, e;
638 0a61c07d 2004-04-19 devnull
639 0a61c07d 2004-04-19 devnull addr = *SP;
640 0a61c07d 2004-04-19 devnull s = origin & 0x7fffffff;
641 0a61c07d 2004-04-19 devnull e = etext & 0x7fffffff;
642 0a61c07d 2004-04-19 devnull loop 1, len do {
643 0a61c07d 2004-04-19 devnull a = *addr++;
644 0a61c07d 2004-04-19 devnull c = a & 0x7fffffff;
645 0a61c07d 2004-04-19 devnull if c > s && c < e then {
646 0a61c07d 2004-04-19 devnull print("src(", a, ")\n");
647 0a61c07d 2004-04-19 devnull pfl(a);
648 0a61c07d 2004-04-19 devnull }
649 0a61c07d 2004-04-19 devnull }
650 0a61c07d 2004-04-19 devnull }
651 0a61c07d 2004-04-19 devnull
652 7284df18 2004-04-19 devnull defn acidtypes()
653 7284df18 2004-04-19 devnull {
654 7284df18 2004-04-19 devnull local syms;
655 7284df18 2004-04-19 devnull local l;
656 7284df18 2004-04-19 devnull
657 7284df18 2004-04-19 devnull l = textfile();
658 7284df18 2004-04-19 devnull if l != {} then {
659 7284df18 2004-04-19 devnull syms = "acidtypes";
660 7284df18 2004-04-19 devnull while l != {} do {
661 7284df18 2004-04-19 devnull syms = syms + " " + ((head l)[0]);
662 7284df18 2004-04-19 devnull l = tail l;
663 7284df18 2004-04-19 devnull }
664 7284df18 2004-04-19 devnull includepipe(syms);
665 95f5b525 2005-01-23 devnull }
666 95f5b525 2005-01-23 devnull }
667 95f5b525 2005-01-23 devnull
668 95f5b525 2005-01-23 devnull defn getregs()
669 95f5b525 2005-01-23 devnull {
670 95f5b525 2005-01-23 devnull local regs, l;
671 95f5b525 2005-01-23 devnull
672 95f5b525 2005-01-23 devnull regs = {};
673 95f5b525 2005-01-23 devnull l = registers;
674 95f5b525 2005-01-23 devnull while l != {} do {
675 95f5b525 2005-01-23 devnull regs = append regs, var(l[0]);
676 95f5b525 2005-01-23 devnull l = tail l;
677 95f5b525 2005-01-23 devnull }
678 95f5b525 2005-01-23 devnull return regs;
679 95f5b525 2005-01-23 devnull }
680 95f5b525 2005-01-23 devnull
681 95f5b525 2005-01-23 devnull defn setregs(regs)
682 95f5b525 2005-01-23 devnull {
683 95f5b525 2005-01-23 devnull local l;
684 95f5b525 2005-01-23 devnull
685 95f5b525 2005-01-23 devnull l = registers;
686 95f5b525 2005-01-23 devnull while l != {} do {
687 95f5b525 2005-01-23 devnull var(l[0]) = regs[0];
688 95f5b525 2005-01-23 devnull l = tail l;
689 95f5b525 2005-01-23 devnull regs = tail regs;
690 7284df18 2004-04-19 devnull }
691 95f5b525 2005-01-23 devnull return regs;
692 7284df18 2004-04-19 devnull }
693 7284df18 2004-04-19 devnull
694 95f5b525 2005-01-23 devnull defn resetregs()
695 95f5b525 2005-01-23 devnull {
696 95f5b525 2005-01-23 devnull local l;
697 95f5b525 2005-01-23 devnull
698 95f5b525 2005-01-23 devnull l = registers;
699 95f5b525 2005-01-23 devnull while l != {} do {
700 95f5b525 2005-01-23 devnull var(l[0]) = register(l[0]);
701 95f5b525 2005-01-23 devnull l = tail l;
702 95f5b525 2005-01-23 devnull }
703 95f5b525 2005-01-23 devnull }
704 95f5b525 2005-01-23 devnull
705 95f5b525 2005-01-23 devnull defn clearregs()
706 95f5b525 2005-01-23 devnull {
707 95f5b525 2005-01-23 devnull local l;
708 95f5b525 2005-01-23 devnull
709 95f5b525 2005-01-23 devnull l = registers;
710 95f5b525 2005-01-23 devnull while l != {} do {
711 95f5b525 2005-01-23 devnull var(l[0]) = refconst(~0);
712 95f5b525 2005-01-23 devnull l = tail l;
713 95f5b525 2005-01-23 devnull }
714 95f5b525 2005-01-23 devnull }
715 95f5b525 2005-01-23 devnull
716 0a61c07d 2004-04-19 devnull progargs="";
717 0a61c07d 2004-04-19 devnull print(acidfile);
718 95f5b525 2005-01-23 devnull