|
|
1.1 root 1: #
2: /*
3: *
4: * UNIX debugger
5: *
6: */
7:
8: #include "defs.h"
9: SCCSID(@(#)print.c 2.9);
10: #include "a.out.h"
11: struct user u;
12:
13:
14: MSG LONGFIL;
15: MSG NOTOPEN;
16: MSG A68BAD;
17: MSG A68LNK;
18: MSG BADMOD;
19:
20: MAP txtmap;
21: MAP datmap;
22:
23: SYMTAB symbol;
24: ADDR lastframe;
25: ADDR callpc;
26:
27: INT infile;
28: INT outfile;
29: CHAR *lp;
30: L_INT maxoff;
31: L_INT maxpos;
32: INT radix;
33:
34: /* symbol management */
35: L_INT localval;
36:
37: /* breakpoints */
38: BKPTR bkpthead;
39:
40: REGLIST reglist [] = {
41: "p1lr", P1LR,
42: "p1br",P1BR,
43: "p0lr", P0LR,
44: "p0br",P0BR,
45: "ksp",KSP,
46: "esp",ESP,
47: "ssp",SSP,
48: "psl", PSL,
49: "pc", PC,
50: "usp",USP,
51: "fp", FP,
52: "ap", AP,
53: "r11", R11,
54: "r10", R10,
55: "r9", R9,
56: "r8", R8,
57: "r7", R7,
58: "r6", R6,
59: "r5", R5,
60: "r4", R4,
61: "r3", R3,
62: "r2", R2,
63: "r1", R1,
64: "r0", R0,
65: };
66:
67: char lastc;
68:
69: INT fcor;
70: STRING errflg;
71: INT signo;
72:
73:
74: L_INT dot;
75: L_INT var[];
76: STRING symfil;
77: STRING corfil;
78: INT pid;
79: L_INT adrval;
80: INT adrflg;
81: L_INT cntval;
82: INT cntflg;
83:
84: STRING signals[] = {
85: "",
86: "hangup",
87: "interrupt",
88: "quit",
89: "illegal instruction",
90: "trace/BPT",
91: "IOT",
92: "EMT",
93: "floating exception",
94: "killed",
95: "bus error",
96: "memory fault",
97: "bad system call",
98: "broken pipe",
99: "alarm call",
100: "terminated",
101: };
102: #define MAXSIG 15
103:
104:
105:
106:
107: /* general printing routines ($) */
108:
109: printtrace(modif)
110: {
111: INT narg, i, stat, name, limit;
112: POS dynam;
113: REG BKPTR bkptr;
114: CHAR hi, lo;
115: ADDR word;
116: STRING comptr;
117: ADDR argp, frame, link;
118: SYMPTR symp;
119:
120: IF cntflg==0 THEN cntval = -1; FI
121:
122: switch (modif) {
123:
124: case '<':
125: case '>':
126: {CHAR file[64];
127: INT index;
128:
129: index=0;
130: IF modif=='<'
131: THEN iclose();
132: ELSE oclose();
133: FI
134: IF rdc()!=EOR
135: THEN REP file[index++]=lastc;
136: IF index>=63 THEN error(LONGFIL); FI
137: PER readchar()!=EOR DONE
138: file[index]=0;
139: IF modif=='<'
140: THEN infile=open(file,0);
141: IF infile<0
142: THEN infile=0; error(NOTOPEN);
143: FI
144: ELSE outfile=open(file,1);
145: IF outfile<0
146: THEN outfile=creat(file,0644);
147: #ifndef EDDT
148: ELSE lseek(outfile,0L,2);
149: #endif
150: FI
151: FI
152:
153: FI
154: lp--;
155: }
156: break;
157:
158: case 'd':
159: if (adrflg) {
160: if (adrval<2 || adrval>16) {printf("must have 2 <= radix <= 16"); break;}
161: printf("radix=%d base ten",radix=adrval);
162: }
163: break;
164:
165: case 'q': case 'Q': case '%':
166: done();
167:
168: case 'w': case 'W':
169: maxpos=(adrflg?adrval:MAXPOS);
170: break;
171:
172: case 's': case 'S':
173: maxoff=(adrflg?adrval:MAXOFF);
174: break;
175:
176: case 'v': case 'V':
177: prints("variables\n");
178: FOR i=0;i<=35;i++
179: DO IF var[i]
180: THEN printc((i<=9 ? '0' : 'a'-10) + i);
181: printf(" = %Q\n",var[i]);
182: FI
183: OD
184: break;
185:
186: case 'm': case 'M':
187: printmap("? map",&txtmap);
188: printmap("/ map",&datmap);
189: break;
190:
191: case 0: case '?':
192: IF pid
193: THEN printf("pcs id = %d\n",pid);
194: ELSE prints("no process\n");
195: FI
196: sigprint(); flushbuf();
197:
198: case 'r': case 'R':
199: printregs();
200: return;
201:
202: case 'c': case 'C':
203: IF adrflg
204: THEN frame=adrval;
205: word=get(adrval+6,DSP)&0xFFFF;
206: IF word&0x2000
207: THEN /* 'calls', can figure out argp */
208: argp=adrval+20+((word>>14)&3); word &= 0xFFF;
209: WHILE word DO IF word&1 THEN argp+=4; FI word>>=1; OD
210: ELSE /* 'callg', can't tell where argp is */ argp=frame;
211: FI
212: callpc=get(frame+16,DSP);
213: ELSE argp= *(ADDR *)(((ADDR)&u)+AP);
214: frame= *(ADDR *)(((ADDR)&u)+FP);
215: callpc= *(ADDR *)(((ADDR)&u)+PC);
216: FI
217: lastframe=0;
218: WHILE cntval--
219: DO chkerr();
220: printf("%.8s(", findsym(callpc,ISYM)==-1 ? "?":symbol.symc);
221: narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI
222: LOOP IF narg==0 THEN break; FI
223: printf("%R", get(argp += 4, DSP));
224: IF --narg!=0 THEN printc(','); FI
225: POOL
226: prints(")\n");
227:
228: IF modif=='C'
229: THEN WHILE localsym(frame,argp)
230: DO word=get(localval,DSP);
231: printf("%8t%.8s:%10t", symbol.symc);
232: IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%R\n",word); FI
233: OD
234: FI
235:
236: callpc=get(frame+16, DSP);
237: argp=get(frame+8, DSP);
238: lastframe=frame;
239: frame=get(frame+12, DSP)&EVEN;
240: IF frame==0 ORF (!adrflg ANDF (frame&0xF0000000)!=0x70000000)
241: THEN break;
242: FI
243: OD
244: break;
245:
246: #ifndef EDDT
247: /*print externals*/
248: case 'e': case 'E':
249: symset();
250: WHILE symp=symget()
251: DO chkerr();
252: IF symp->symf==(N_DATA|N_EXT) ORF symp->symf==(N_BSS|N_EXT)
253: THEN printf("%.8s:%12t%R\n", symp->symc, get(symp->symv,DSP));
254: FI
255: OD
256: break;
257:
258: case 'a': case 'A':
259: frame=(adrflg ? adrval : *(ADDR *)(((ADDR)&u)+FP));
260:
261: WHILE cntval--
262: DO chkerr();
263: stat=get(frame,DSP); dynam=get(frame+2,DSP); link=get(frame+4,DSP);
264: IF modif=='A'
265: THEN printf("%8O:%8t%-8o,%-8o,%-8o",frame,stat,dynam,link);
266: FI
267: IF stat==1 THEN break; FI
268: IF errflg THEN error(A68BAD); FI
269:
270: IF get(link-4,ISP)!=04767
271: THEN IF get(link-2,ISP)!=04775
272: THEN error(A68LNK);
273: ELSE /*compute entry point of routine*/
274: prints(" ? ");
275: FI
276: ELSE printf("%8t");
277: valpr(name=shorten(link)+get(link-2,ISP),ISYM);
278: name=get(leng(name-2),ISP);
279: printf("%8t\""); limit=8;
280: REP word=get(leng(name),DSP); name += 2;
281: lo=word&LOBYTE; hi=(word>>8)&LOBYTE;
282: printc(lo); printc(hi);
283: PER lo ANDF hi ANDF limit-- DONE
284: printc('"');
285: FI
286: limit=4; i=6; printf("%24targs:%8t");
287: WHILE limit--
288: DO printf("%8t%o",get(frame+i,DSP)); i += 2; OD
289: printc(EOR);
290:
291: frame=dynam;
292: OD
293: errflg=0;
294: flushbuf();
295: break;
296: #endif
297:
298: /*set default c frame*/
299: /*print breakpoints*/
300: case 'b': case 'B':
301: printf("breakpoints\ncount%8tbkpt%24tcommand\n");
302: FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
303: DO IF bkptr->flag
304: THEN printf("%-8.8d",bkptr->count);
305: psymoff(leng(bkptr->loc),ISYM,"%24t");
306: comptr=bkptr->comm;
307: WHILE *comptr DO printc(*comptr++); OD
308: FI
309: OD
310: break;
311:
312: default: error(BADMOD);
313: }
314:
315: }
316:
317: printmap(s,amap)
318: STRING s; MAP *amap;
319: {
320: int file;
321: file=amap->ufd;
322: printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
323: printf("b1 = %-16R",amap->b1);
324: printf("e1 = %-16R",amap->e1);
325: printf("f1 = %-16R",amap->f1);
326: printf("\nb2 = %-16R",amap->b2);
327: printf("e2 = %-16R",amap->e2);
328: printf("f2 = %-16R",amap->f2);
329: printc(EOR);
330: }
331:
332: printregs()
333: {
334: REG REGPTR p;
335: L_INT v;
336:
337: FOR p=reglist; p < ®list[24]; p++
338: DO printf("%s%6t%R %16t", p->rname, v= *(ADDR *)(((ADDR)&u)+p->roffs));
339: valpr(v,(p->roffs==PC?ISYM:DSYM));
340: printc(EOR);
341: OD
342: printpc();
343: }
344:
345: getreg(regnam)
346: {
347: REG REGPTR p;
348: REG STRING regptr;
349: CHAR *olp;
350: CHAR regnxt;
351:
352: olp=lp;
353: FOR p=reglist; p < ®list[24]; p++
354: DO regptr=p->rname;
355: IF (regnam == *regptr++)
356: THEN
357: WHILE *regptr
358: DO IF (regnxt=readchar()) != *regptr++
359: THEN --regptr; break;
360: FI
361: OD
362: IF *regptr
363: THEN lp=olp;
364: ELSE return(p->roffs);
365: FI
366: FI
367: OD
368: lp=olp;
369: return(0);
370: }
371:
372: printpc()
373: {
374: dot= *(ADDR *)(((ADDR)&u)+PC);
375: psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP));
376: printc(EOR);
377: }
378:
379: sigprint()
380: {
381: IF (signo>=0) ANDF (signo<=MAXSIG) THEN prints(signals[signo]); FI
382: }
383:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.