1*3779Sroot static char sccsid[] = "@(#)print.c 4.4 05/15/81"; 23764Sroot /* 33764Sroot * 43764Sroot * UNIX debugger 53764Sroot * 63764Sroot */ 73764Sroot #include "defs.h" 83764Sroot 93764Sroot MSG LONGFIL; 103764Sroot MSG NOTOPEN; 113764Sroot MSG A68BAD; 123764Sroot MSG A68LNK; 133764Sroot MSG BADMOD; 143764Sroot 153764Sroot MAP txtmap; 163764Sroot MAP datmap; 173764Sroot 183764Sroot ADDR lastframe; 193764Sroot ADDR callpc; 203764Sroot 213764Sroot INT infile; 223764Sroot INT outfile; 233764Sroot CHAR *lp; 243764Sroot L_INT maxoff; 253764Sroot L_INT maxpos; 263764Sroot INT radix; 273764Sroot 283764Sroot /* symbol management */ 293764Sroot L_INT localval; 303764Sroot 313764Sroot /* breakpoints */ 323764Sroot BKPTR bkpthead; 333764Sroot 343764Sroot REGLIST reglist [] = { 353777Sroot "p1lr", P1LR, &pcb.pcb_p1lr, 363777Sroot "p1br", P1BR, &pcb.pcb_p1br, 373777Sroot "p0lr", P0LR, &pcb.pcb_p0lr, 383777Sroot "p0br", P0BR, &pcb.pcb_p0br, 393777Sroot "ksp", KSP, &pcb.pcb_ksp, 403777Sroot "esp", ESP, &pcb.pcb_esp, 413777Sroot "ssp", SSP, &pcb.pcb_ssp, 423777Sroot "psl", PSL, &pcb.pcb_psl, 433777Sroot "pc", PC, &pcb.pcb_pc, 443777Sroot "usp", USP, &pcb.pcb_usp, 453777Sroot "fp", FP, &pcb.pcb_fp, 463777Sroot "ap", AP, &pcb.pcb_ap, 473777Sroot "r11", R11, &pcb.pcb_r11, 483777Sroot "r10", R10, &pcb.pcb_r10, 493777Sroot "r9", R9, &pcb.pcb_r9, 503777Sroot "r8", R8, &pcb.pcb_r8, 513777Sroot "r7", R7, &pcb.pcb_r7, 523777Sroot "r6", R6, &pcb.pcb_r6, 533777Sroot "r5", R5, &pcb.pcb_r5, 543777Sroot "r4", R4, &pcb.pcb_r4, 553777Sroot "r3", R3, &pcb.pcb_r3, 563777Sroot "r2", R2, &pcb.pcb_r2, 573777Sroot "r1", R1, &pcb.pcb_r1, 583777Sroot "r0", R0, &pcb.pcb_r0, 593764Sroot }; 603764Sroot 613764Sroot char lastc; 623764Sroot 633764Sroot INT fcor; 643764Sroot STRING errflg; 653764Sroot INT signo; 663764Sroot INT sigcode; 673764Sroot 683764Sroot 693764Sroot L_INT dot; 703764Sroot L_INT var[]; 713764Sroot STRING symfil; 723764Sroot STRING corfil; 733764Sroot INT pid; 743764Sroot L_INT adrval; 753764Sroot INT adrflg; 763764Sroot L_INT cntval; 773764Sroot INT cntflg; 783764Sroot 793764Sroot STRING signals[] = { 803764Sroot "", 813764Sroot "hangup", 823764Sroot "interrupt", 833764Sroot "quit", 843764Sroot "illegal instruction", 853764Sroot "trace/BPT", 863764Sroot "IOT", 873764Sroot "EMT", 883764Sroot "floating exception", 893764Sroot "killed", 903764Sroot "bus error", 913764Sroot "memory fault", 923764Sroot "bad system call", 933764Sroot "broken pipe", 943764Sroot "alarm call", 953764Sroot "terminated", 963764Sroot "signal 16", 973764Sroot "stop (signal)", 983764Sroot "stop (tty)", 993764Sroot "continue (signal)", 1003764Sroot "child termination", 1013764Sroot "stop (tty input)", 1023764Sroot "stop (tty output)", 1033764Sroot "input available (signal)", 1043764Sroot "cpu timelimit", 1053764Sroot "file sizelimit", 1063764Sroot "signal 26", 1073764Sroot "signal 27", 1083764Sroot "signal 28", 1093764Sroot "signal 29", 1103764Sroot "signal 30", 1113764Sroot "signal 31", 1123764Sroot }; 1133764Sroot 1143764Sroot /* general printing routines ($) */ 1153764Sroot 1163764Sroot printtrace(modif) 1173764Sroot { 1183764Sroot INT narg, i, stat, name, limit; 1193764Sroot POS dynam; 1203764Sroot REG BKPTR bkptr; 1213764Sroot CHAR hi, lo; 1223764Sroot ADDR word; 1233764Sroot STRING comptr; 1243764Sroot ADDR argp, frame, link; 1253764Sroot register struct nlist *sp; 1263764Sroot INT stack; 1273764Sroot INT ntramp; 1283764Sroot 1293764Sroot IF cntflg==0 THEN cntval = -1; FI 1303764Sroot 1313764Sroot switch (modif) { 1323764Sroot 1333764Sroot case '<': 1343764Sroot IF cntval == 0 1353764Sroot THEN WHILE readchar() != EOR 1363764Sroot DO OD 1373764Sroot lp--; 1383764Sroot break; 1393764Sroot FI 1403764Sroot IF rdc() == '<' 1413764Sroot THEN stack = 1; 1423764Sroot ELSE stack = 0; lp--; 1433764Sroot FI 1443764Sroot /* fall through */ 1453764Sroot case '>': 1463764Sroot {CHAR file[64]; 1473764Sroot CHAR Ifile[128]; 1483764Sroot extern CHAR *Ipath; 1493764Sroot INT index; 1503764Sroot 1513764Sroot index=0; 1523764Sroot IF modif=='<' 1533764Sroot THEN iclose(stack, 0); 1543764Sroot ELSE oclose(); 1553764Sroot FI 1563764Sroot IF rdc()!=EOR 1573764Sroot THEN REP file[index++]=lastc; 1583764Sroot IF index>=63 THEN error(LONGFIL); FI 1593764Sroot PER readchar()!=EOR DONE 1603764Sroot file[index]=0; 1613764Sroot IF modif=='<' 1623764Sroot THEN IF Ipath THEN 1633764Sroot strcpy(Ifile, Ipath); 1643764Sroot strcat(Ifile, "/"); 1653764Sroot strcat(Ifile, file); 1663764Sroot FI 1673764Sroot infile=open(file,0); 1683764Sroot IF infile<0 && (infile=open(Ifile,0))<0 1693764Sroot THEN infile=0; error(NOTOPEN); 1703764Sroot ELSE IF cntflg 1713764Sroot THEN var[9] = cntval; 1723764Sroot ELSE var[9] = 1; 1733764Sroot FI 1743764Sroot FI 1753764Sroot ELSE outfile=open(file,1); 1763764Sroot IF outfile<0 1773764Sroot THEN outfile=creat(file,0644); 1783764Sroot #ifndef EDDT 1793764Sroot ELSE lseek(outfile,0L,2); 1803764Sroot #endif 1813764Sroot FI 1823764Sroot FI 1833764Sroot 1843764Sroot ELSE IF modif == '<' 1853764Sroot THEN iclose(-1, 0); 1863764Sroot FI 1873764Sroot FI 1883764Sroot lp--; 1893764Sroot } 1903764Sroot break; 1913764Sroot 192*3779Sroot case 'p': 193*3779Sroot IF kernel == 0 THEN 194*3779Sroot printf("not debugging kernel\n"); 195*3779Sroot ELSE 196*3779Sroot IF adrflg THEN 197*3779Sroot int pte = access(RD, dot, DSP, 0); 198*3779Sroot masterpcbb = (pte&PG_PFNUM)*512; 199*3779Sroot FI 200*3779Sroot getpcb(); 201*3779Sroot FI 202*3779Sroot break; 203*3779Sroot 2043764Sroot case 'd': 2053764Sroot if (adrflg) { 2063764Sroot if (adrval<2 || adrval>16) {printf("must have 2 <= radix <= 16"); break;} 2073764Sroot printf("radix=%d base ten",radix=adrval); 2083764Sroot } 2093764Sroot break; 2103764Sroot 2113764Sroot case 'q': case 'Q': case '%': 2123764Sroot done(); 2133764Sroot 2143764Sroot case 'w': case 'W': 2153764Sroot maxpos=(adrflg?adrval:MAXPOS); 2163764Sroot break; 2173764Sroot 2183764Sroot case 's': case 'S': 2193764Sroot maxoff=(adrflg?adrval:MAXOFF); 2203764Sroot break; 2213764Sroot 2223764Sroot case 'v': case 'V': 2233764Sroot prints("variables\n"); 2243764Sroot FOR i=0;i<=35;i++ 2253764Sroot DO IF var[i] 2263764Sroot THEN printc((i<=9 ? '0' : 'a'-10) + i); 2273764Sroot printf(" = %Q\n",var[i]); 2283764Sroot FI 2293764Sroot OD 2303764Sroot break; 2313764Sroot 2323764Sroot case 'm': case 'M': 2333764Sroot printmap("? map",&txtmap); 2343764Sroot printmap("/ map",&datmap); 2353764Sroot break; 2363764Sroot 2373764Sroot case 0: case '?': 2383764Sroot IF pid 2393764Sroot THEN printf("pcs id = %d\n",pid); 2403764Sroot ELSE prints("no process\n"); 2413764Sroot FI 2423764Sroot sigprint(); flushbuf(); 2433764Sroot 2443764Sroot case 'r': case 'R': 2453764Sroot printregs(); 2463764Sroot return; 2473764Sroot 2483764Sroot case 'c': case 'C': 2493764Sroot IF adrflg 2503764Sroot THEN frame=adrval; 2513764Sroot word=get(adrval+6,DSP)&0xFFFF; 2523764Sroot IF word&0x2000 2533764Sroot THEN /* 'calls', can figure out argp */ 2543764Sroot argp=adrval+20+((word>>14)&3); word &= 0xFFF; 2553764Sroot WHILE word DO IF word&1 THEN argp+=4; FI word>>=1; OD 2563764Sroot ELSE /* 'callg', can't tell where argp is */ argp=frame; 2573764Sroot FI 2583764Sroot callpc=get(frame+16,DSP); 259*3779Sroot ELIF kcore THEN 260*3779Sroot argp = pcb.pcb_ap; 261*3779Sroot frame = pcb.pcb_fp; 262*3779Sroot callpc = pcb.pcb_pc; 263*3779Sroot ELSE argp= *(ADDR *)(((ADDR)&u)+AP); 2643764Sroot frame= *(ADDR *)(((ADDR)&u)+FP); 2653764Sroot callpc= *(ADDR *)(((ADDR)&u)+PC); 2663764Sroot FI 2673764Sroot lastframe=0; 2683764Sroot ntramp = 0; 2693764Sroot WHILE cntval-- 2703764Sroot DO char *name; 2713764Sroot chkerr(); 2723764Sroot if (callpc > 0x80000000 - 0x200 * UPAGES) { 2733764Sroot name = "sigtramp"; 2743764Sroot ntramp++; 2753764Sroot } else { 2763764Sroot ntramp = 0; 2773764Sroot findsym(callpc,ISYM); 2783764Sroot if (cursym && 2793764Sroot !strcmp(cursym->n_un.n_name, "start")) 2803764Sroot break; 2813764Sroot if (cursym) 2823764Sroot name = cursym->n_un.n_name; 2833764Sroot else 2843764Sroot name = "?"; 2853764Sroot } 2863764Sroot printf("%s(", name); 2873764Sroot narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI 2883764Sroot LOOP IF narg==0 THEN break; FI 2893764Sroot printf("%R", get(argp += 4, DSP)); 2903764Sroot IF --narg!=0 THEN printc(','); FI 2913764Sroot POOL 2923764Sroot printf(") from %X\n",callpc); /* jkf mod */ 2933764Sroot 2943764Sroot IF modif=='C' 2953764Sroot THEN WHILE localsym(frame,argp) 2963764Sroot DO word=get(localval,DSP); 2973764Sroot printf("%8t%s:%10t", cursym->n_un.n_name); 2983764Sroot IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%R\n",word); FI 2993764Sroot OD 3003764Sroot FI 3013764Sroot 3023764Sroot if (ntramp == 1) 3033764Sroot callpc=get(frame+64, DSP); 3043764Sroot else 3053764Sroot callpc=get(frame+16, DSP); 3063764Sroot argp=get(frame+8, DSP); 3073764Sroot lastframe=frame; 3083764Sroot frame=get(frame+12, DSP)&EVEN; 3093764Sroot IF frame==0 ORF (!adrflg ANDF !INSTACK(frame)) 3103764Sroot THEN break; 3113764Sroot FI 3123764Sroot OD 3133764Sroot break; 3143764Sroot 3153764Sroot /*print externals*/ 3163764Sroot case 'e': case 'E': 3173764Sroot for (sp = symtab; sp < esymtab; sp++) { 3183764Sroot if (sp->n_type==(N_DATA|N_EXT) ORF sp->n_type==(N_BSS|N_EXT)) 3193764Sroot printf("%s:%12t%R\n", sp->n_un.n_name, get(sp->n_value,DSP)); 3203764Sroot } 3213764Sroot break; 3223764Sroot 3233764Sroot case 'a': case 'A': 3243764Sroot error("No algol 68 on VAX"); 3253764Sroot /*NOTREACHED*/ 3263764Sroot 3273764Sroot /*print breakpoints*/ 3283764Sroot case 'b': case 'B': 3293764Sroot printf("breakpoints\ncount%8tbkpt%24tcommand\n"); 3303764Sroot for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt) 3313764Sroot if (bkptr->flag) { 3323764Sroot printf("%-8.8d",bkptr->count); 3333764Sroot psymoff(leng(bkptr->loc),ISYM,"%24t"); 3343764Sroot comptr=bkptr->comm; 3353764Sroot WHILE *comptr DO printc(*comptr++); OD 3363764Sroot } 3373764Sroot break; 3383764Sroot 3393764Sroot default: error(BADMOD); 3403764Sroot } 3413764Sroot 3423764Sroot } 3433764Sroot 3443764Sroot printmap(s,amap) 3453764Sroot STRING s; MAP *amap; 3463764Sroot { 3473764Sroot int file; 3483764Sroot file=amap->ufd; 3493764Sroot printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil))); 3503764Sroot printf("b1 = %-16R",amap->b1); 3513764Sroot printf("e1 = %-16R",amap->e1); 3523764Sroot printf("f1 = %-16R",amap->f1); 3533764Sroot printf("\nb2 = %-16R",amap->b2); 3543764Sroot printf("e2 = %-16R",amap->e2); 3553764Sroot printf("f2 = %-16R",amap->f2); 3563764Sroot printc(EOR); 3573764Sroot } 3583764Sroot 3593764Sroot printregs() 3603764Sroot { 3613764Sroot REG REGPTR p; 3623764Sroot L_INT v; 3633764Sroot 3643764Sroot FOR p=reglist; p < ®list[24]; p++ 3653777Sroot DO v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs); 3663777Sroot printf("%s%6t%R %16t", p->rname, v); 3673764Sroot valpr(v,(p->roffs==PC?ISYM:DSYM)); 3683764Sroot printc(EOR); 3693764Sroot OD 3703764Sroot printpc(); 3713764Sroot } 3723764Sroot 3733777Sroot getreg(regnam) { 3743764Sroot REG REGPTR p; 3753764Sroot REG STRING regptr; 3763764Sroot CHAR *olp; 3773764Sroot CHAR regnxt; 3783764Sroot 3793764Sroot olp=lp; 3803764Sroot FOR p=reglist; p < ®list[24]; p++ 3813764Sroot DO regptr=p->rname; 3823764Sroot IF (regnam == *regptr++) 3833764Sroot THEN 3843764Sroot WHILE *regptr 3853764Sroot DO IF (regnxt=readchar()) != *regptr++ 3863764Sroot THEN --regptr; break; 3873764Sroot FI 3883764Sroot OD 3893764Sroot IF *regptr 3903764Sroot THEN lp=olp; 3913778Sroot ELSE 3923778Sroot int i = kcore ? (int)p->rkern : p->roffs; 3933778Sroot printf("returning %X\n", i); 3943778Sroot return (i); 3953764Sroot FI 3963764Sroot FI 3973764Sroot OD 3983764Sroot lp=olp; 3993764Sroot return(0); 4003764Sroot } 4013764Sroot 4023764Sroot printpc() 4033764Sroot { 4043764Sroot dot= *(ADDR *)(((ADDR)&u)+PC); 4053764Sroot psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP)); 4063764Sroot printc(EOR); 4073764Sroot } 4083764Sroot 4093764Sroot char *illinames[] = { 4103764Sroot "reserved addressing fault", 4113764Sroot "priviliged instruction fault", 4123764Sroot "reserved operand fault" 4133764Sroot }; 4143764Sroot char *fpenames[] = { 4153764Sroot 0, 4163764Sroot "integer overflow trap", 4173764Sroot "integer divide by zero trap", 4183764Sroot "floating overflow trap", 4193764Sroot "floating/decimal divide by zero trap", 4203764Sroot "floating underflow trap", 4213764Sroot "decimal overflow trap", 4223764Sroot "subscript out of range trap", 4233764Sroot "floating overflow fault", 4243764Sroot "floating divide by zero fault", 4253764Sroot "floating undeflow fault" 4263764Sroot }; 4273764Sroot 4283764Sroot sigprint() 4293764Sroot { 4303764Sroot IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0]) 4313764Sroot THEN prints(signals[signo]); FI 4323764Sroot switch (signo) { 4333764Sroot 4343764Sroot case SIGFPE: 4353764Sroot IF (sigcode > 0 && 4363764Sroot sigcode < sizeof fpenames / sizeof fpenames[0]) THEN 4373764Sroot prints(" ("); prints(fpenames[sigcode]); prints(")"); 4383764Sroot FI 4393764Sroot break; 4403764Sroot 4413764Sroot case SIGILL: 4423764Sroot IF (sigcode >= 0 && 4433764Sroot sigcode < sizeof illinames / sizeof illinames[0]) THEN 4443764Sroot prints(" ("); prints(illinames[sigcode]); prints(")"); 4453764Sroot FI 4463764Sroot break; 4473764Sroot } 4483764Sroot } 449