|
|
1.1 root 1: /*
2: * A debugger.
3: * Command analyser.
4: */
5: #include <stdio.h>
6: #include "trace.h"
7:
8:
9: /*
10: * Execute a command.
11: * Return true if more commands may be read.
12: */
13: command(vp)
14: register VAL *vp;
15: {
16: register int c;
17: register int n;
18:
19: switch (c=getn()) {
20: case '=':
21: if (newline() == 0)
22: break;
23: printx("%lo\n", rvalue(&vp[0], (long)dot));
24: return (1);
25: case '?':
26: if (newline() == 0)
27: break;
28: if (errrstr != NULL)
29: printx("%s\n", errrstr);
30: return (1);
31: case 'a':
32: if (newline() == 0)
33: break;
34: putaddr(vsegno(&vp[0], -1), lvalue(&vp[0], (long)dot), I);
35: putx('\n');
36: return (1);
37: case 'b':
38: if (objflag == 0)
39: break;
40: if ((c=getn()) != 'r') {
41: ungetn(c);
42: c = 'b';
43: }
44: getline("i+.:a\ni+.?i\n:x");
45: n = setubpt(c, (vaddr_t)lvalue(&vp[0], (long)dot), miscbuf);
46: if (n == 0)
47: printe("Cannot set breakpoint");
48: return (1);
49: case 'c':
50: if (newline() == 0)
51: break;
52: else
53: c = '\n';
54: if (excflag == 0)
55: break;
56: if (nvalue(&vp[0]) == 0)
57: setpc((vaddr_t)lvalue(&vp[0], (long)0));
58: sinmode = SNULL;
59: return (0);
60: case 'd':
61: if (objflag == 0)
62: break;
63: if ((c=getn())!='r' && c!='s' && c!='a') {
64: ungetn(c);
65: c = 'b';
66: }
67: if (newline() == 0)
68: break;
69: if( c == 'a') {
70: bptinit();
71: return( 1);
72: }
73: if (delubpt(c, (vaddr_t)lvalue(&vp[0], (long)dot)) == 0)
74: printe("Cannot delete breakpoint");
75: return (1);
76: case 'e':
77: if (nvalue(&vp[0]) == 0)
78: setpc((vaddr_t)lvalue(&vp[0], (long)0));
79: getline("");
80: return(runfile());
81: case 'f':
82: if (newline() == 0)
83: break;
84: printx("%s\n", trapstr!=NULL ? trapstr : "No fault");
85: return (1);
86: case 'k':
87: if (excflag == 0)
88: break;
89: if (newline() == 0)
90: break;
91: if (nvalue(&vp[0]) != 0) {
92: printe("No signal specified");
93: return (1);
94: }
95: printr("Cannot send %d", (int)rvalue(&vp[0], (long)0));
96: return (1);
97: case 'm':
98: if (newline() == 0)
99: break;
100: dispmap();
101: return (1);
102: case 'n':
103: if( ( c = getn()) == 'o')
104: dbase = 8;
105: else if( c == 'd')
106: dbase = 10;
107: else if( c == 'x')
108: dbase = 16;
109: else
110: break;
111: if( newline() == 0)
112: break;
113: return( 1);
114: case 'o':
115: if (newline() == 0)
116: break;
117: cantype = rvalue(&vp[0], (long)0);
118: return (1);
119: case 'p':
120: if (newline() == 0)
121: break;
122: dispbpt();
123: return (1);
124: case 'q':
125: if (newline() == 0)
126: break;
127: if (rvalue(&vp[0], (long)1))
128: leave();
129: return (1);
130: case 'r':
131: if (newline() == 0)
132: break;
133: else
134: c = '\n';
135: if (regflag == 0)
136: break;
137: dispreg();
138: return (1);
139: case 's':
140: if (excflag == 0)
141: break;
142: if (nvalue(&vp[0]) == 0)
143: setpc((vaddr_t)lvalue(&vp[0], (long)0));
144: sindecr = rvalue(&vp[1], (long)1);
145: sinmode = SCONT;
146: if ((c=getn()) != 'c') {
147: sinmode = SSTEP;
148: ungetn(c);
149: }
150: getline("i+.?i");
151: sinp = savecom(sinp, miscbuf);
152: return (0);
153: case 't':
154: if (newline() == 0)
155: break;
156: else
157: c = '\n';
158: if (regflag == 0)
159: break;
160: dispsbt((int)rvalue(&vp[0], (long)0));
161: return (1);
162: case 'x':
163: if (newline() == 0)
164: break;
165: if (rvalue(&vp[0], (long)1) != 0) {
166: sincmod = sinmode;
167: sinmode = SNULL;
168: addfilp(stdin);
169: }
170: return (1);
171: }
172: printe("Illegal command");
173: while (c != '\n')
174: c = getn();
175: return (1);
176: }
177:
178: /*
179: * If the next character is a newline, return 1, else 0.
180: */
181: newline()
182: {
183: return (getn()=='\n');
184: }
185:
186: /*
187: * Given a pointer to an allocated buffer and a pointer to a
188: * command string, copy the command string in the allocated
189: * buffer. If the allocated buffer hasn't been allocated,
190: * allocate it.
191: */
192: char *
193: savecom(bp, sp)
194: register char *bp;
195: register char *sp;
196: {
197: register char *cp;
198:
199: if (bp == NULL)
200: bp = nalloc(COMSIZE);
201: cp = bp;
202: while (*sp) {
203: if (cp >= &bp[COMSIZE-1])
204: break;
205: *cp++ = *sp++;
206: }
207: *cp++ = '\0';
208: return (bp);
209: }
210:
211: /*
212: * Initialise breakpoint table.
213: */
214: bptinit()
215: {
216: register BPT *bp;
217: register int n;
218:
219: for (n=NBPT, bp=&bpt[0]; --n; bp++) {
220: bp->b_flag = 0;
221: bp->b_bcom = NULL;
222: bp->b_rcom = NULL;
223: }
224: }
225:
226: /*
227: * Set a breakpoint (user callable). If the type is 'b', a regular
228: * breakpoint. If it is 'r', a return breakpoint.
229: */
230: setubpt(t, a, cp)
231: vaddr_t a;
232: char *cp;
233: {
234: register unsigned n;
235: vaddr_t pc;
236: vaddr_t fp;
237:
238: if (t == 'b')
239: n = setibpt(BBPT, a, (vaddr_t)0, cp);
240: else {
241: setretf(&pc, &fp);
242: n = setibpt(BRET, pc, fp, cp);
243: }
244: return (n);
245: }
246:
247: /*
248: * Set a breakpoint (internal routine).
249: */
250: setibpt(f, a, fp, cp)
251: register vaddr_t a;
252: vaddr_t fp;
253: char *cp;
254: {
255: register BPT *bp;
256: register int n;
257: int w;
258:
259: #if FORZ8001
260: a &= 0x7F00FFFFL;
261: #endif
262: add = (long)a;
263: if (getb(1, (char *)&w, sizeof(w)) == 0)
264: return (0);
265: for (n=NBPT, bp=&bpt[0]; --n; bp++) {
266: if (bp->b_flag!=0 && bp->b_badd==a)
267: goto out;
268: }
269: for (n=NBPT, bp=&bpt[0]; --n; bp++) {
270: if (bp->b_flag == 0)
271: goto out;
272: }
273: return (0);
274: out:
275: if (f!=BBPT && (bp->b_flag&f)!=0)
276: return (0);
277: bp->b_flag |= f;
278: bp->b_badd = a;
279: switch (f) {
280: case BBPT:
281: bp->b_bcom = savecom(bp->b_bcom, cp);
282: break;
283: case BRET:
284: bp->b_rfpt = fp;
285: bp->b_rcom = savecom(bp->b_rcom, cp);
286: break;
287: case BSIN:
288: bp->b_sfpt = fp;
289: break;
290: }
291: return (1);
292: }
293:
294: /*
295: * Delete a breakpoint. (user callable)
296: * If `r' is set, it is a return breakpoint.
297: */
298: delubpt(t, a)
299: vaddr_t a;
300: {
301: register int f;
302:
303: switch (t) {
304: case 'b':
305: f = BBPT;
306: break;
307: case 'r':
308: f = BRET;
309: break;
310: case 's':
311: f = BSIN;
312: break;
313: }
314: return (delibpt(f, a));
315: }
316:
317: /*
318: * Delete a breakpoint. (internal routine)
319: */
320: delibpt(f, a)
321: register int f;
322: vaddr_t a;
323: {
324: register BPT *bp;
325: register int n;
326:
327: for (n=NBPT, bp=&bpt[0]; --n; bp++) {
328: if ((bp->b_flag&f)==0 || bp->b_badd!=a)
329: continue;
330: bp->b_flag &= ~f;
331: return (1);
332: }
333: return (0);
334: }
335:
336: /*
337: * Display breakpoints.
338: */
339: dispbpt()
340: {
341: register BPT *bp;
342: register int n;
343:
344: for (n=NBPT, bp=&bpt[0]; --n; bp++) {
345: if (testint())
346: return;
347: if ((bp->b_flag&BBPT) != 0)
348: putlbpt(' ', bp->b_badd, bp->b_bcom);
349: if (testint())
350: return;
351: if ((bp->b_flag&BRET) != 0)
352: putlbpt('r', bp->b_badd, bp->b_rcom);
353: if (testint())
354: return;
355: if ((bp->b_flag&BSIN) != 0)
356: putlbpt('s', bp->b_badd, "");
357: }
358: }
359:
360: /*
361: * Print out a breakpoint address, type and command.
362: */
363: putlbpt(t, a, cp)
364: vaddr_t a;
365: register char *cp;
366: {
367: register int c;
368:
369: printx(DAFMT, (long)a);
370: printx("%c (", t);
371: putaddr(1, (long)a, I);
372: printx(") ");
373: while ((c=*cp++) != '\0') {
374: if (c == '\n') {
375: printx("\\n");
376: continue;
377: }
378: if (c == '\\') {
379: printx("\\\\");
380: continue;
381: }
382: putx(c);
383: }
384: putx('\n');
385: }
386:
387: /*
388: * Print out segmentation map.
389: */
390: dispmap()
391: {
392: register MAP *mp;
393: register int n;
394:
395: for (n=0; n<NSEGM; n++) {
396: if ((mp=segmapl[n]) == NULL)
397: continue;
398: printx("%s", segname[n]);
399: while (n<NSEGM-1 && segmapl[n+1]==mp)
400: printx(" == %s", segname[++n]);
401: printx("\n");
402: for (; mp!=NULL; mp=mp->m_next) {
403: printx("[");
404: putmadd(mp->m_base);
405: printx(", ");
406: putmadd(mp->m_bend);
407: printx("] => ");
408: putmadd(mp->m_offt);
409: printx(" (%d)\n", mp->m_segi);
410: if (testint())
411: return;
412: }
413: }
414: }
415:
416: /*
417: * Print out a long address for segmentation map.
418: */
419: putmadd(l)
420: fsize_t l;
421: {
422: register int c, n;
423:
424: if (l!=MLI && l!=LI) {
425: printx(VAFMT, l);
426: return;
427: }
428: c = l==MLI ? '-' : '+';
429: n = VAWID;
430: while (n--)
431: putchar(c);
432: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.