1*7496Skre static char sccsid[] = "@(#)print.c 4.5 07/23/82"; 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 rdc()!=EOR 1533764Sroot THEN REP file[index++]=lastc; 1543764Sroot IF index>=63 THEN error(LONGFIL); FI 1553764Sroot PER readchar()!=EOR DONE 1563764Sroot file[index]=0; 1573764Sroot IF modif=='<' 1583764Sroot THEN IF Ipath THEN 1593764Sroot strcpy(Ifile, Ipath); 1603764Sroot strcat(Ifile, "/"); 1613764Sroot strcat(Ifile, file); 1623764Sroot FI 163*7496Skre IF strcmp(file, "-")!=0 164*7496Skre THEN iclose(stack, 0); 165*7496Skre infile=open(file,0); 166*7496Skre IF infile<0 167*7496Skre THEN infile=open(Ifile,0); 168*7496Skre FI 169*7496Skre ELSE lseek(infile, 0L, 0); 170*7496Skre FI 171*7496Skre IF infile<0 1723764Sroot THEN infile=0; error(NOTOPEN); 1733764Sroot ELSE IF cntflg 1743764Sroot THEN var[9] = cntval; 1753764Sroot ELSE var[9] = 1; 1763764Sroot FI 1773764Sroot FI 178*7496Skre ELSE oclose(); 179*7496Skre outfile=open(file,1); 1803764Sroot IF outfile<0 1813764Sroot THEN outfile=creat(file,0644); 1823764Sroot #ifndef EDDT 1833764Sroot ELSE lseek(outfile,0L,2); 1843764Sroot #endif 1853764Sroot FI 1863764Sroot FI 1873764Sroot 1883764Sroot ELSE IF modif == '<' 1893764Sroot THEN iclose(-1, 0); 190*7496Skre ELSE oclose(); 1913764Sroot FI 1923764Sroot FI 1933764Sroot lp--; 1943764Sroot } 1953764Sroot break; 1963764Sroot 1973779Sroot case 'p': 1983779Sroot IF kernel == 0 THEN 1993779Sroot printf("not debugging kernel\n"); 2003779Sroot ELSE 2013779Sroot IF adrflg THEN 2023779Sroot int pte = access(RD, dot, DSP, 0); 2033779Sroot masterpcbb = (pte&PG_PFNUM)*512; 2043779Sroot FI 2053779Sroot getpcb(); 2063779Sroot FI 2073779Sroot break; 2083779Sroot 2093764Sroot case 'd': 2103764Sroot if (adrflg) { 2113764Sroot if (adrval<2 || adrval>16) {printf("must have 2 <= radix <= 16"); break;} 2123764Sroot printf("radix=%d base ten",radix=adrval); 2133764Sroot } 2143764Sroot break; 2153764Sroot 2163764Sroot case 'q': case 'Q': case '%': 2173764Sroot done(); 2183764Sroot 2193764Sroot case 'w': case 'W': 2203764Sroot maxpos=(adrflg?adrval:MAXPOS); 2213764Sroot break; 2223764Sroot 2233764Sroot case 's': case 'S': 2243764Sroot maxoff=(adrflg?adrval:MAXOFF); 2253764Sroot break; 2263764Sroot 2273764Sroot case 'v': case 'V': 2283764Sroot prints("variables\n"); 2293764Sroot FOR i=0;i<=35;i++ 2303764Sroot DO IF var[i] 2313764Sroot THEN printc((i<=9 ? '0' : 'a'-10) + i); 232*7496Skre printf(" = %X\n",var[i]); 2333764Sroot FI 2343764Sroot OD 2353764Sroot break; 2363764Sroot 2373764Sroot case 'm': case 'M': 2383764Sroot printmap("? map",&txtmap); 2393764Sroot printmap("/ map",&datmap); 2403764Sroot break; 2413764Sroot 2423764Sroot case 0: case '?': 2433764Sroot IF pid 2443764Sroot THEN printf("pcs id = %d\n",pid); 2453764Sroot ELSE prints("no process\n"); 2463764Sroot FI 2473764Sroot sigprint(); flushbuf(); 2483764Sroot 2493764Sroot case 'r': case 'R': 2503764Sroot printregs(); 2513764Sroot return; 2523764Sroot 2533764Sroot case 'c': case 'C': 2543764Sroot IF adrflg 2553764Sroot THEN frame=adrval; 2563764Sroot word=get(adrval+6,DSP)&0xFFFF; 2573764Sroot IF word&0x2000 2583764Sroot THEN /* 'calls', can figure out argp */ 2593764Sroot argp=adrval+20+((word>>14)&3); word &= 0xFFF; 2603764Sroot WHILE word DO IF word&1 THEN argp+=4; FI word>>=1; OD 2613764Sroot ELSE /* 'callg', can't tell where argp is */ argp=frame; 2623764Sroot FI 2633764Sroot callpc=get(frame+16,DSP); 2643779Sroot ELIF kcore THEN 2653779Sroot argp = pcb.pcb_ap; 2663779Sroot frame = pcb.pcb_fp; 2673779Sroot callpc = pcb.pcb_pc; 2683779Sroot ELSE argp= *(ADDR *)(((ADDR)&u)+AP); 2693764Sroot frame= *(ADDR *)(((ADDR)&u)+FP); 2703764Sroot callpc= *(ADDR *)(((ADDR)&u)+PC); 2713764Sroot FI 2723764Sroot lastframe=0; 2733764Sroot ntramp = 0; 2743764Sroot WHILE cntval-- 2753764Sroot DO char *name; 2763764Sroot chkerr(); 2773764Sroot if (callpc > 0x80000000 - 0x200 * UPAGES) { 2783764Sroot name = "sigtramp"; 2793764Sroot ntramp++; 2803764Sroot } else { 2813764Sroot ntramp = 0; 2823764Sroot findsym(callpc,ISYM); 2833764Sroot if (cursym && 284*7496Skre !strcmp(cursym->n_un.n_name, "start")) 2853764Sroot break; 2863764Sroot if (cursym) 2873764Sroot name = cursym->n_un.n_name; 2883764Sroot else 2893764Sroot name = "?"; 2903764Sroot } 2913764Sroot printf("%s(", name); 2923764Sroot narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI 2933764Sroot LOOP IF narg==0 THEN break; FI 2943764Sroot printf("%R", get(argp += 4, DSP)); 2953764Sroot IF --narg!=0 THEN printc(','); FI 2963764Sroot POOL 2973764Sroot printf(") from %X\n",callpc); /* jkf mod */ 2983764Sroot 2993764Sroot IF modif=='C' 3003764Sroot THEN WHILE localsym(frame,argp) 3013764Sroot DO word=get(localval,DSP); 3023764Sroot printf("%8t%s:%10t", cursym->n_un.n_name); 3033764Sroot IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%R\n",word); FI 3043764Sroot OD 3053764Sroot FI 3063764Sroot 3073764Sroot if (ntramp == 1) 3083764Sroot callpc=get(frame+64, DSP); 3093764Sroot else 3103764Sroot callpc=get(frame+16, DSP); 3113764Sroot argp=get(frame+8, DSP); 3123764Sroot lastframe=frame; 3133764Sroot frame=get(frame+12, DSP)&EVEN; 3143764Sroot IF frame==0 ORF (!adrflg ANDF !INSTACK(frame)) 3153764Sroot THEN break; 3163764Sroot FI 3173764Sroot OD 3183764Sroot break; 3193764Sroot 3203764Sroot /*print externals*/ 3213764Sroot case 'e': case 'E': 3223764Sroot for (sp = symtab; sp < esymtab; sp++) { 3233764Sroot if (sp->n_type==(N_DATA|N_EXT) ORF sp->n_type==(N_BSS|N_EXT)) 3243764Sroot printf("%s:%12t%R\n", sp->n_un.n_name, get(sp->n_value,DSP)); 3253764Sroot } 3263764Sroot break; 3273764Sroot 3283764Sroot case 'a': case 'A': 3293764Sroot error("No algol 68 on VAX"); 3303764Sroot /*NOTREACHED*/ 3313764Sroot 3323764Sroot /*print breakpoints*/ 3333764Sroot case 'b': case 'B': 3343764Sroot printf("breakpoints\ncount%8tbkpt%24tcommand\n"); 3353764Sroot for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt) 3363764Sroot if (bkptr->flag) { 3373764Sroot printf("%-8.8d",bkptr->count); 3383764Sroot psymoff(leng(bkptr->loc),ISYM,"%24t"); 3393764Sroot comptr=bkptr->comm; 3403764Sroot WHILE *comptr DO printc(*comptr++); OD 3413764Sroot } 3423764Sroot break; 3433764Sroot 3443764Sroot default: error(BADMOD); 3453764Sroot } 3463764Sroot 3473764Sroot } 3483764Sroot 3493764Sroot printmap(s,amap) 3503764Sroot STRING s; MAP *amap; 3513764Sroot { 3523764Sroot int file; 3533764Sroot file=amap->ufd; 3543764Sroot printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil))); 3553764Sroot printf("b1 = %-16R",amap->b1); 3563764Sroot printf("e1 = %-16R",amap->e1); 3573764Sroot printf("f1 = %-16R",amap->f1); 3583764Sroot printf("\nb2 = %-16R",amap->b2); 3593764Sroot printf("e2 = %-16R",amap->e2); 3603764Sroot printf("f2 = %-16R",amap->f2); 3613764Sroot printc(EOR); 3623764Sroot } 3633764Sroot 3643764Sroot printregs() 3653764Sroot { 3663764Sroot REG REGPTR p; 3673764Sroot L_INT v; 3683764Sroot 3693764Sroot FOR p=reglist; p < ®list[24]; p++ 3703777Sroot DO v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs); 3713777Sroot printf("%s%6t%R %16t", p->rname, v); 3723764Sroot valpr(v,(p->roffs==PC?ISYM:DSYM)); 3733764Sroot printc(EOR); 3743764Sroot OD 3753764Sroot printpc(); 3763764Sroot } 3773764Sroot 3783777Sroot getreg(regnam) { 3793764Sroot REG REGPTR p; 3803764Sroot REG STRING regptr; 3813764Sroot CHAR *olp; 3823764Sroot CHAR regnxt; 3833764Sroot 3843764Sroot olp=lp; 3853764Sroot FOR p=reglist; p < ®list[24]; p++ 3863764Sroot DO regptr=p->rname; 3873764Sroot IF (regnam == *regptr++) 3883764Sroot THEN 3893764Sroot WHILE *regptr 3903764Sroot DO IF (regnxt=readchar()) != *regptr++ 3913764Sroot THEN --regptr; break; 3923764Sroot FI 3933764Sroot OD 3943764Sroot IF *regptr 3953764Sroot THEN lp=olp; 3963778Sroot ELSE 3973778Sroot int i = kcore ? (int)p->rkern : p->roffs; 3983778Sroot return (i); 3993764Sroot FI 4003764Sroot FI 4013764Sroot OD 4023764Sroot lp=olp; 4033764Sroot return(0); 4043764Sroot } 4053764Sroot 4063764Sroot printpc() 4073764Sroot { 4083764Sroot dot= *(ADDR *)(((ADDR)&u)+PC); 4093764Sroot psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP)); 4103764Sroot printc(EOR); 4113764Sroot } 4123764Sroot 4133764Sroot char *illinames[] = { 4143764Sroot "reserved addressing fault", 4153764Sroot "priviliged instruction fault", 4163764Sroot "reserved operand fault" 4173764Sroot }; 4183764Sroot char *fpenames[] = { 4193764Sroot 0, 4203764Sroot "integer overflow trap", 4213764Sroot "integer divide by zero trap", 4223764Sroot "floating overflow trap", 4233764Sroot "floating/decimal divide by zero trap", 4243764Sroot "floating underflow trap", 4253764Sroot "decimal overflow trap", 4263764Sroot "subscript out of range trap", 4273764Sroot "floating overflow fault", 4283764Sroot "floating divide by zero fault", 4293764Sroot "floating undeflow fault" 4303764Sroot }; 4313764Sroot 4323764Sroot sigprint() 4333764Sroot { 4343764Sroot IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0]) 4353764Sroot THEN prints(signals[signo]); FI 4363764Sroot switch (signo) { 4373764Sroot 4383764Sroot case SIGFPE: 4393764Sroot IF (sigcode > 0 && 4403764Sroot sigcode < sizeof fpenames / sizeof fpenames[0]) THEN 4413764Sroot prints(" ("); prints(fpenames[sigcode]); prints(")"); 4423764Sroot FI 4433764Sroot break; 4443764Sroot 4453764Sroot case SIGILL: 4463764Sroot IF (sigcode >= 0 && 4473764Sroot sigcode < sizeof illinames / sizeof illinames[0]) THEN 4483764Sroot prints(" ("); prints(illinames[sigcode]); prints(")"); 4493764Sroot FI 4503764Sroot break; 4513764Sroot } 4523764Sroot } 453