1*18811Smckusick static char sccsid[] = "@(#)print.c 4.9 04/26/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); 235*18811Smckusick 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(); 28617596Ssam IF callpc > 0x80000000 - 0x200 * UPAGES 28717596Ssam THEN name = "sigtramp"; 2883764Sroot ntramp++; 28917596Ssam ELSE ntramp = 0; 2903764Sroot findsym(callpc,ISYM); 29117596Ssam IF cursym ANDF 29217596Ssam !strcmp(cursym->n_un.n_name, "start") 29317596Ssam THEN break; 29417596Ssam FI 29517596Ssam IF cursym 29617596Ssam THEN name = cursym->n_un.n_name; 29717596Ssam ELSE name = "?"; 29817596Ssam FI 29917596Ssam FI 3003764Sroot printf("%s(", name); 3013764Sroot narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI 30217596Ssam LOOP IF narg==0 THEN break; FI 3033764Sroot printf("%R", get(argp += 4, DSP)); 3043764Sroot IF --narg!=0 THEN printc(','); FI 3053764Sroot POOL 306*18811Smckusick printf(") from %x\n",callpc); 3073764Sroot 3083764Sroot IF modif=='C' 30917596Ssam THEN WHILE localsym(frame,argp) 31017596Ssam DO word=get(localval,DSP); 31117596Ssam printf("%8t%s:%10t", 31217596Ssam cursym->n_un.n_name); 31317596Ssam IF errflg 31417596Ssam THEN prints("?\n"); errflg=0; 31517596Ssam ELSE printf("%R\n",word); 31617596Ssam FI 31717596Ssam OD 3183764Sroot FI 3193764Sroot 32017596Ssam IF ntramp == 1 32117596Ssam THEN callpc=get(frame+84, DSP); 32217596Ssam ELSE callpc=get(frame+16, DSP); 32317596Ssam FI 3243764Sroot argp=get(frame+8, DSP); 3253764Sroot lastframe=frame; 3263764Sroot frame=get(frame+12, DSP)&EVEN; 32717596Ssam IF frame==0 THEN break; FI 32817596Ssam IF !adrflg ANDF !INSTACK(frame) 32917596Ssam THEN IF !kcore ORF !kstackaddr(frame) 33017596Ssam THEN break; 33117596Ssam FI 3323764Sroot FI 3333764Sroot OD 3343764Sroot break; 3353764Sroot 3363764Sroot /*print externals*/ 3373764Sroot case 'e': case 'E': 33817596Ssam FOR sp = symtab; sp < esymtab; sp++ 33917596Ssam DO IF sp->n_type == (N_DATA|N_EXT) ORF 34017596Ssam sp->n_type == (N_BSS|N_EXT) 34117596Ssam THEN printf("%s:%12t%R\n", sp->n_un.n_name, 34217596Ssam get(sp->n_value,DSP)); 34317596Ssam FI 34417596Ssam OD 3453764Sroot break; 3463764Sroot 3473764Sroot case 'a': case 'A': 3483764Sroot error("No algol 68 on VAX"); 3493764Sroot /*NOTREACHED*/ 3503764Sroot 3513764Sroot /*print breakpoints*/ 3523764Sroot case 'b': case 'B': 3533764Sroot printf("breakpoints\ncount%8tbkpt%24tcommand\n"); 35417596Ssam FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt 35517596Ssam DO IF bkptr->flag 35617596Ssam THEN printf("%-8.8d",bkptr->count); 3573764Sroot psymoff(leng(bkptr->loc),ISYM,"%24t"); 3583764Sroot comptr=bkptr->comm; 3593764Sroot WHILE *comptr DO printc(*comptr++); OD 36017596Ssam FI 36117596Ssam OD 3623764Sroot break; 3633764Sroot 36417596Ssam default: 36517596Ssam error(BADMOD); 3663764Sroot } 3673764Sroot 3683764Sroot } 3693764Sroot 3703764Sroot printmap(s,amap) 3713764Sroot STRING s; MAP *amap; 3723764Sroot { 3733764Sroot int file; 3743764Sroot file=amap->ufd; 37517596Ssam printf("%s%12t`%s'\n", s, 37617596Ssam (file<0 ? "-" : (file==fcor ? corfil : symfil))); 3773764Sroot printf("b1 = %-16R",amap->b1); 3783764Sroot printf("e1 = %-16R",amap->e1); 3793764Sroot printf("f1 = %-16R",amap->f1); 3803764Sroot printf("\nb2 = %-16R",amap->b2); 3813764Sroot printf("e2 = %-16R",amap->e2); 3823764Sroot printf("f2 = %-16R",amap->f2); 3833764Sroot printc(EOR); 3843764Sroot } 3853764Sroot 3863764Sroot printregs() 3873764Sroot { 3883764Sroot REG REGPTR p; 3893764Sroot L_INT v; 3903764Sroot 3913764Sroot FOR p=reglist; p < ®list[24]; p++ 3923777Sroot DO v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs); 3933777Sroot printf("%s%6t%R %16t", p->rname, v); 3943764Sroot valpr(v,(p->roffs==PC?ISYM:DSYM)); 3953764Sroot printc(EOR); 3963764Sroot OD 3973764Sroot printpc(); 3983764Sroot } 3993764Sroot 4003777Sroot getreg(regnam) { 4013764Sroot REG REGPTR p; 4023764Sroot REG STRING regptr; 4033764Sroot CHAR *olp; 4043764Sroot CHAR regnxt; 4053764Sroot 4063764Sroot olp=lp; 4073764Sroot FOR p=reglist; p < ®list[24]; p++ 4083764Sroot DO regptr=p->rname; 4093764Sroot IF (regnam == *regptr++) 4103764Sroot THEN 4113764Sroot WHILE *regptr 4123764Sroot DO IF (regnxt=readchar()) != *regptr++ 4133764Sroot THEN --regptr; break; 4143764Sroot FI 4153764Sroot OD 4163764Sroot IF *regptr 4173764Sroot THEN lp=olp; 4183778Sroot ELSE 4193778Sroot int i = kcore ? (int)p->rkern : p->roffs; 4203778Sroot return (i); 4213764Sroot FI 4223764Sroot FI 4233764Sroot OD 4243764Sroot lp=olp; 4253764Sroot return(0); 4263764Sroot } 4273764Sroot 4283764Sroot printpc() 4293764Sroot { 4303764Sroot dot= *(ADDR *)(((ADDR)&u)+PC); 4313764Sroot psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP)); 4323764Sroot printc(EOR); 4333764Sroot } 4343764Sroot 4353764Sroot char *illinames[] = { 4363764Sroot "reserved addressing fault", 4373764Sroot "priviliged instruction fault", 4383764Sroot "reserved operand fault" 4393764Sroot }; 4403764Sroot char *fpenames[] = { 4413764Sroot 0, 4423764Sroot "integer overflow trap", 4433764Sroot "integer divide by zero trap", 4443764Sroot "floating overflow trap", 4453764Sroot "floating/decimal divide by zero trap", 4463764Sroot "floating underflow trap", 4473764Sroot "decimal overflow trap", 4483764Sroot "subscript out of range trap", 4493764Sroot "floating overflow fault", 4503764Sroot "floating divide by zero fault", 4513764Sroot "floating undeflow fault" 4523764Sroot }; 4533764Sroot 4543764Sroot sigprint() 4553764Sroot { 4563764Sroot IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0]) 4573764Sroot THEN prints(signals[signo]); FI 4583764Sroot switch (signo) { 4593764Sroot 4603764Sroot case SIGFPE: 4613764Sroot IF (sigcode > 0 && 4623764Sroot sigcode < sizeof fpenames / sizeof fpenames[0]) THEN 4633764Sroot prints(" ("); prints(fpenames[sigcode]); prints(")"); 4643764Sroot FI 4653764Sroot break; 4663764Sroot 4673764Sroot case SIGILL: 4683764Sroot IF (sigcode >= 0 && 4693764Sroot sigcode < sizeof illinames / sizeof illinames[0]) THEN 4703764Sroot prints(" ("); prints(illinames[sigcode]); prints(")"); 4713764Sroot FI 4723764Sroot break; 4733764Sroot } 4743764Sroot } 475