1*19905Ssam static char sccsid[] = "@(#)print.c 4.10 05/02/85"; 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 14417596Ssam /* fall thru... */ 14517596Ssam 1463764Sroot case '>': 1473764Sroot {CHAR file[64]; 1483764Sroot CHAR Ifile[128]; 1493764Sroot extern CHAR *Ipath; 1503764Sroot INT index; 1513764Sroot 1523764Sroot index=0; 1533764Sroot IF rdc()!=EOR 1543764Sroot THEN REP file[index++]=lastc; 1553764Sroot IF index>=63 THEN error(LONGFIL); FI 1563764Sroot PER readchar()!=EOR DONE 1573764Sroot file[index]=0; 1583764Sroot IF modif=='<' 1593764Sroot THEN IF Ipath THEN 1603764Sroot strcpy(Ifile, Ipath); 1613764Sroot strcat(Ifile, "/"); 1623764Sroot strcat(Ifile, file); 1633764Sroot FI 1647496Skre IF strcmp(file, "-")!=0 1657496Skre THEN iclose(stack, 0); 1667496Skre infile=open(file,0); 1677496Skre IF infile<0 1687496Skre THEN infile=open(Ifile,0); 1697496Skre FI 1707496Skre ELSE lseek(infile, 0L, 0); 1717496Skre FI 1727496Skre IF infile<0 1733764Sroot THEN infile=0; error(NOTOPEN); 1743764Sroot ELSE IF cntflg 1753764Sroot THEN var[9] = cntval; 1763764Sroot ELSE var[9] = 1; 1773764Sroot FI 1783764Sroot FI 1797496Skre ELSE oclose(); 1807496Skre outfile=open(file,1); 1813764Sroot IF outfile<0 1823764Sroot THEN outfile=creat(file,0644); 1833764Sroot #ifndef EDDT 1843764Sroot ELSE lseek(outfile,0L,2); 1853764Sroot #endif 1863764Sroot FI 1873764Sroot FI 1883764Sroot 1893764Sroot ELSE IF modif == '<' 1903764Sroot THEN iclose(-1, 0); 1917496Skre ELSE oclose(); 1923764Sroot FI 1933764Sroot FI 1943764Sroot lp--; 1953764Sroot } 1963764Sroot break; 1973764Sroot 1983779Sroot case 'p': 19917596Ssam IF kernel == 0 20017596Ssam THEN printf("not debugging kernel\n"); 20117596Ssam ELSE IF adrflg 20217596Ssam THEN 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': 21017596Ssam IF adrflg 21117596Ssam THEN IF adrval < 2 ORF adrval > 16 21217596Ssam THEN printf("must have 2 <= radix <= 16"); 21317596Ssam break; 21417596Ssam FI 2153764Sroot printf("radix=%d base ten",radix=adrval); 21617596Ssam FI 2173764Sroot break; 2183764Sroot 2193764Sroot case 'q': case 'Q': case '%': 2203764Sroot done(); 2213764Sroot 2223764Sroot case 'w': case 'W': 2233764Sroot maxpos=(adrflg?adrval:MAXPOS); 2243764Sroot break; 2253764Sroot 2263764Sroot case 's': case 'S': 2273764Sroot maxoff=(adrflg?adrval:MAXOFF); 2283764Sroot break; 2293764Sroot 2303764Sroot case 'v': case 'V': 2313764Sroot prints("variables\n"); 2323764Sroot FOR i=0;i<=35;i++ 23317596Ssam DO IF var[i] 23417596Ssam THEN printc((i<=9 ? '0' : 'a'-10) + i); 23518811Smckusick printf(" = %x\n",var[i]); 23617596Ssam FI 2373764Sroot OD 2383764Sroot break; 2393764Sroot 2403764Sroot case 'm': case 'M': 2413764Sroot printmap("? map",&txtmap); 2423764Sroot printmap("/ map",&datmap); 2433764Sroot break; 2443764Sroot 2453764Sroot case 0: case '?': 2463764Sroot IF pid 2473764Sroot THEN printf("pcs id = %d\n",pid); 2483764Sroot ELSE prints("no process\n"); 2493764Sroot FI 2503764Sroot sigprint(); flushbuf(); 2513764Sroot 2523764Sroot case 'r': case 'R': 2533764Sroot printregs(); 2543764Sroot return; 2553764Sroot 2563764Sroot case 'c': case 'C': 2573764Sroot IF adrflg 25817596Ssam THEN frame=adrval; 2593764Sroot word=get(adrval+6,DSP)&0xFFFF; 2603764Sroot IF word&0x2000 26117596Ssam THEN /* 'calls', can figure out argp */ 2623764Sroot argp=adrval+20+((word>>14)&3); word &= 0xFFF; 26317596Ssam WHILE word 26417596Ssam DO IF word&1 26517596Ssam THEN argp+=4; 26617596Ssam FI 26717596Ssam word>>=1; 26817596Ssam OD 26917596Ssam ELSE /* 'callg', can't tell where argp is */ 27017596Ssam argp=frame; 2713764Sroot FI 2723764Sroot callpc=get(frame+16,DSP); 27317596Ssam ELIF kcore 27417596Ssam THEN argp = pcb.pcb_ap; 2753779Sroot frame = pcb.pcb_fp; 2763779Sroot callpc = pcb.pcb_pc; 2773779Sroot ELSE argp= *(ADDR *)(((ADDR)&u)+AP); 2783764Sroot frame= *(ADDR *)(((ADDR)&u)+FP); 2793764Sroot callpc= *(ADDR *)(((ADDR)&u)+PC); 2803764Sroot FI 2813764Sroot lastframe=0; 2823764Sroot ntramp = 0; 2833764Sroot WHILE cntval-- 2843764Sroot DO char *name; 2853764Sroot chkerr(); 286*19905Ssam /* if in extended pcb must be signal trampoline code */ 287*19905Ssam IF KERNOFF - ctob(UPAGES) < callpc ANDF 288*19905Ssam (unsigned)callpc < KERNOFF 28917596Ssam THEN name = "sigtramp"; 2903764Sroot ntramp++; 29117596Ssam ELSE ntramp = 0; 2923764Sroot findsym(callpc,ISYM); 29317596Ssam IF cursym ANDF 29417596Ssam !strcmp(cursym->n_un.n_name, "start") 29517596Ssam THEN break; 29617596Ssam FI 29717596Ssam IF cursym 29817596Ssam THEN name = cursym->n_un.n_name; 29917596Ssam ELSE name = "?"; 30017596Ssam FI 30117596Ssam FI 3023764Sroot printf("%s(", name); 3033764Sroot narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI 30417596Ssam LOOP IF narg==0 THEN break; FI 3053764Sroot printf("%R", get(argp += 4, DSP)); 3063764Sroot IF --narg!=0 THEN printc(','); FI 3073764Sroot POOL 308*19905Ssam IF ntramp == 1 309*19905Ssam THEN callpc=get(frame+84, DSP); 310*19905Ssam ELSE callpc=get(frame+16, DSP); 311*19905Ssam FI 312*19905Ssam IF callpc != 0 313*19905Ssam THEN prints(") from "); 314*19905Ssam psymoff(callpc, ISYM, "\n"); 315*19905Ssam ELSE prints(")\n"); 316*19905Ssam FI 3173764Sroot 3183764Sroot IF modif=='C' 31917596Ssam THEN WHILE localsym(frame,argp) 32017596Ssam DO word=get(localval,DSP); 32117596Ssam printf("%8t%s:%10t", 32217596Ssam cursym->n_un.n_name); 32317596Ssam IF errflg 32417596Ssam THEN prints("?\n"); errflg=0; 32517596Ssam ELSE printf("%R\n",word); 32617596Ssam FI 32717596Ssam OD 3283764Sroot FI 3293764Sroot 3303764Sroot argp=get(frame+8, DSP); 3313764Sroot lastframe=frame; 3323764Sroot frame=get(frame+12, DSP)&EVEN; 33317596Ssam IF frame==0 THEN break; FI 33417596Ssam IF !adrflg ANDF !INSTACK(frame) 33517596Ssam THEN IF !kcore ORF !kstackaddr(frame) 33617596Ssam THEN break; 33717596Ssam FI 3383764Sroot FI 3393764Sroot OD 3403764Sroot break; 3413764Sroot 3423764Sroot /*print externals*/ 3433764Sroot case 'e': case 'E': 34417596Ssam FOR sp = symtab; sp < esymtab; sp++ 34517596Ssam DO IF sp->n_type == (N_DATA|N_EXT) ORF 34617596Ssam sp->n_type == (N_BSS|N_EXT) 34717596Ssam THEN printf("%s:%12t%R\n", sp->n_un.n_name, 34817596Ssam get(sp->n_value,DSP)); 34917596Ssam FI 35017596Ssam OD 3513764Sroot break; 3523764Sroot 3533764Sroot case 'a': case 'A': 3543764Sroot error("No algol 68 on VAX"); 3553764Sroot /*NOTREACHED*/ 3563764Sroot 3573764Sroot /*print breakpoints*/ 3583764Sroot case 'b': case 'B': 3593764Sroot printf("breakpoints\ncount%8tbkpt%24tcommand\n"); 36017596Ssam FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt 36117596Ssam DO IF bkptr->flag 36217596Ssam THEN printf("%-8.8d",bkptr->count); 3633764Sroot psymoff(leng(bkptr->loc),ISYM,"%24t"); 3643764Sroot comptr=bkptr->comm; 3653764Sroot WHILE *comptr DO printc(*comptr++); OD 36617596Ssam FI 36717596Ssam OD 3683764Sroot break; 3693764Sroot 37017596Ssam default: 37117596Ssam error(BADMOD); 3723764Sroot } 3733764Sroot 3743764Sroot } 3753764Sroot 3763764Sroot printmap(s,amap) 3773764Sroot STRING s; MAP *amap; 3783764Sroot { 3793764Sroot int file; 3803764Sroot file=amap->ufd; 38117596Ssam printf("%s%12t`%s'\n", s, 38217596Ssam (file<0 ? "-" : (file==fcor ? corfil : symfil))); 3833764Sroot printf("b1 = %-16R",amap->b1); 3843764Sroot printf("e1 = %-16R",amap->e1); 3853764Sroot printf("f1 = %-16R",amap->f1); 3863764Sroot printf("\nb2 = %-16R",amap->b2); 3873764Sroot printf("e2 = %-16R",amap->e2); 3883764Sroot printf("f2 = %-16R",amap->f2); 3893764Sroot printc(EOR); 3903764Sroot } 3913764Sroot 3923764Sroot printregs() 3933764Sroot { 3943764Sroot REG REGPTR p; 3953764Sroot L_INT v; 3963764Sroot 3973764Sroot FOR p=reglist; p < ®list[24]; p++ 3983777Sroot DO v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs); 3993777Sroot printf("%s%6t%R %16t", p->rname, v); 4003764Sroot valpr(v,(p->roffs==PC?ISYM:DSYM)); 4013764Sroot printc(EOR); 4023764Sroot OD 4033764Sroot printpc(); 4043764Sroot } 4053764Sroot 4063777Sroot getreg(regnam) { 4073764Sroot REG REGPTR p; 4083764Sroot REG STRING regptr; 4093764Sroot CHAR *olp; 4103764Sroot CHAR regnxt; 4113764Sroot 4123764Sroot olp=lp; 4133764Sroot FOR p=reglist; p < ®list[24]; p++ 4143764Sroot DO regptr=p->rname; 4153764Sroot IF (regnam == *regptr++) 4163764Sroot THEN 4173764Sroot WHILE *regptr 4183764Sroot DO IF (regnxt=readchar()) != *regptr++ 4193764Sroot THEN --regptr; break; 4203764Sroot FI 4213764Sroot OD 4223764Sroot IF *regptr 4233764Sroot THEN lp=olp; 4243778Sroot ELSE 4253778Sroot int i = kcore ? (int)p->rkern : p->roffs; 4263778Sroot return (i); 4273764Sroot FI 4283764Sroot FI 4293764Sroot OD 4303764Sroot lp=olp; 4313764Sroot return(0); 4323764Sroot } 4333764Sroot 4343764Sroot printpc() 4353764Sroot { 4363764Sroot dot= *(ADDR *)(((ADDR)&u)+PC); 4373764Sroot psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP)); 4383764Sroot printc(EOR); 4393764Sroot } 4403764Sroot 4413764Sroot char *illinames[] = { 4423764Sroot "reserved addressing fault", 4433764Sroot "priviliged instruction fault", 4443764Sroot "reserved operand fault" 4453764Sroot }; 4463764Sroot char *fpenames[] = { 4473764Sroot 0, 4483764Sroot "integer overflow trap", 4493764Sroot "integer divide by zero trap", 4503764Sroot "floating overflow trap", 4513764Sroot "floating/decimal divide by zero trap", 4523764Sroot "floating underflow trap", 4533764Sroot "decimal overflow trap", 4543764Sroot "subscript out of range trap", 4553764Sroot "floating overflow fault", 4563764Sroot "floating divide by zero fault", 4573764Sroot "floating undeflow fault" 4583764Sroot }; 4593764Sroot 4603764Sroot sigprint() 4613764Sroot { 4623764Sroot IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0]) 4633764Sroot THEN prints(signals[signo]); FI 4643764Sroot switch (signo) { 4653764Sroot 4663764Sroot case SIGFPE: 4673764Sroot IF (sigcode > 0 && 4683764Sroot sigcode < sizeof fpenames / sizeof fpenames[0]) THEN 4693764Sroot prints(" ("); prints(fpenames[sigcode]); prints(")"); 4703764Sroot FI 4713764Sroot break; 4723764Sroot 4733764Sroot case SIGILL: 4743764Sroot IF (sigcode >= 0 && 4753764Sroot sigcode < sizeof illinames / sizeof illinames[0]) THEN 4763764Sroot prints(" ("); prints(illinames[sigcode]); prints(")"); 4773764Sroot FI 4783764Sroot break; 4793764Sroot } 4803764Sroot } 481