BSD 3 development
[unix-history] / usr / src / cmd / adb / print.c
index e82d4bf..22be525 100644 (file)
@@ -6,6 +6,9 @@
  */
 
 #include "defs.h"
  */
 
 #include "defs.h"
+SCCSID(@(#)print.c     2.9);
+#include "a.out.h"
+struct user u;
 
 
 MSG            LONGFIL;
 
 
 MSG            LONGFIL;
@@ -18,15 +21,15 @@ MAP         txtmap;
 MAP            datmap;
 
 SYMTAB         symbol;
 MAP            datmap;
 
 SYMTAB         symbol;
-INT            lastframe;
-INT            callpc;
+ADDR           lastframe;
+ADDR           callpc;
 
 INT            infile;
 INT            outfile;
 CHAR           *lp;
 
 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;
 
 /* symbol management */
 L_INT          localval;
@@ -34,23 +37,34 @@ L_INT               localval;
 /* breakpoints */
 BKPTR          bkpthead;
 
 /* 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;
 char           lastc;
-POS            corhdr[];
-POS            *endhdr;
 
 INT            fcor;
 STRING         errflg;
 
 INT            fcor;
 STRING         errflg;
@@ -67,7 +81,7 @@ INT           adrflg;
 L_INT          cntval;
 INT            cntflg;
 
 L_INT          cntval;
 INT            cntflg;
 
-STRING         signals[] {
+STRING         signals[] {
                "",
                "hangup",
                "interrupt",
                "",
                "hangup",
                "interrupt",
@@ -85,6 +99,7 @@ STRING                signals[] {
                "alarm call",
                "terminated",
 };
                "alarm call",
                "terminated",
 };
+#define MAXSIG 15
 
 
 
 
 
 
@@ -97,9 +112,9 @@ printtrace(modif)
        POS             dynam;
        REG BKPTR       bkptr;
        CHAR            hi, lo;
        POS             dynam;
        REG BKPTR       bkptr;
        CHAR            hi, lo;
-       INT             word;
+       ADDR            word;
        STRING          comptr;
        STRING          comptr;
-       L_INT           argp, frame, link;
+       ADDR            argp, frame, link;
        SYMPTR          symp;
 
        IF cntflg==0 THEN cntval = -1; FI
        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);
                        ELSE    outfile=open(file,1);
                                IF outfile<0
                                THEN    outfile=creat(file,0644);
+#ifndef EDDT
                                ELSE    lseek(outfile,0L,2);
                                ELSE    lseek(outfile,0L,2);
+#endif
                                FI
                        FI
 
                                FI
                        FI
 
@@ -138,11 +155,12 @@ printtrace(modif)
                }
                break;
 
                }
                break;
 
-           case 'o':
-               octal = TRUE; break;
-
            case 'd':
            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();
 
            case 'q': case 'Q': case '%':
                done();
@@ -181,54 +199,64 @@ printtrace(modif)
                printregs();
                return;
 
                printregs();
                return;
 
-           case 'f': case 'F':
-               printfregs(modif=='F');
-               return;
-
            case 'c': case 'C':
            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();
                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'
                        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);
                             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
 
                             OD
                        FI
 
+                       callpc=get(frame+16, DSP);
+                       argp=get(frame+8, DSP);
                        lastframe=frame;
                        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;
 
                OD
                break;
 
+#ifndef EDDT
            /*print externals*/
            case 'e': case 'E':
                symset();
            /*print externals*/
            case 'e': case 'E':
                symset();
-               WHILE (symp=symget())
+               WHILE symp=symget()
                DO chkerr();
                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':
                   FI
                OD
                break;
 
            case 'a': case 'A':
-               frame=(adrflg ? adrval : endhdr[r4]);
+               frame=(adrflg ? adrval : *(ADDR *)(((ADDR)&u)+FP));
 
                WHILE cntval--
                DO chkerr();
 
                WHILE cntval--
                DO chkerr();
@@ -265,6 +293,7 @@ printtrace(modif)
                errflg=0;
                flushbuf();
                break;
                errflg=0;
                flushbuf();
                break;
+#endif
 
            /*set default c frame*/
            /*print breakpoints*/
 
            /*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)));
        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);
 }
 
        printc(EOR);
 }
 
-printfregs(longpr)
-{
-       REG i;
-       L_REAL f;
-
-       printf("fpsr    %o\n", corhdr[0].fpsr);
-       FOR i=0; i<FRMAX; i++
-       DO      IF corhdr[0].fpsr&FD ORF longpr /* long mode */
-               THEN    f = corhdr[0].Lfr[frnames[i]];
-               ELSE    f = corhdr[0].Sfr[frnames[i]];
-               FI
-               printf("fr%-8d%-32.18f\n", i, f);
-       OD
-}
-
 printregs()
 {
        REG REGPTR      p;
 printregs()
 {
        REG REGPTR      p;
-       INT             v;
+       L_INT           v;
 
 
-       FOR p=reglist; p < &reglist[9]; p++
-       DO      printf("%s%8t%o%8t", p->rname, v=endhdr[p->roffs]);
-               valpr(v,(p->roffs==pc?ISYM:DSYM));
+       FOR p=reglist; p < &reglist[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();
                printc(EOR);
        OD
        printpc();
@@ -332,27 +346,38 @@ getreg(regnam)
 {
        REG REGPTR      p;
        REG STRING      regptr;
 {
        REG REGPTR      p;
        REG STRING      regptr;
+       CHAR    *olp;
        CHAR            regnxt;
        CHAR            regnxt;
-       regnxt=readchar();
-       FOR p=reglist; p<&reglist[9]; p++
+
+       olp=lp;
+       FOR p=reglist; p < &reglist[24]; p++
        DO      regptr=p->rname;
        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
                FI
        OD
-       lp--;
+       lp=olp;
        return(0);
 }
 
 printpc()
 {
        return(0);
 }
 
 printpc()
 {
-       dot=endhdr[pc];
+       dot= *(ADDR *)(((ADDR)&u)+PC);
        psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP));
        printc(EOR);
 }
 
 sigprint()
 {
        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
 }
 
 }