1 static char sccsid[] = "@(#)print.c 4.5 07/23/82"; 2 /* 3 * 4 * UNIX debugger 5 * 6 */ 7 #include "defs.h" 8 9 MSG LONGFIL; 10 MSG NOTOPEN; 11 MSG A68BAD; 12 MSG A68LNK; 13 MSG BADMOD; 14 15 MAP txtmap; 16 MAP datmap; 17 18 ADDR lastframe; 19 ADDR callpc; 20 21 INT infile; 22 INT outfile; 23 CHAR *lp; 24 L_INT maxoff; 25 L_INT maxpos; 26 INT radix; 27 28 /* symbol management */ 29 L_INT localval; 30 31 /* breakpoints */ 32 BKPTR bkpthead; 33 34 REGLIST reglist [] = { 35 "p1lr", P1LR, &pcb.pcb_p1lr, 36 "p1br", P1BR, &pcb.pcb_p1br, 37 "p0lr", P0LR, &pcb.pcb_p0lr, 38 "p0br", P0BR, &pcb.pcb_p0br, 39 "ksp", KSP, &pcb.pcb_ksp, 40 "esp", ESP, &pcb.pcb_esp, 41 "ssp", SSP, &pcb.pcb_ssp, 42 "psl", PSL, &pcb.pcb_psl, 43 "pc", PC, &pcb.pcb_pc, 44 "usp", USP, &pcb.pcb_usp, 45 "fp", FP, &pcb.pcb_fp, 46 "ap", AP, &pcb.pcb_ap, 47 "r11", R11, &pcb.pcb_r11, 48 "r10", R10, &pcb.pcb_r10, 49 "r9", R9, &pcb.pcb_r9, 50 "r8", R8, &pcb.pcb_r8, 51 "r7", R7, &pcb.pcb_r7, 52 "r6", R6, &pcb.pcb_r6, 53 "r5", R5, &pcb.pcb_r5, 54 "r4", R4, &pcb.pcb_r4, 55 "r3", R3, &pcb.pcb_r3, 56 "r2", R2, &pcb.pcb_r2, 57 "r1", R1, &pcb.pcb_r1, 58 "r0", R0, &pcb.pcb_r0, 59 }; 60 61 char lastc; 62 63 INT fcor; 64 STRING errflg; 65 INT signo; 66 INT sigcode; 67 68 69 L_INT dot; 70 L_INT var[]; 71 STRING symfil; 72 STRING corfil; 73 INT pid; 74 L_INT adrval; 75 INT adrflg; 76 L_INT cntval; 77 INT cntflg; 78 79 STRING signals[] = { 80 "", 81 "hangup", 82 "interrupt", 83 "quit", 84 "illegal instruction", 85 "trace/BPT", 86 "IOT", 87 "EMT", 88 "floating exception", 89 "killed", 90 "bus error", 91 "memory fault", 92 "bad system call", 93 "broken pipe", 94 "alarm call", 95 "terminated", 96 "signal 16", 97 "stop (signal)", 98 "stop (tty)", 99 "continue (signal)", 100 "child termination", 101 "stop (tty input)", 102 "stop (tty output)", 103 "input available (signal)", 104 "cpu timelimit", 105 "file sizelimit", 106 "signal 26", 107 "signal 27", 108 "signal 28", 109 "signal 29", 110 "signal 30", 111 "signal 31", 112 }; 113 114 /* general printing routines ($) */ 115 116 printtrace(modif) 117 { 118 INT narg, i, stat, name, limit; 119 POS dynam; 120 REG BKPTR bkptr; 121 CHAR hi, lo; 122 ADDR word; 123 STRING comptr; 124 ADDR argp, frame, link; 125 register struct nlist *sp; 126 INT stack; 127 INT ntramp; 128 129 IF cntflg==0 THEN cntval = -1; FI 130 131 switch (modif) { 132 133 case '<': 134 IF cntval == 0 135 THEN WHILE readchar() != EOR 136 DO OD 137 lp--; 138 break; 139 FI 140 IF rdc() == '<' 141 THEN stack = 1; 142 ELSE stack = 0; lp--; 143 FI 144 /* fall through */ 145 case '>': 146 {CHAR file[64]; 147 CHAR Ifile[128]; 148 extern CHAR *Ipath; 149 INT index; 150 151 index=0; 152 IF rdc()!=EOR 153 THEN REP file[index++]=lastc; 154 IF index>=63 THEN error(LONGFIL); FI 155 PER readchar()!=EOR DONE 156 file[index]=0; 157 IF modif=='<' 158 THEN IF Ipath THEN 159 strcpy(Ifile, Ipath); 160 strcat(Ifile, "/"); 161 strcat(Ifile, file); 162 FI 163 IF strcmp(file, "-")!=0 164 THEN iclose(stack, 0); 165 infile=open(file,0); 166 IF infile<0 167 THEN infile=open(Ifile,0); 168 FI 169 ELSE lseek(infile, 0L, 0); 170 FI 171 IF infile<0 172 THEN infile=0; error(NOTOPEN); 173 ELSE IF cntflg 174 THEN var[9] = cntval; 175 ELSE var[9] = 1; 176 FI 177 FI 178 ELSE oclose(); 179 outfile=open(file,1); 180 IF outfile<0 181 THEN outfile=creat(file,0644); 182 #ifndef EDDT 183 ELSE lseek(outfile,0L,2); 184 #endif 185 FI 186 FI 187 188 ELSE IF modif == '<' 189 THEN iclose(-1, 0); 190 ELSE oclose(); 191 FI 192 FI 193 lp--; 194 } 195 break; 196 197 case 'p': 198 IF kernel == 0 THEN 199 printf("not debugging kernel\n"); 200 ELSE 201 IF adrflg THEN 202 int pte = access(RD, dot, DSP, 0); 203 masterpcbb = (pte&PG_PFNUM)*512; 204 FI 205 getpcb(); 206 FI 207 break; 208 209 case 'd': 210 if (adrflg) { 211 if (adrval<2 || adrval>16) {printf("must have 2 <= radix <= 16"); break;} 212 printf("radix=%d base ten",radix=adrval); 213 } 214 break; 215 216 case 'q': case 'Q': case '%': 217 done(); 218 219 case 'w': case 'W': 220 maxpos=(adrflg?adrval:MAXPOS); 221 break; 222 223 case 's': case 'S': 224 maxoff=(adrflg?adrval:MAXOFF); 225 break; 226 227 case 'v': case 'V': 228 prints("variables\n"); 229 FOR i=0;i<=35;i++ 230 DO IF var[i] 231 THEN printc((i<=9 ? '0' : 'a'-10) + i); 232 printf(" = %X\n",var[i]); 233 FI 234 OD 235 break; 236 237 case 'm': case 'M': 238 printmap("? map",&txtmap); 239 printmap("/ map",&datmap); 240 break; 241 242 case 0: case '?': 243 IF pid 244 THEN printf("pcs id = %d\n",pid); 245 ELSE prints("no process\n"); 246 FI 247 sigprint(); flushbuf(); 248 249 case 'r': case 'R': 250 printregs(); 251 return; 252 253 case 'c': case 'C': 254 IF adrflg 255 THEN frame=adrval; 256 word=get(adrval+6,DSP)&0xFFFF; 257 IF word&0x2000 258 THEN /* 'calls', can figure out argp */ 259 argp=adrval+20+((word>>14)&3); word &= 0xFFF; 260 WHILE word DO IF word&1 THEN argp+=4; FI word>>=1; OD 261 ELSE /* 'callg', can't tell where argp is */ argp=frame; 262 FI 263 callpc=get(frame+16,DSP); 264 ELIF kcore THEN 265 argp = pcb.pcb_ap; 266 frame = pcb.pcb_fp; 267 callpc = pcb.pcb_pc; 268 ELSE argp= *(ADDR *)(((ADDR)&u)+AP); 269 frame= *(ADDR *)(((ADDR)&u)+FP); 270 callpc= *(ADDR *)(((ADDR)&u)+PC); 271 FI 272 lastframe=0; 273 ntramp = 0; 274 WHILE cntval-- 275 DO char *name; 276 chkerr(); 277 if (callpc > 0x80000000 - 0x200 * UPAGES) { 278 name = "sigtramp"; 279 ntramp++; 280 } else { 281 ntramp = 0; 282 findsym(callpc,ISYM); 283 if (cursym && 284 !strcmp(cursym->n_un.n_name, "start")) 285 break; 286 if (cursym) 287 name = cursym->n_un.n_name; 288 else 289 name = "?"; 290 } 291 printf("%s(", name); 292 narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI 293 LOOP IF narg==0 THEN break; FI 294 printf("%R", get(argp += 4, DSP)); 295 IF --narg!=0 THEN printc(','); FI 296 POOL 297 printf(") from %X\n",callpc); /* jkf mod */ 298 299 IF modif=='C' 300 THEN WHILE localsym(frame,argp) 301 DO word=get(localval,DSP); 302 printf("%8t%s:%10t", cursym->n_un.n_name); 303 IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%R\n",word); FI 304 OD 305 FI 306 307 if (ntramp == 1) 308 callpc=get(frame+64, DSP); 309 else 310 callpc=get(frame+16, DSP); 311 argp=get(frame+8, DSP); 312 lastframe=frame; 313 frame=get(frame+12, DSP)&EVEN; 314 IF frame==0 ORF (!adrflg ANDF !INSTACK(frame)) 315 THEN break; 316 FI 317 OD 318 break; 319 320 /*print externals*/ 321 case 'e': case 'E': 322 for (sp = symtab; sp < esymtab; sp++) { 323 if (sp->n_type==(N_DATA|N_EXT) ORF sp->n_type==(N_BSS|N_EXT)) 324 printf("%s:%12t%R\n", sp->n_un.n_name, get(sp->n_value,DSP)); 325 } 326 break; 327 328 case 'a': case 'A': 329 error("No algol 68 on VAX"); 330 /*NOTREACHED*/ 331 332 /*print breakpoints*/ 333 case 'b': case 'B': 334 printf("breakpoints\ncount%8tbkpt%24tcommand\n"); 335 for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt) 336 if (bkptr->flag) { 337 printf("%-8.8d",bkptr->count); 338 psymoff(leng(bkptr->loc),ISYM,"%24t"); 339 comptr=bkptr->comm; 340 WHILE *comptr DO printc(*comptr++); OD 341 } 342 break; 343 344 default: error(BADMOD); 345 } 346 347 } 348 349 printmap(s,amap) 350 STRING s; MAP *amap; 351 { 352 int file; 353 file=amap->ufd; 354 printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil))); 355 printf("b1 = %-16R",amap->b1); 356 printf("e1 = %-16R",amap->e1); 357 printf("f1 = %-16R",amap->f1); 358 printf("\nb2 = %-16R",amap->b2); 359 printf("e2 = %-16R",amap->e2); 360 printf("f2 = %-16R",amap->f2); 361 printc(EOR); 362 } 363 364 printregs() 365 { 366 REG REGPTR p; 367 L_INT v; 368 369 FOR p=reglist; p < ®list[24]; p++ 370 DO v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs); 371 printf("%s%6t%R %16t", p->rname, v); 372 valpr(v,(p->roffs==PC?ISYM:DSYM)); 373 printc(EOR); 374 OD 375 printpc(); 376 } 377 378 getreg(regnam) { 379 REG REGPTR p; 380 REG STRING regptr; 381 CHAR *olp; 382 CHAR regnxt; 383 384 olp=lp; 385 FOR p=reglist; p < ®list[24]; p++ 386 DO regptr=p->rname; 387 IF (regnam == *regptr++) 388 THEN 389 WHILE *regptr 390 DO IF (regnxt=readchar()) != *regptr++ 391 THEN --regptr; break; 392 FI 393 OD 394 IF *regptr 395 THEN lp=olp; 396 ELSE 397 int i = kcore ? (int)p->rkern : p->roffs; 398 return (i); 399 FI 400 FI 401 OD 402 lp=olp; 403 return(0); 404 } 405 406 printpc() 407 { 408 dot= *(ADDR *)(((ADDR)&u)+PC); 409 psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP)); 410 printc(EOR); 411 } 412 413 char *illinames[] = { 414 "reserved addressing fault", 415 "priviliged instruction fault", 416 "reserved operand fault" 417 }; 418 char *fpenames[] = { 419 0, 420 "integer overflow trap", 421 "integer divide by zero trap", 422 "floating overflow trap", 423 "floating/decimal divide by zero trap", 424 "floating underflow trap", 425 "decimal overflow trap", 426 "subscript out of range trap", 427 "floating overflow fault", 428 "floating divide by zero fault", 429 "floating undeflow fault" 430 }; 431 432 sigprint() 433 { 434 IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0]) 435 THEN prints(signals[signo]); FI 436 switch (signo) { 437 438 case SIGFPE: 439 IF (sigcode > 0 && 440 sigcode < sizeof fpenames / sizeof fpenames[0]) THEN 441 prints(" ("); prints(fpenames[sigcode]); prints(")"); 442 FI 443 break; 444 445 case SIGILL: 446 IF (sigcode >= 0 && 447 sigcode < sizeof illinames / sizeof illinames[0]) THEN 448 prints(" ("); prints(illinames[sigcode]); prints(")"); 449 FI 450 break; 451 } 452 } 453