1 static char sccsid[] = "@(#)print.c 4.11 05/02/85"; 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 in extended pcb must be signal trampoline code */ 287 IF KERNOFF - ctob(UPAGES) < callpc ANDF 288 (unsigned)callpc < KERNOFF 289 THEN name = "sigtramp"; 290 ntramp++; 291 ELSE ntramp = 0; 292 findsym(callpc,ISYM); 293 IF cursym ANDF 294 !strcmp(cursym->n_un.n_name, "start") 295 THEN break; 296 FI 297 IF cursym 298 THEN name = cursym->n_un.n_name; 299 ELSE name = "?"; 300 FI 301 FI 302 printf("%s(", name); 303 narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI 304 LOOP IF narg==0 THEN break; FI 305 printf("%R", get(argp += 4, DSP)); 306 IF --narg!=0 THEN printc(','); FI 307 POOL 308 IF ntramp == 1 309 THEN callpc=get(frame+92, DSP); 310 ELSE callpc=get(frame+16, DSP); 311 FI 312 IF callpc != 0 313 THEN prints(") from "); 314 psymoff(callpc, ISYM, "\n"); 315 ELSE prints(")\n"); 316 FI 317 318 IF modif=='C' 319 THEN WHILE localsym(frame,argp) 320 DO word=get(localval,DSP); 321 printf("%8t%s:%10t", 322 cursym->n_un.n_name); 323 IF errflg 324 THEN prints("?\n"); errflg=0; 325 ELSE printf("%R\n",word); 326 FI 327 OD 328 FI 329 330 argp=get(frame+8, DSP); 331 lastframe=frame; 332 frame=get(frame+12, DSP)&EVEN; 333 IF frame==0 THEN break; FI 334 IF !adrflg ANDF !INSTACK(frame) 335 THEN IF !kcore ORF !kstackaddr(frame) 336 THEN break; 337 FI 338 FI 339 OD 340 break; 341 342 /*print externals*/ 343 case 'e': case 'E': 344 FOR sp = symtab; sp < esymtab; sp++ 345 DO IF sp->n_type == (N_DATA|N_EXT) ORF 346 sp->n_type == (N_BSS|N_EXT) 347 THEN printf("%s:%12t%R\n", sp->n_un.n_name, 348 get(sp->n_value,DSP)); 349 FI 350 OD 351 break; 352 353 case 'a': case 'A': 354 error("No algol 68 on VAX"); 355 /*NOTREACHED*/ 356 357 /*print breakpoints*/ 358 case 'b': case 'B': 359 printf("breakpoints\ncount%8tbkpt%24tcommand\n"); 360 FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt 361 DO IF bkptr->flag 362 THEN printf("%-8.8d",bkptr->count); 363 psymoff(leng(bkptr->loc),ISYM,"%24t"); 364 comptr=bkptr->comm; 365 WHILE *comptr DO printc(*comptr++); OD 366 FI 367 OD 368 break; 369 370 default: 371 error(BADMOD); 372 } 373 374 } 375 376 printmap(s,amap) 377 STRING s; MAP *amap; 378 { 379 int file; 380 file=amap->ufd; 381 printf("%s%12t`%s'\n", s, 382 (file<0 ? "-" : (file==fcor ? corfil : symfil))); 383 printf("b1 = %-16R",amap->b1); 384 printf("e1 = %-16R",amap->e1); 385 printf("f1 = %-16R",amap->f1); 386 printf("\nb2 = %-16R",amap->b2); 387 printf("e2 = %-16R",amap->e2); 388 printf("f2 = %-16R",amap->f2); 389 printc(EOR); 390 } 391 392 printregs() 393 { 394 REG REGPTR p; 395 L_INT v; 396 397 FOR p=reglist; p < ®list[24]; p++ 398 DO v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs); 399 printf("%s%6t%R %16t", p->rname, v); 400 valpr(v,(p->roffs==PC?ISYM:DSYM)); 401 printc(EOR); 402 OD 403 printpc(); 404 } 405 406 getreg(regnam) { 407 REG REGPTR p; 408 REG STRING regptr; 409 CHAR *olp; 410 CHAR regnxt; 411 412 olp=lp; 413 FOR p=reglist; p < ®list[24]; p++ 414 DO regptr=p->rname; 415 IF (regnam == *regptr++) 416 THEN 417 WHILE *regptr 418 DO IF (regnxt=readchar()) != *regptr++ 419 THEN --regptr; break; 420 FI 421 OD 422 IF *regptr 423 THEN lp=olp; 424 ELSE 425 int i = kcore ? (int)p->rkern : p->roffs; 426 return (i); 427 FI 428 FI 429 OD 430 lp=olp; 431 return(0); 432 } 433 434 printpc() 435 { 436 dot= *(ADDR *)(((ADDR)&u)+PC); 437 psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP)); 438 printc(EOR); 439 } 440 441 char *illinames[] = { 442 "reserved addressing fault", 443 "priviliged instruction fault", 444 "reserved operand fault" 445 }; 446 char *fpenames[] = { 447 0, 448 "integer overflow trap", 449 "integer divide by zero trap", 450 "floating overflow trap", 451 "floating/decimal divide by zero trap", 452 "floating underflow trap", 453 "decimal overflow trap", 454 "subscript out of range trap", 455 "floating overflow fault", 456 "floating divide by zero fault", 457 "floating undeflow fault" 458 }; 459 460 sigprint() 461 { 462 IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0]) 463 THEN prints(signals[signo]); FI 464 switch (signo) { 465 466 case SIGFPE: 467 IF (sigcode > 0 && 468 sigcode < sizeof fpenames / sizeof fpenames[0]) THEN 469 prints(" ("); prints(fpenames[sigcode]); prints(")"); 470 FI 471 break; 472 473 case SIGILL: 474 IF (sigcode >= 0 && 475 sigcode < sizeof illinames / sizeof illinames[0]) THEN 476 prints(" ("); prints(illinames[sigcode]); prints(")"); 477 FI 478 break; 479 } 480 } 481