X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/a68924a6e07d69bc4b8d6106b3af0ac5a7490905..33a19f3978bee5f8a4825c922f6b857802a44829:/usr/src/cmd/adb/print.c diff --git a/usr/src/cmd/adb/print.c b/usr/src/cmd/adb/print.c index e82d4bff37..22be5259dc 100644 --- a/usr/src/cmd/adb/print.c +++ b/usr/src/cmd/adb/print.c @@ -6,6 +6,9 @@ */ #include "defs.h" +SCCSID(@(#)print.c 2.9); +#include "a.out.h" +struct user u; MSG LONGFIL; @@ -18,15 +21,15 @@ MAP txtmap; MAP datmap; SYMTAB symbol; -INT lastframe; -INT callpc; +ADDR lastframe; +ADDR callpc; INT infile; INT outfile; CHAR *lp; -INT maxoff; -INT maxpos; -INT octal; +L_INT maxoff; +L_INT maxpos; +INT radix; /* symbol management */ L_INT localval; @@ -34,23 +37,34 @@ L_INT localval; /* breakpoints */ BKPTR bkpthead; -REGLIST reglist [] { - "ps", ps, - "pc", pc, - "sp", sp, - "r5", r5, - "r4", r4, - "r3", r3, - "r2", r2, - "r1", r1, - "r0", r0, +REGLIST reglist [] = { + "p1lr", P1LR, + "p1br",P1BR, + "p0lr", P0LR, + "p0br",P0BR, + "ksp",KSP, + "esp",ESP, + "ssp",SSP, + "psl", PSL, + "pc", PC, + "usp",USP, + "fp", FP, + "ap", AP, + "r11", R11, + "r10", R10, + "r9", R9, + "r8", R8, + "r7", R7, + "r6", R6, + "r5", R5, + "r4", R4, + "r3", R3, + "r2", R2, + "r1", R1, + "r0", R0, }; -INT frnames[] { 0, 3, 4, 5, 1, 2 }; - char lastc; -POS corhdr[]; -POS *endhdr; INT fcor; STRING errflg; @@ -67,7 +81,7 @@ INT adrflg; L_INT cntval; INT cntflg; -STRING signals[] { +STRING signals[] = { "", "hangup", "interrupt", @@ -85,6 +99,7 @@ STRING signals[] { "alarm call", "terminated", }; +#define MAXSIG 15 @@ -97,9 +112,9 @@ printtrace(modif) POS dynam; REG BKPTR bkptr; CHAR hi, lo; - INT word; + ADDR word; STRING comptr; - L_INT argp, frame, link; + ADDR argp, frame, link; SYMPTR symp; IF cntflg==0 THEN cntval = -1; FI @@ -129,7 +144,9 @@ printtrace(modif) ELSE outfile=open(file,1); IF outfile<0 THEN outfile=creat(file,0644); +#ifndef EDDT ELSE lseek(outfile,0L,2); +#endif FI FI @@ -138,11 +155,12 @@ printtrace(modif) } break; - case 'o': - octal = TRUE; break; - case 'd': - octal = FALSE; break; + if (adrflg) { + if (adrval<2 || adrval>16) {printf("must have 2 <= radix <= 16"); break;} + printf("radix=%d base ten",radix=adrval); + } + break; case 'q': case 'Q': case '%': done(); @@ -181,54 +199,64 @@ printtrace(modif) printregs(); return; - case 'f': case 'F': - printfregs(modif=='F'); - return; - case 'c': case 'C': - frame=(adrflg?adrval:endhdr[r5])&EVEN; lastframe=0; - callpc=(adrflg?get(frame+2,DSP):endhdr[pc]); + IF adrflg + THEN frame=adrval; + word=get(adrval+6,DSP)&0xFFFF; + IF word&0x2000 + THEN /* 'calls', can figure out argp */ + argp=adrval+20+((word>>14)&3); word &= 0xFFF; + WHILE word DO IF word&1 THEN argp+=4; FI word>>=1; OD + ELSE /* 'callg', can't tell where argp is */ argp=frame; + FI + callpc=get(frame+16,DSP); + ELSE argp= *(ADDR *)(((ADDR)&u)+AP); + frame= *(ADDR *)(((ADDR)&u)+FP); + callpc= *(ADDR *)(((ADDR)&u)+PC); + FI + lastframe=0; WHILE cntval-- DO chkerr(); - narg = findroutine(frame); - printf("%.8s(", symbol.symc); - argp = frame+4; - IF --narg >= 0 - THEN printf("%o", get(argp, DSP)); - FI - WHILE --narg >= 0 - DO argp += 2; - printf(",%o", get(argp, DSP)); - OD + printf("%.8s(", findsym(callpc,ISYM)==-1 ? "?":symbol.symc); + narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI + LOOP IF narg==0 THEN break; FI + printf("%R", get(argp += 4, DSP)); + IF --narg!=0 THEN printc(','); FI + POOL prints(")\n"); IF modif=='C' - THEN WHILE localsym(frame) + THEN WHILE localsym(frame,argp) DO word=get(localval,DSP); printf("%8t%.8s:%10t", symbol.symc); - IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%o\n",word); FI + IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%R\n",word); FI OD FI + callpc=get(frame+16, DSP); + argp=get(frame+8, DSP); lastframe=frame; - frame=get(frame, DSP)&EVEN; - IF frame==0 THEN break; FI + frame=get(frame+12, DSP)&EVEN; + IF frame==0 ORF (!adrflg ANDF (frame&0xF0000000)!=0x70000000) + THEN break; + FI OD break; +#ifndef EDDT /*print externals*/ case 'e': case 'E': symset(); - WHILE (symp=symget()) + WHILE symp=symget() DO chkerr(); - IF (symp->symf)==043 ORF (symp->symf)==044 - THEN printf("%.8s:%12t%o\n", symp->symc, get(leng(symp->symv),DSP)); + IF symp->symf==(N_DATA|N_EXT) ORF symp->symf==(N_BSS|N_EXT) + THEN printf("%.8s:%12t%R\n", symp->symc, get(symp->symv,DSP)); FI OD break; case 'a': case 'A': - frame=(adrflg ? adrval : endhdr[r4]); + frame=(adrflg ? adrval : *(ADDR *)(((ADDR)&u)+FP)); WHILE cntval-- DO chkerr(); @@ -265,6 +293,7 @@ printtrace(modif) errflg=0; flushbuf(); break; +#endif /*set default c frame*/ /*print breakpoints*/ @@ -291,38 +320,23 @@ STRING s; MAP *amap; int file; file=amap->ufd; printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil))); - printf("b1 = %-16Q",amap->b1); - printf("e1 = %-16Q",amap->e1); - printf("f1 = %-16Q",amap->f1); - printf("\nb2 = %-16Q",amap->b2); - printf("e2 = %-16Q",amap->e2); - printf("f2 = %-16Q",amap->f2); + printf("b1 = %-16R",amap->b1); + printf("e1 = %-16R",amap->e1); + printf("f1 = %-16R",amap->f1); + printf("\nb2 = %-16R",amap->b2); + printf("e2 = %-16R",amap->e2); + printf("f2 = %-16R",amap->f2); printc(EOR); } -printfregs(longpr) -{ - REG i; - L_REAL f; - - printf("fpsr %o\n", corhdr[0].fpsr); - FOR i=0; irname, v=endhdr[p->roffs]); - valpr(v,(p->roffs==pc?ISYM:DSYM)); + FOR p=reglist; p < ®list[24]; p++ + DO printf("%s%6t%R %16t", p->rname, v= *(ADDR *)(((ADDR)&u)+p->roffs)); + valpr(v,(p->roffs==PC?ISYM:DSYM)); printc(EOR); OD printpc(); @@ -332,27 +346,38 @@ getreg(regnam) { REG REGPTR p; REG STRING regptr; + CHAR *olp; CHAR regnxt; - regnxt=readchar(); - FOR p=reglist; p<®list[9]; p++ + + olp=lp; + FOR p=reglist; p < ®list[24]; p++ DO regptr=p->rname; - IF (regnam == *regptr++) ANDF (regnxt == *regptr) - THEN return(p->roffs); + IF (regnam == *regptr++) + THEN + WHILE *regptr + DO IF (regnxt=readchar()) != *regptr++ + THEN --regptr; break; + FI + OD + IF *regptr + THEN lp=olp; + ELSE return(p->roffs); + FI FI OD - lp--; + lp=olp; return(0); } printpc() { - dot=endhdr[pc]; + dot= *(ADDR *)(((ADDR)&u)+PC); psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP)); printc(EOR); } sigprint() { - prints(signals[signo]); + IF (signo>=0) ANDF (signo<=MAXSIG) THEN prints(signals[signo]); FI }