1*3778Sroot static char sccsid[] = "@(#)print.c 4.3 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 1923764Sroot case 'd': 1933764Sroot if (adrflg) { 1943764Sroot if (adrval<2 || adrval>16) {printf("must have 2 <= radix <= 16"); break;} 1953764Sroot printf("radix=%d base ten",radix=adrval); 1963764Sroot } 1973764Sroot break; 1983764Sroot 1993764Sroot case 'q': case 'Q': case '%': 2003764Sroot done(); 2013764Sroot 2023764Sroot case 'w': case 'W': 2033764Sroot maxpos=(adrflg?adrval:MAXPOS); 2043764Sroot break; 2053764Sroot 2063764Sroot case 's': case 'S': 2073764Sroot maxoff=(adrflg?adrval:MAXOFF); 2083764Sroot break; 2093764Sroot 2103764Sroot case 'v': case 'V': 2113764Sroot prints("variables\n"); 2123764Sroot FOR i=0;i<=35;i++ 2133764Sroot DO IF var[i] 2143764Sroot THEN printc((i<=9 ? '0' : 'a'-10) + i); 2153764Sroot printf(" = %Q\n",var[i]); 2163764Sroot FI 2173764Sroot OD 2183764Sroot break; 2193764Sroot 2203764Sroot case 'm': case 'M': 2213764Sroot printmap("? map",&txtmap); 2223764Sroot printmap("/ map",&datmap); 2233764Sroot break; 2243764Sroot 2253764Sroot case 0: case '?': 2263764Sroot IF pid 2273764Sroot THEN printf("pcs id = %d\n",pid); 2283764Sroot ELSE prints("no process\n"); 2293764Sroot FI 2303764Sroot sigprint(); flushbuf(); 2313764Sroot 2323764Sroot case 'r': case 'R': 2333764Sroot printregs(); 2343764Sroot return; 2353764Sroot 2363764Sroot case 'c': case 'C': 2373764Sroot IF adrflg 2383764Sroot THEN frame=adrval; 2393764Sroot word=get(adrval+6,DSP)&0xFFFF; 2403764Sroot IF word&0x2000 2413764Sroot THEN /* 'calls', can figure out argp */ 2423764Sroot argp=adrval+20+((word>>14)&3); word &= 0xFFF; 2433764Sroot WHILE word DO IF word&1 THEN argp+=4; FI word>>=1; OD 2443764Sroot ELSE /* 'callg', can't tell where argp is */ argp=frame; 2453764Sroot FI 2463764Sroot callpc=get(frame+16,DSP); 2473764Sroot ELSE argp= *(ADDR *)(((ADDR)&u)+AP); 2483764Sroot frame= *(ADDR *)(((ADDR)&u)+FP); 2493764Sroot callpc= *(ADDR *)(((ADDR)&u)+PC); 2503764Sroot FI 2513764Sroot lastframe=0; 2523764Sroot ntramp = 0; 2533764Sroot WHILE cntval-- 2543764Sroot DO char *name; 2553764Sroot chkerr(); 2563764Sroot if (callpc > 0x80000000 - 0x200 * UPAGES) { 2573764Sroot name = "sigtramp"; 2583764Sroot ntramp++; 2593764Sroot } else { 2603764Sroot ntramp = 0; 2613764Sroot findsym(callpc,ISYM); 2623764Sroot if (cursym && 2633764Sroot !strcmp(cursym->n_un.n_name, "start")) 2643764Sroot break; 2653764Sroot if (cursym) 2663764Sroot name = cursym->n_un.n_name; 2673764Sroot else 2683764Sroot name = "?"; 2693764Sroot } 2703764Sroot printf("%s(", name); 2713764Sroot narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI 2723764Sroot LOOP IF narg==0 THEN break; FI 2733764Sroot printf("%R", get(argp += 4, DSP)); 2743764Sroot IF --narg!=0 THEN printc(','); FI 2753764Sroot POOL 2763764Sroot printf(") from %X\n",callpc); /* jkf mod */ 2773764Sroot 2783764Sroot IF modif=='C' 2793764Sroot THEN WHILE localsym(frame,argp) 2803764Sroot DO word=get(localval,DSP); 2813764Sroot printf("%8t%s:%10t", cursym->n_un.n_name); 2823764Sroot IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%R\n",word); FI 2833764Sroot OD 2843764Sroot FI 2853764Sroot 2863764Sroot if (ntramp == 1) 2873764Sroot callpc=get(frame+64, DSP); 2883764Sroot else 2893764Sroot callpc=get(frame+16, DSP); 2903764Sroot argp=get(frame+8, DSP); 2913764Sroot lastframe=frame; 2923764Sroot frame=get(frame+12, DSP)&EVEN; 2933764Sroot IF frame==0 ORF (!adrflg ANDF !INSTACK(frame)) 2943764Sroot THEN break; 2953764Sroot FI 2963764Sroot OD 2973764Sroot break; 2983764Sroot 2993764Sroot /*print externals*/ 3003764Sroot case 'e': case 'E': 3013764Sroot for (sp = symtab; sp < esymtab; sp++) { 3023764Sroot if (sp->n_type==(N_DATA|N_EXT) ORF sp->n_type==(N_BSS|N_EXT)) 3033764Sroot printf("%s:%12t%R\n", sp->n_un.n_name, get(sp->n_value,DSP)); 3043764Sroot } 3053764Sroot break; 3063764Sroot 3073764Sroot case 'a': case 'A': 3083764Sroot error("No algol 68 on VAX"); 3093764Sroot /*NOTREACHED*/ 3103764Sroot 3113764Sroot /*print breakpoints*/ 3123764Sroot case 'b': case 'B': 3133764Sroot printf("breakpoints\ncount%8tbkpt%24tcommand\n"); 3143764Sroot for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt) 3153764Sroot if (bkptr->flag) { 3163764Sroot printf("%-8.8d",bkptr->count); 3173764Sroot psymoff(leng(bkptr->loc),ISYM,"%24t"); 3183764Sroot comptr=bkptr->comm; 3193764Sroot WHILE *comptr DO printc(*comptr++); OD 3203764Sroot } 3213764Sroot break; 3223764Sroot 3233764Sroot default: error(BADMOD); 3243764Sroot } 3253764Sroot 3263764Sroot } 3273764Sroot 3283764Sroot printmap(s,amap) 3293764Sroot STRING s; MAP *amap; 3303764Sroot { 3313764Sroot int file; 3323764Sroot file=amap->ufd; 3333764Sroot printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil))); 3343764Sroot printf("b1 = %-16R",amap->b1); 3353764Sroot printf("e1 = %-16R",amap->e1); 3363764Sroot printf("f1 = %-16R",amap->f1); 3373764Sroot printf("\nb2 = %-16R",amap->b2); 3383764Sroot printf("e2 = %-16R",amap->e2); 3393764Sroot printf("f2 = %-16R",amap->f2); 3403764Sroot printc(EOR); 3413764Sroot } 3423764Sroot 3433764Sroot printregs() 3443764Sroot { 3453764Sroot REG REGPTR p; 3463764Sroot L_INT v; 3473764Sroot 3483764Sroot FOR p=reglist; p < ®list[24]; p++ 3493777Sroot DO v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs); 3503777Sroot printf("%s%6t%R %16t", p->rname, v); 3513764Sroot valpr(v,(p->roffs==PC?ISYM:DSYM)); 3523764Sroot printc(EOR); 3533764Sroot OD 3543764Sroot printpc(); 3553764Sroot } 3563764Sroot 3573777Sroot getreg(regnam) { 3583764Sroot REG REGPTR p; 3593764Sroot REG STRING regptr; 3603764Sroot CHAR *olp; 3613764Sroot CHAR regnxt; 3623764Sroot 3633764Sroot olp=lp; 3643764Sroot FOR p=reglist; p < ®list[24]; p++ 3653764Sroot DO regptr=p->rname; 3663764Sroot IF (regnam == *regptr++) 3673764Sroot THEN 3683764Sroot WHILE *regptr 3693764Sroot DO IF (regnxt=readchar()) != *regptr++ 3703764Sroot THEN --regptr; break; 3713764Sroot FI 3723764Sroot OD 3733764Sroot IF *regptr 3743764Sroot THEN lp=olp; 375*3778Sroot ELSE 376*3778Sroot int i = kcore ? (int)p->rkern : p->roffs; 377*3778Sroot printf("returning %X\n", i); 378*3778Sroot return (i); 3793764Sroot FI 3803764Sroot FI 3813764Sroot OD 3823764Sroot lp=olp; 3833764Sroot return(0); 3843764Sroot } 3853764Sroot 3863764Sroot printpc() 3873764Sroot { 3883764Sroot dot= *(ADDR *)(((ADDR)&u)+PC); 3893764Sroot psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP)); 3903764Sroot printc(EOR); 3913764Sroot } 3923764Sroot 3933764Sroot char *illinames[] = { 3943764Sroot "reserved addressing fault", 3953764Sroot "priviliged instruction fault", 3963764Sroot "reserved operand fault" 3973764Sroot }; 3983764Sroot char *fpenames[] = { 3993764Sroot 0, 4003764Sroot "integer overflow trap", 4013764Sroot "integer divide by zero trap", 4023764Sroot "floating overflow trap", 4033764Sroot "floating/decimal divide by zero trap", 4043764Sroot "floating underflow trap", 4053764Sroot "decimal overflow trap", 4063764Sroot "subscript out of range trap", 4073764Sroot "floating overflow fault", 4083764Sroot "floating divide by zero fault", 4093764Sroot "floating undeflow fault" 4103764Sroot }; 4113764Sroot 4123764Sroot sigprint() 4133764Sroot { 4143764Sroot IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0]) 4153764Sroot THEN prints(signals[signo]); FI 4163764Sroot switch (signo) { 4173764Sroot 4183764Sroot case SIGFPE: 4193764Sroot IF (sigcode > 0 && 4203764Sroot sigcode < sizeof fpenames / sizeof fpenames[0]) THEN 4213764Sroot prints(" ("); prints(fpenames[sigcode]); prints(")"); 4223764Sroot FI 4233764Sroot break; 4243764Sroot 4253764Sroot case SIGILL: 4263764Sroot IF (sigcode >= 0 && 4273764Sroot sigcode < sizeof illinames / sizeof illinames[0]) THEN 4283764Sroot prints(" ("); prints(illinames[sigcode]); prints(")"); 4293764Sroot FI 4303764Sroot break; 4313764Sroot } 4323764Sroot } 433