new version from Chris Torek
[unix-history] / usr / src / old / adb / adb.vax / print.c
index 25f89c9..84bfb16 100644 (file)
@@ -1,4 +1,4 @@
-static char sccsid[] = "@(#)print.c 4.4 %G%";
+static char sccsid[] = "@(#)print.c 4.11 %G%";
 /*
  *
  *     UNIX debugger
 /*
  *
  *     UNIX debugger
@@ -141,7 +141,8 @@ printtrace(modif)
                THEN    stack = 1;
                ELSE    stack = 0; lp--;
                FI
                THEN    stack = 1;
                ELSE    stack = 0; lp--;
                FI
-                                                       /* fall through */
+               /* fall thru... */
+
            case '>':
                {CHAR           file[64];
                CHAR            Ifile[128];
            case '>':
                {CHAR           file[64];
                CHAR            Ifile[128];
@@ -149,10 +150,6 @@ printtrace(modif)
                INT             index;
 
                index=0;
                INT             index;
 
                index=0;
-               IF modif=='<'
-               THEN    iclose(stack, 0);
-               ELSE    oclose();
-               FI
                IF rdc()!=EOR
                THEN    REP file[index++]=lastc;
                            IF index>=63 THEN error(LONGFIL); FI
                IF rdc()!=EOR
                THEN    REP file[index++]=lastc;
                            IF index>=63 THEN error(LONGFIL); FI
@@ -164,15 +161,23 @@ printtrace(modif)
                                        strcat(Ifile, "/");
                                        strcat(Ifile, file);
                                FI
                                        strcat(Ifile, "/");
                                        strcat(Ifile, file);
                                FI
-                               infile=open(file,0);
-                               IF infile<0 && (infile=open(Ifile,0))<0
+                               IF strcmp(file, "-")!=0
+                               THEN    iclose(stack, 0);
+                                       infile=open(file,0);
+                                       IF infile<0
+                                       THEN    infile=open(Ifile,0);
+                                       FI
+                               ELSE    lseek(infile, 0L, 0);
+                               FI
+                               IF infile<0
                                THEN    infile=0; error(NOTOPEN);
                                ELSE    IF cntflg
                                        THEN    var[9] = cntval;
                                        ELSE    var[9] = 1;
                                        FI
                                FI
                                THEN    infile=0; error(NOTOPEN);
                                ELSE    IF cntflg
                                        THEN    var[9] = cntval;
                                        ELSE    var[9] = 1;
                                        FI
                                FI
-                       ELSE    outfile=open(file,1);
+                       ELSE    oclose();
+                               outfile=open(file,1);
                                IF outfile<0
                                THEN    outfile=creat(file,0644);
 #ifndef EDDT
                                IF outfile<0
                                THEN    outfile=creat(file,0644);
 #ifndef EDDT
@@ -183,6 +188,7 @@ printtrace(modif)
 
                ELSE    IF modif == '<'
                        THEN    iclose(-1, 0);
 
                ELSE    IF modif == '<'
                        THEN    iclose(-1, 0);
+                       ELSE    oclose();
                        FI
                FI
                lp--;
                        FI
                FI
                lp--;
@@ -190,11 +196,10 @@ printtrace(modif)
                break;
 
            case 'p':
                break;
 
            case 'p':
-               IF kernel == 0 THEN
-                       printf("not debugging kernel\n");
-               ELSE
-                       IF adrflg THEN
-                               int pte = access(RD, dot, DSP, 0);
+               IF kernel == 0
+               THEN    printf("not debugging kernel\n");
+               ELSE    IF adrflg
+                       THEN    int pte = access(RD, dot, DSP, 0);
                                masterpcbb = (pte&PG_PFNUM)*512;
                        FI
                        getpcb();
                                masterpcbb = (pte&PG_PFNUM)*512;
                        FI
                        getpcb();
@@ -202,10 +207,13 @@ printtrace(modif)
                break;
 
            case 'd':
                break;
 
            case 'd':
-               if (adrflg) {
-                       if (adrval<2 || adrval>16) {printf("must have 2 <= radix <= 16"); break;}
+               IF adrflg
+               THEN    IF adrval < 2 ORF adrval > 16
+                       THEN    printf("must have 2 <= radix <= 16");
+                               break;
+                       FI
                        printf("radix=%d base ten",radix=adrval);
                        printf("radix=%d base ten",radix=adrval);
-               }
+               FI
                break;
 
            case 'q': case 'Q': case '%':
                break;
 
            case 'q': case 'Q': case '%':
@@ -222,10 +230,10 @@ printtrace(modif)
            case 'v': case 'V':
                prints("variables\n");
                FOR i=0;i<=35;i++
            case 'v': case 'V':
                prints("variables\n");
                FOR i=0;i<=35;i++
-               DO IF var[i]
-                  THEN printc((i<=9 ? '0' : 'a'-10) + i);
-                       printf(" = %Q\n",var[i]);
-                  FI
+               DO      IF var[i]
+                       THEN printc((i<=9 ? '0' : 'a'-10) + i);
+                               printf(" = %x\n",var[i]);
+                       FI
                OD
                break;
 
                OD
                break;
 
@@ -247,17 +255,23 @@ printtrace(modif)
 
            case 'c': case 'C':
                IF adrflg
 
            case 'c': case 'C':
                IF adrflg
-               THEN frame=adrval;
+               THEN    frame=adrval;
                        word=get(adrval+6,DSP)&0xFFFF;
                        IF word&0x2000
                        word=get(adrval+6,DSP)&0xFFFF;
                        IF word&0x2000
-                       THEN /* 'calls', can figure out argp */
+                       THEN    /* 'calls', can figure out argp */
                                argp=adrval+20+((word>>14)&3); word &= 0xFFF;
                                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;
+                               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);
                        FI
                        callpc=get(frame+16,DSP);
-               ELIF kcore THEN
-                       argp = pcb.pcb_ap;
+               ELIF kcore
+               THEN    argp = pcb.pcb_ap;
                        frame = pcb.pcb_fp;
                        callpc = pcb.pcb_pc;
                ELSE    argp= *(ADDR *)(((ADDR)&u)+AP);
                        frame = pcb.pcb_fp;
                        callpc = pcb.pcb_pc;
                ELSE    argp= *(ADDR *)(((ADDR)&u)+AP);
@@ -269,55 +283,71 @@ printtrace(modif)
                WHILE cntval--
                DO      char *name;
                        chkerr();
                WHILE cntval--
                DO      char *name;
                        chkerr();
-                       if (callpc > 0x80000000 - 0x200 * UPAGES) {
-                               name = "sigtramp";
+                       /* if in extended pcb must be signal trampoline code */
+                       IF KERNOFF - ctob(UPAGES) < callpc ANDF
+                           (unsigned)callpc < KERNOFF
+                       THEN    name = "sigtramp";
                                ntramp++;
                                ntramp++;
-                       } else {
-                               ntramp = 0;
+                       ELSE    ntramp = 0;
                                findsym(callpc,ISYM);
                                findsym(callpc,ISYM);
-                               if (cursym &&
-                                   !strcmp(cursym->n_un.n_name, "start"))
-                                       break;
-                               if (cursym)
-                                       name = cursym->n_un.n_name;
-                               else
-                                       name = "?";
-                       }
+                               IF cursym ANDF
+                                   !strcmp(cursym->n_un.n_name, "start")
+                               THEN break;
+                               FI
+                               IF cursym
+                               THEN name = cursym->n_un.n_name;
+                               ELSE name = "?";
+                               FI
+                       FI
                        printf("%s(", name);
                        narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI
                        printf("%s(", name);
                        narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI
-                       LOOP IF narg==0 THEN break; FI
+                       LOOP    IF narg==0 THEN break; FI
                                printf("%R", get(argp += 4, DSP));
                                IF --narg!=0 THEN printc(','); FI
                        POOL
                                printf("%R", get(argp += 4, DSP));
                                IF --narg!=0 THEN printc(','); FI
                        POOL
-                       printf(") from %X\n",callpc);  /* jkf mod */
+                       IF ntramp == 1
+                       THEN callpc=get(frame+92, DSP);
+                       ELSE callpc=get(frame+16, DSP);
+                       FI
+                       IF callpc != 0
+                       THEN    prints(") from ");
+                               psymoff(callpc, ISYM, "\n");
+                       ELSE    prints(")\n");
+                       FI
 
                        IF modif=='C'
 
                        IF modif=='C'
-                       THEN WHILE localsym(frame,argp)
-                            DO word=get(localval,DSP);
-                               printf("%8t%s:%10t", cursym->n_un.n_name);
-                               IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%R\n",word); FI
-                            OD
+                       THEN    WHILE localsym(frame,argp)
+                               DO      word=get(localval,DSP);
+                                       printf("%8t%s:%10t",
+                                           cursym->n_un.n_name);
+                                       IF errflg
+                                       THEN prints("?\n"); errflg=0;
+                                       ELSE printf("%R\n",word);
+                                       FI
+                               OD
                        FI
 
                        FI
 
-                       if (ntramp == 1)
-                               callpc=get(frame+64, DSP);
-                       else
-                               callpc=get(frame+16, DSP);
                        argp=get(frame+8, DSP);
                        lastframe=frame;
                        frame=get(frame+12, DSP)&EVEN;
                        argp=get(frame+8, DSP);
                        lastframe=frame;
                        frame=get(frame+12, DSP)&EVEN;
-                       IF frame==0 ORF (!adrflg ANDF !INSTACK(frame))
-                       THEN break;
+                       IF frame==0 THEN break; FI
+                       IF !adrflg ANDF !INSTACK(frame)
+                       THEN    IF !kcore ORF !kstackaddr(frame)
+                               THEN break;
+                               FI
                        FI
                OD
                break;
 
            /*print externals*/
            case 'e': case 'E':
                        FI
                OD
                break;
 
            /*print externals*/
            case 'e': case 'E':
-               for (sp = symtab; sp < esymtab; sp++) {
-                  if (sp->n_type==(N_DATA|N_EXT) ORF sp->n_type==(N_BSS|N_EXT))
-                       printf("%s:%12t%R\n", sp->n_un.n_name, get(sp->n_value,DSP));
-               }
+               FOR sp = symtab; sp < esymtab; sp++
+               DO      IF sp->n_type == (N_DATA|N_EXT) ORF
+                          sp->n_type == (N_BSS|N_EXT)
+                       THEN printf("%s:%12t%R\n", sp->n_un.n_name,
+                                   get(sp->n_value,DSP));
+                       FI
+               OD
                break;
 
            case 'a': case 'A':
                break;
 
            case 'a': case 'A':
@@ -327,16 +357,18 @@ printtrace(modif)
            /*print breakpoints*/
            case 'b': case 'B':
                printf("breakpoints\ncount%8tbkpt%24tcommand\n");
            /*print breakpoints*/
            case 'b': case 'B':
                printf("breakpoints\ncount%8tbkpt%24tcommand\n");
-               for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
-                       if (bkptr->flag) {
-                               printf("%-8.8d",bkptr->count);
+               FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
+               DO      IF bkptr->flag
+                       THEN    printf("%-8.8d",bkptr->count);
                                psymoff(leng(bkptr->loc),ISYM,"%24t");
                                comptr=bkptr->comm;
                                WHILE *comptr DO printc(*comptr++); OD
                                psymoff(leng(bkptr->loc),ISYM,"%24t");
                                comptr=bkptr->comm;
                                WHILE *comptr DO printc(*comptr++); OD
-                       }
+                       FI
+               OD
                break;
 
                break;
 
-           default: error(BADMOD);
+           default:
+               error(BADMOD);
        }
 
 }
        }
 
 }
@@ -346,7 +378,8 @@ STRING      s; MAP *amap;
 {
        int file;
        file=amap->ufd;
 {
        int file;
        file=amap->ufd;
-       printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
+       printf("%s%12t`%s'\n", s,
+           (file<0 ? "-" : (file==fcor ? corfil : symfil)));
        printf("b1 = %-16R",amap->b1);
        printf("e1 = %-16R",amap->e1);
        printf("f1 = %-16R",amap->f1);
        printf("b1 = %-16R",amap->b1);
        printf("e1 = %-16R",amap->e1);
        printf("f1 = %-16R",amap->f1);
@@ -390,7 +423,6 @@ getreg(regnam) {
                        THEN lp=olp;
                        ELSE
                                int i = kcore ? (int)p->rkern : p->roffs;
                        THEN lp=olp;
                        ELSE
                                int i = kcore ? (int)p->rkern : p->roffs;
-                               printf("returning %X\n", i);
                                return (i);
                        FI
                FI
                                return (i);
                        FI
                FI