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