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