1 static char sccsid[] = "@(#)print.c 4.8 12/30/84"; 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 thru... */ 145 146 case '>': 147 {CHAR file[64]; 148 CHAR Ifile[128]; 149 extern CHAR *Ipath; 150 INT index; 151 152 index=0; 153 IF rdc()!=EOR 154 THEN REP file[index++]=lastc; 155 IF index>=63 THEN error(LONGFIL); FI 156 PER readchar()!=EOR DONE 157 file[index]=0; 158 IF modif=='<' 159 THEN IF Ipath THEN 160 strcpy(Ifile, Ipath); 161 strcat(Ifile, "/"); 162 strcat(Ifile, file); 163 FI 164 IF strcmp(file, "-")!=0 165 THEN iclose(stack, 0); 166 infile=open(file,0); 167 IF infile<0 168 THEN infile=open(Ifile,0); 169 FI 170 ELSE lseek(infile, 0L, 0); 171 FI 172 IF infile<0 173 THEN infile=0; error(NOTOPEN); 174 ELSE IF cntflg 175 THEN var[9] = cntval; 176 ELSE var[9] = 1; 177 FI 178 FI 179 ELSE oclose(); 180 outfile=open(file,1); 181 IF outfile<0 182 THEN outfile=creat(file,0644); 183 #ifndef EDDT 184 ELSE lseek(outfile,0L,2); 185 #endif 186 FI 187 FI 188 189 ELSE IF modif == '<' 190 THEN iclose(-1, 0); 191 ELSE oclose(); 192 FI 193 FI 194 lp--; 195 } 196 break; 197 198 case 'p': 199 IF kernel == 0 200 THEN printf("not debugging kernel\n"); 201 ELSE IF adrflg 202 THEN 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 THEN IF adrval < 2 ORF adrval > 16 212 THEN printf("must have 2 <= radix <= 16"); 213 break; 214 FI 215 printf("radix=%d base ten",radix=adrval); 216 FI 217 break; 218 219 case 'q': case 'Q': case '%': 220 done(); 221 222 case 'w': case 'W': 223 maxpos=(adrflg?adrval:MAXPOS); 224 break; 225 226 case 's': case 'S': 227 maxoff=(adrflg?adrval:MAXOFF); 228 break; 229 230 case 'v': case 'V': 231 prints("variables\n"); 232 FOR i=0;i<=35;i++ 233 DO IF var[i] 234 THEN printc((i<=9 ? '0' : 'a'-10) + i); 235 printf(" = %X\n",var[i]); 236 FI 237 OD 238 break; 239 240 case 'm': case 'M': 241 printmap("? map",&txtmap); 242 printmap("/ map",&datmap); 243 break; 244 245 case 0: case '?': 246 IF pid 247 THEN printf("pcs id = %d\n",pid); 248 ELSE prints("no process\n"); 249 FI 250 sigprint(); flushbuf(); 251 252 case 'r': case 'R': 253 printregs(); 254 return; 255 256 case 'c': case 'C': 257 IF adrflg 258 THEN frame=adrval; 259 word=get(adrval+6,DSP)&0xFFFF; 260 IF word&0x2000 261 THEN /* 'calls', can figure out argp */ 262 argp=adrval+20+((word>>14)&3); word &= 0xFFF; 263 WHILE word 264 DO IF word&1 265 THEN argp+=4; 266 FI 267 word>>=1; 268 OD 269 ELSE /* 'callg', can't tell where argp is */ 270 argp=frame; 271 FI 272 callpc=get(frame+16,DSP); 273 ELIF kcore 274 THEN argp = pcb.pcb_ap; 275 frame = pcb.pcb_fp; 276 callpc = pcb.pcb_pc; 277 ELSE argp= *(ADDR *)(((ADDR)&u)+AP); 278 frame= *(ADDR *)(((ADDR)&u)+FP); 279 callpc= *(ADDR *)(((ADDR)&u)+PC); 280 FI 281 lastframe=0; 282 ntramp = 0; 283 WHILE cntval-- 284 DO char *name; 285 chkerr(); 286 IF callpc > 0x80000000 - 0x200 * UPAGES 287 THEN name = "sigtramp"; 288 ntramp++; 289 ELSE ntramp = 0; 290 findsym(callpc,ISYM); 291 IF cursym ANDF 292 !strcmp(cursym->n_un.n_name, "start") 293 THEN break; 294 FI 295 IF cursym 296 THEN name = cursym->n_un.n_name; 297 ELSE name = "?"; 298 FI 299 FI 300 printf("%s(", name); 301 narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI 302 LOOP IF narg==0 THEN break; FI 303 printf("%R", get(argp += 4, DSP)); 304 IF --narg!=0 THEN printc(','); FI 305 POOL 306 printf(") from %X\n",callpc); 307 308 IF modif=='C' 309 THEN WHILE localsym(frame,argp) 310 DO word=get(localval,DSP); 311 printf("%8t%s:%10t", 312 cursym->n_un.n_name); 313 IF errflg 314 THEN prints("?\n"); errflg=0; 315 ELSE printf("%R\n",word); 316 FI 317 OD 318 FI 319 320 IF ntramp == 1 321 THEN callpc=get(frame+84, DSP); 322 ELSE callpc=get(frame+16, DSP); 323 FI 324 argp=get(frame+8, DSP); 325 lastframe=frame; 326 frame=get(frame+12, DSP)&EVEN; 327 IF frame==0 THEN break; FI 328 IF !adrflg ANDF !INSTACK(frame) 329 THEN IF !kcore ORF !kstackaddr(frame) 330 THEN break; 331 FI 332 FI 333 OD 334 break; 335 336 /*print externals*/ 337 case 'e': case 'E': 338 FOR sp = symtab; sp < esymtab; sp++ 339 DO IF sp->n_type == (N_DATA|N_EXT) ORF 340 sp->n_type == (N_BSS|N_EXT) 341 THEN printf("%s:%12t%R\n", sp->n_un.n_name, 342 get(sp->n_value,DSP)); 343 FI 344 OD 345 break; 346 347 case 'a': case 'A': 348 error("No algol 68 on VAX"); 349 /*NOTREACHED*/ 350 351 /*print breakpoints*/ 352 case 'b': case 'B': 353 printf("breakpoints\ncount%8tbkpt%24tcommand\n"); 354 FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt 355 DO IF bkptr->flag 356 THEN printf("%-8.8d",bkptr->count); 357 psymoff(leng(bkptr->loc),ISYM,"%24t"); 358 comptr=bkptr->comm; 359 WHILE *comptr DO printc(*comptr++); OD 360 FI 361 OD 362 break; 363 364 default: 365 error(BADMOD); 366 } 367 368 } 369 370 printmap(s,amap) 371 STRING s; MAP *amap; 372 { 373 int file; 374 file=amap->ufd; 375 printf("%s%12t`%s'\n", s, 376 (file<0 ? "-" : (file==fcor ? corfil : symfil))); 377 printf("b1 = %-16R",amap->b1); 378 printf("e1 = %-16R",amap->e1); 379 printf("f1 = %-16R",amap->f1); 380 printf("\nb2 = %-16R",amap->b2); 381 printf("e2 = %-16R",amap->e2); 382 printf("f2 = %-16R",amap->f2); 383 printc(EOR); 384 } 385 386 printregs() 387 { 388 REG REGPTR p; 389 L_INT v; 390 391 FOR p=reglist; p < ®list[24]; p++ 392 DO v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs); 393 printf("%s%6t%R %16t", p->rname, v); 394 valpr(v,(p->roffs==PC?ISYM:DSYM)); 395 printc(EOR); 396 OD 397 printpc(); 398 } 399 400 getreg(regnam) { 401 REG REGPTR p; 402 REG STRING regptr; 403 CHAR *olp; 404 CHAR regnxt; 405 406 olp=lp; 407 FOR p=reglist; p < ®list[24]; p++ 408 DO regptr=p->rname; 409 IF (regnam == *regptr++) 410 THEN 411 WHILE *regptr 412 DO IF (regnxt=readchar()) != *regptr++ 413 THEN --regptr; break; 414 FI 415 OD 416 IF *regptr 417 THEN lp=olp; 418 ELSE 419 int i = kcore ? (int)p->rkern : p->roffs; 420 return (i); 421 FI 422 FI 423 OD 424 lp=olp; 425 return(0); 426 } 427 428 printpc() 429 { 430 dot= *(ADDR *)(((ADDR)&u)+PC); 431 psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP)); 432 printc(EOR); 433 } 434 435 char *illinames[] = { 436 "reserved addressing fault", 437 "priviliged instruction fault", 438 "reserved operand fault" 439 }; 440 char *fpenames[] = { 441 0, 442 "integer overflow trap", 443 "integer divide by zero trap", 444 "floating overflow trap", 445 "floating/decimal divide by zero trap", 446 "floating underflow trap", 447 "decimal overflow trap", 448 "subscript out of range trap", 449 "floating overflow fault", 450 "floating divide by zero fault", 451 "floating undeflow fault" 452 }; 453 454 sigprint() 455 { 456 IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0]) 457 THEN prints(signals[signo]); FI 458 switch (signo) { 459 460 case SIGFPE: 461 IF (sigcode > 0 && 462 sigcode < sizeof fpenames / sizeof fpenames[0]) THEN 463 prints(" ("); prints(fpenames[sigcode]); prints(")"); 464 FI 465 break; 466 467 case SIGILL: 468 IF (sigcode >= 0 && 469 sigcode < sizeof illinames / sizeof illinames[0]) THEN 470 prints(" ("); prints(illinames[sigcode]); prints(")"); 471 FI 472 break; 473 } 474 } 475