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