Commit | Line | Data |
---|---|---|
d94e2462 M |
1 | # |
2 | /* | |
3 | * | |
4 | * UNIX debugger | |
5 | * | |
6 | */ | |
7 | ||
8 | #include "defs.h" | |
9 | ||
10 | ||
11 | MSG LONGFIL; | |
12 | MSG NOTOPEN; | |
13 | MSG A68BAD; | |
14 | MSG A68LNK; | |
15 | MSG BADMOD; | |
16 | ||
17 | MAP txtmap; | |
18 | MAP datmap; | |
19 | ||
20 | SYMTAB symbol; | |
21 | INT lastframe; | |
22 | INT callpc; | |
23 | ||
24 | INT infile; | |
25 | INT outfile; | |
26 | CHAR *lp; | |
27 | INT maxoff; | |
28 | INT maxpos; | |
29 | INT octal; | |
30 | ||
31 | /* symbol management */ | |
32 | L_INT localval; | |
33 | ||
34 | /* breakpoints */ | |
35 | BKPTR bkpthead; | |
36 | ||
37 | REGLIST 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 | ||
49 | INT frnames[] { 0, 3, 4, 5, 1, 2 }; | |
50 | ||
51 | char lastc; | |
52 | POS corhdr[]; | |
53 | POS *endhdr; | |
54 | ||
55 | INT fcor; | |
56 | STRING errflg; | |
57 | INT signo; | |
58 | ||
59 | ||
60 | L_INT dot; | |
61 | L_INT var[]; | |
62 | STRING symfil; | |
63 | STRING corfil; | |
64 | INT pid; | |
65 | L_INT adrval; | |
66 | INT adrflg; | |
67 | L_INT cntval; | |
68 | INT cntflg; | |
69 | ||
70 | STRING 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 | ||
94 | printtrace(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 | ||
288 | printmap(s,amap) | |
289 | STRING 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 | ||
303 | printfregs(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 | ||
318 | printregs() | |
319 | { | |
320 | REG REGPTR p; | |
321 | INT v; | |
322 | ||
323 | FOR p=reglist; p < ®list[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 | ||
331 | getreg(regnam) | |
332 | { | |
333 | REG REGPTR p; | |
334 | REG STRING regptr; | |
335 | CHAR regnxt; | |
336 | regnxt=readchar(); | |
337 | FOR p=reglist; p<®list[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 | ||
347 | printpc() | |
348 | { | |
349 | dot=endhdr[pc]; | |
350 | psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP)); | |
351 | printc(EOR); | |
352 | } | |
353 | ||
354 | sigprint() | |
355 | { | |
356 | prints(signals[signo]); | |
357 | } | |
358 |