Research V7 development
[unix-history] / usr / src / cmd / adb / print.c
CommitLineData
d94e2462
M
1#
2/*
3 *
4 * UNIX debugger
5 *
6 */
7
8#include "defs.h"
9
10
11MSG LONGFIL;
12MSG NOTOPEN;
13MSG A68BAD;
14MSG A68LNK;
15MSG BADMOD;
16
17MAP txtmap;
18MAP datmap;
19
20SYMTAB symbol;
21INT lastframe;
22INT callpc;
23
24INT infile;
25INT outfile;
26CHAR *lp;
27INT maxoff;
28INT maxpos;
29INT octal;
30
31/* symbol management */
32L_INT localval;
33
34/* breakpoints */
35BKPTR bkpthead;
36
37REGLIST reglist [] {
38 "ps", ps,
39 "pc", pc,
40 "sp", sp,
41 "r5", r5,
42 "r4", r4,
43 "r3", r3,
44 "r2", r2,
45 "r1", r1,
46 "r0", r0,
47};
48
49INT frnames[] { 0, 3, 4, 5, 1, 2 };
50
51char lastc;
52POS corhdr[];
53POS *endhdr;
54
55INT fcor;
56STRING errflg;
57INT signo;
58
59
60L_INT dot;
61L_INT var[];
62STRING symfil;
63STRING corfil;
64INT pid;
65L_INT adrval;
66INT adrflg;
67L_INT cntval;
68INT cntflg;
69
70STRING signals[] {
71 "",
72 "hangup",
73 "interrupt",
74 "quit",
75 "illegal instruction",
76 "trace/BPT",
77 "IOT",
78 "EMT",
79 "floating exception",
80 "killed",
81 "bus error",
82 "memory fault",
83 "bad system call",
84 "broken pipe",
85 "alarm call",
86 "terminated",
87};
88
89
90
91
92/* general printing routines ($) */
93
94printtrace(modif)
95{
96 INT narg, i, stat, name, limit;
97 POS dynam;
98 REG BKPTR bkptr;
99 CHAR hi, lo;
100 INT word;
101 STRING comptr;
102 L_INT argp, frame, link;
103 SYMPTR symp;
104
105 IF cntflg==0 THEN cntval = -1; FI
106
107 switch (modif) {
108
109 case '<':
110 case '>':
111 {CHAR file[64];
112 INT index;
113
114 index=0;
115 IF modif=='<'
116 THEN iclose();
117 ELSE oclose();
118 FI
119 IF rdc()!=EOR
120 THEN REP file[index++]=lastc;
121 IF index>=63 THEN error(LONGFIL); FI
122 PER readchar()!=EOR DONE
123 file[index]=0;
124 IF modif=='<'
125 THEN infile=open(file,0);
126 IF infile<0
127 THEN infile=0; error(NOTOPEN);
128 FI
129 ELSE outfile=open(file,1);
130 IF outfile<0
131 THEN outfile=creat(file,0644);
132 ELSE lseek(outfile,0L,2);
133 FI
134 FI
135
136 FI
137 lp--;
138 }
139 break;
140
141 case 'o':
142 octal = TRUE; break;
143
144 case 'd':
145 octal = FALSE; break;
146
147 case 'q': case 'Q': case '%':
148 done();
149
150 case 'w': case 'W':
151 maxpos=(adrflg?adrval:MAXPOS);
152 break;
153
154 case 's': case 'S':
155 maxoff=(adrflg?adrval:MAXOFF);
156 break;
157
158 case 'v': case 'V':
159 prints("variables\n");
160 FOR i=0;i<=35;i++
161 DO IF var[i]
162 THEN printc((i<=9 ? '0' : 'a'-10) + i);
163 printf(" = %Q\n",var[i]);
164 FI
165 OD
166 break;
167
168 case 'm': case 'M':
169 printmap("? map",&txtmap);
170 printmap("/ map",&datmap);
171 break;
172
173 case 0: case '?':
174 IF pid
175 THEN printf("pcs id = %d\n",pid);
176 ELSE prints("no process\n");
177 FI
178 sigprint(); flushbuf();
179
180 case 'r': case 'R':
181 printregs();
182 return;
183
184 case 'f': case 'F':
185 printfregs(modif=='F');
186 return;
187
188 case 'c': case 'C':
189 frame=(adrflg?adrval:endhdr[r5])&EVEN; lastframe=0;
190 callpc=(adrflg?get(frame+2,DSP):endhdr[pc]);
191 WHILE cntval--
192 DO chkerr();
193 narg = findroutine(frame);
194 printf("%.8s(", symbol.symc);
195 argp = frame+4;
196 IF --narg >= 0
197 THEN printf("%o", get(argp, DSP));
198 FI
199 WHILE --narg >= 0
200 DO argp += 2;
201 printf(",%o", get(argp, DSP));
202 OD
203 prints(")\n");
204
205 IF modif=='C'
206 THEN WHILE localsym(frame)
207 DO word=get(localval,DSP);
208 printf("%8t%.8s:%10t", symbol.symc);
209 IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%o\n",word); FI
210 OD
211 FI
212
213 lastframe=frame;
214 frame=get(frame, DSP)&EVEN;
215 IF frame==0 THEN break; FI
216 OD
217 break;
218
219 /*print externals*/
220 case 'e': case 'E':
221 symset();
222 WHILE (symp=symget())
223 DO chkerr();
224 IF (symp->symf)==043 ORF (symp->symf)==044
225 THEN printf("%.8s:%12t%o\n", symp->symc, get(leng(symp->symv),DSP));
226 FI
227 OD
228 break;
229
230 case 'a': case 'A':
231 frame=(adrflg ? adrval : endhdr[r4]);
232
233 WHILE cntval--
234 DO chkerr();
235 stat=get(frame,DSP); dynam=get(frame+2,DSP); link=get(frame+4,DSP);
236 IF modif=='A'
237 THEN printf("%8O:%8t%-8o,%-8o,%-8o",frame,stat,dynam,link);
238 FI
239 IF stat==1 THEN break; FI
240 IF errflg THEN error(A68BAD); FI
241
242 IF get(link-4,ISP)!=04767
243 THEN IF get(link-2,ISP)!=04775
244 THEN error(A68LNK);
245 ELSE /*compute entry point of routine*/
246 prints(" ? ");
247 FI
248 ELSE printf("%8t");
249 valpr(name=shorten(link)+get(link-2,ISP),ISYM);
250 name=get(leng(name-2),ISP);
251 printf("%8t\""); limit=8;
252 REP word=get(leng(name),DSP); name += 2;
253 lo=word&LOBYTE; hi=(word>>8)&LOBYTE;
254 printc(lo); printc(hi);
255 PER lo ANDF hi ANDF limit-- DONE
256 printc('"');
257 FI
258 limit=4; i=6; printf("%24targs:%8t");
259 WHILE limit--
260 DO printf("%8t%o",get(frame+i,DSP)); i += 2; OD
261 printc(EOR);
262
263 frame=dynam;
264 OD
265 errflg=0;
266 flushbuf();
267 break;
268
269 /*set default c frame*/
270 /*print breakpoints*/
271 case 'b': case 'B':
272 printf("breakpoints\ncount%8tbkpt%24tcommand\n");
273 FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
274 DO IF bkptr->flag
275 THEN printf("%-8.8d",bkptr->count);
276 psymoff(leng(bkptr->loc),ISYM,"%24t");
277 comptr=bkptr->comm;
278 WHILE *comptr DO printc(*comptr++); OD
279 FI
280 OD
281 break;
282
283 default: error(BADMOD);
284 }
285
286}
287
288printmap(s,amap)
289STRING s; MAP *amap;
290{
291 int file;
292 file=amap->ufd;
293 printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
294 printf("b1 = %-16Q",amap->b1);
295 printf("e1 = %-16Q",amap->e1);
296 printf("f1 = %-16Q",amap->f1);
297 printf("\nb2 = %-16Q",amap->b2);
298 printf("e2 = %-16Q",amap->e2);
299 printf("f2 = %-16Q",amap->f2);
300 printc(EOR);
301}
302
303printfregs(longpr)
304{
305 REG i;
306 L_REAL f;
307
308 printf("fpsr %o\n", corhdr[0].fpsr);
309 FOR i=0; i<FRMAX; i++
310 DO IF corhdr[0].fpsr&FD ORF longpr /* long mode */
311 THEN f = corhdr[0].Lfr[frnames[i]];
312 ELSE f = corhdr[0].Sfr[frnames[i]];
313 FI
314 printf("fr%-8d%-32.18f\n", i, f);
315 OD
316}
317
318printregs()
319{
320 REG REGPTR p;
321 INT v;
322
323 FOR p=reglist; p < &reglist[9]; p++
324 DO printf("%s%8t%o%8t", p->rname, v=endhdr[p->roffs]);
325 valpr(v,(p->roffs==pc?ISYM:DSYM));
326 printc(EOR);
327 OD
328 printpc();
329}
330
331getreg(regnam)
332{
333 REG REGPTR p;
334 REG STRING regptr;
335 CHAR regnxt;
336 regnxt=readchar();
337 FOR p=reglist; p<&reglist[9]; p++
338 DO regptr=p->rname;
339 IF (regnam == *regptr++) ANDF (regnxt == *regptr)
340 THEN return(p->roffs);
341 FI
342 OD
343 lp--;
344 return(0);
345}
346
347printpc()
348{
349 dot=endhdr[pc];
350 psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP));
351 printc(EOR);
352}
353
354sigprint()
355{
356 prints(signals[signo]);
357}
358