Annotation of 3BSD/cmd/adb/print.c, revision 1.1.1.1

1.1       root        1: #
                      2: /*
                      3:  *
                      4:  *     UNIX debugger
                      5:  *
                      6:  */
                      7: 
                      8: #include "defs.h"
                      9: SCCSID(@(#)print.c     2.9);
                     10: #include "a.out.h"
                     11: struct user u;
                     12: 
                     13: 
                     14: MSG            LONGFIL;
                     15: MSG            NOTOPEN;
                     16: MSG            A68BAD;
                     17: MSG            A68LNK;
                     18: MSG            BADMOD;
                     19: 
                     20: MAP            txtmap;
                     21: MAP            datmap;
                     22: 
                     23: SYMTAB         symbol;
                     24: ADDR           lastframe;
                     25: ADDR           callpc;
                     26: 
                     27: INT            infile;
                     28: INT            outfile;
                     29: CHAR           *lp;
                     30: L_INT          maxoff;
                     31: L_INT          maxpos;
                     32: INT            radix;
                     33: 
                     34: /* symbol management */
                     35: L_INT          localval;
                     36: 
                     37: /* breakpoints */
                     38: BKPTR          bkpthead;
                     39: 
                     40: REGLIST reglist [] = {
                     41:                "p1lr", P1LR,
                     42:                "p1br",P1BR,
                     43:                "p0lr", P0LR,
                     44:                "p0br",P0BR,
                     45:                "ksp",KSP,
                     46:                "esp",ESP,
                     47:                "ssp",SSP,
                     48:                "psl", PSL,
                     49:                "pc", PC,
                     50:                "usp",USP,
                     51:                "fp", FP,
                     52:                "ap", AP,
                     53:                "r11", R11,
                     54:                "r10", R10,
                     55:                "r9", R9,
                     56:                "r8", R8,
                     57:                "r7", R7,
                     58:                "r6", R6,
                     59:                "r5", R5,
                     60:                "r4", R4,
                     61:                "r3", R3,
                     62:                "r2", R2,
                     63:                "r1", R1,
                     64:                "r0", R0,
                     65: };
                     66: 
                     67: char           lastc;
                     68: 
                     69: INT            fcor;
                     70: STRING         errflg;
                     71: INT            signo;
                     72: 
                     73: 
                     74: L_INT          dot;
                     75: L_INT          var[];
                     76: STRING         symfil;
                     77: STRING         corfil;
                     78: INT            pid;
                     79: L_INT          adrval;
                     80: INT            adrflg;
                     81: L_INT          cntval;
                     82: INT            cntflg;
                     83: 
                     84: STRING         signals[] = {
                     85:                "",
                     86:                "hangup",
                     87:                "interrupt",
                     88:                "quit",
                     89:                "illegal instruction",
                     90:                "trace/BPT",
                     91:                "IOT",
                     92:                "EMT",
                     93:                "floating exception",
                     94:                "killed",
                     95:                "bus error",
                     96:                "memory fault",
                     97:                "bad system call",
                     98:                "broken pipe",
                     99:                "alarm call",
                    100:                "terminated",
                    101: };
                    102: #define MAXSIG 15
                    103: 
                    104: 
                    105: 
                    106: 
                    107: /* general printing routines ($) */
                    108: 
                    109: printtrace(modif)
                    110: {
                    111:        INT             narg, i, stat, name, limit;
                    112:        POS             dynam;
                    113:        REG BKPTR       bkptr;
                    114:        CHAR            hi, lo;
                    115:        ADDR            word;
                    116:        STRING          comptr;
                    117:        ADDR            argp, frame, link;
                    118:        SYMPTR          symp;
                    119: 
                    120:        IF cntflg==0 THEN cntval = -1; FI
                    121: 
                    122:        switch (modif) {
                    123: 
                    124:            case '<':
                    125:            case '>':
                    126:                {CHAR           file[64];
                    127:                INT             index;
                    128: 
                    129:                index=0;
                    130:                IF modif=='<'
                    131:                THEN    iclose();
                    132:                ELSE    oclose();
                    133:                FI
                    134:                IF rdc()!=EOR
                    135:                THEN    REP file[index++]=lastc;
                    136:                            IF index>=63 THEN error(LONGFIL); FI
                    137:                        PER readchar()!=EOR DONE
                    138:                        file[index]=0;
                    139:                        IF modif=='<'
                    140:                        THEN    infile=open(file,0);
                    141:                                IF infile<0
                    142:                                THEN    infile=0; error(NOTOPEN);
                    143:                                FI
                    144:                        ELSE    outfile=open(file,1);
                    145:                                IF outfile<0
                    146:                                THEN    outfile=creat(file,0644);
                    147: #ifndef EDDT
                    148:                                ELSE    lseek(outfile,0L,2);
                    149: #endif
                    150:                                FI
                    151:                        FI
                    152: 
                    153:                FI
                    154:                lp--;
                    155:                }
                    156:                break;
                    157: 
                    158:            case 'd':
                    159:                if (adrflg) {
                    160:                        if (adrval<2 || adrval>16) {printf("must have 2 <= radix <= 16"); break;}
                    161:                        printf("radix=%d base ten",radix=adrval);
                    162:                }
                    163:                break;
                    164: 
                    165:            case 'q': case 'Q': case '%':
                    166:                done();
                    167: 
                    168:            case 'w': case 'W':
                    169:                maxpos=(adrflg?adrval:MAXPOS);
                    170:                break;
                    171: 
                    172:            case 's': case 'S':
                    173:                maxoff=(adrflg?adrval:MAXOFF);
                    174:                break;
                    175: 
                    176:            case 'v': case 'V':
                    177:                prints("variables\n");
                    178:                FOR i=0;i<=35;i++
                    179:                DO IF var[i]
                    180:                   THEN printc((i<=9 ? '0' : 'a'-10) + i);
                    181:                        printf(" = %Q\n",var[i]);
                    182:                   FI
                    183:                OD
                    184:                break;
                    185: 
                    186:            case 'm': case 'M':
                    187:                printmap("? map",&txtmap);
                    188:                printmap("/ map",&datmap);
                    189:                break;
                    190: 
                    191:            case 0: case '?':
                    192:                IF pid
                    193:                THEN printf("pcs id = %d\n",pid);
                    194:                ELSE prints("no process\n");
                    195:                FI
                    196:                sigprint(); flushbuf();
                    197: 
                    198:            case 'r': case 'R':
                    199:                printregs();
                    200:                return;
                    201: 
                    202:            case 'c': case 'C':
                    203:                IF adrflg
                    204:                THEN frame=adrval;
                    205:                        word=get(adrval+6,DSP)&0xFFFF;
                    206:                        IF word&0x2000
                    207:                        THEN /* 'calls', can figure out argp */
                    208:                                argp=adrval+20+((word>>14)&3); word &= 0xFFF;
                    209:                                WHILE word DO IF word&1 THEN argp+=4; FI word>>=1; OD
                    210:                        ELSE /* 'callg', can't tell where argp is */ argp=frame;
                    211:                        FI
                    212:                        callpc=get(frame+16,DSP);
                    213:                ELSE argp= *(ADDR *)(((ADDR)&u)+AP);
                    214:                        frame= *(ADDR *)(((ADDR)&u)+FP);
                    215:                        callpc= *(ADDR *)(((ADDR)&u)+PC);
                    216:                FI
                    217:                lastframe=0;
                    218:                WHILE cntval--
                    219:                DO      chkerr();
                    220:                        printf("%.8s(", findsym(callpc,ISYM)==-1 ? "?":symbol.symc);
                    221:                        narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI
                    222:                        LOOP IF narg==0 THEN break; FI
                    223:                                printf("%R", get(argp += 4, DSP));
                    224:                                IF --narg!=0 THEN printc(','); FI
                    225:                        POOL
                    226:                        prints(")\n");
                    227: 
                    228:                        IF modif=='C'
                    229:                        THEN WHILE localsym(frame,argp)
                    230:                             DO word=get(localval,DSP);
                    231:                                printf("%8t%.8s:%10t", symbol.symc);
                    232:                                IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%R\n",word); FI
                    233:                             OD
                    234:                        FI
                    235: 
                    236:                        callpc=get(frame+16, DSP);
                    237:                        argp=get(frame+8, DSP);
                    238:                        lastframe=frame;
                    239:                        frame=get(frame+12, DSP)&EVEN;
                    240:                        IF frame==0 ORF (!adrflg ANDF (frame&0xF0000000)!=0x70000000)
                    241:                        THEN break;
                    242:                        FI
                    243:                OD
                    244:                break;
                    245: 
                    246: #ifndef EDDT
                    247:            /*print externals*/
                    248:            case 'e': case 'E':
                    249:                symset();
                    250:                WHILE symp=symget()
                    251:                DO chkerr();
                    252:                   IF symp->symf==(N_DATA|N_EXT) ORF symp->symf==(N_BSS|N_EXT)
                    253:                   THEN printf("%.8s:%12t%R\n", symp->symc, get(symp->symv,DSP));
                    254:                   FI
                    255:                OD
                    256:                break;
                    257: 
                    258:            case 'a': case 'A':
                    259:                frame=(adrflg ? adrval : *(ADDR *)(((ADDR)&u)+FP));
                    260: 
                    261:                WHILE cntval--
                    262:                DO chkerr();
                    263:                   stat=get(frame,DSP); dynam=get(frame+2,DSP); link=get(frame+4,DSP);
                    264:                   IF modif=='A'
                    265:                   THEN printf("%8O:%8t%-8o,%-8o,%-8o",frame,stat,dynam,link);
                    266:                   FI
                    267:                   IF stat==1 THEN break; FI
                    268:                   IF errflg THEN error(A68BAD); FI
                    269: 
                    270:                   IF get(link-4,ISP)!=04767
                    271:                   THEN IF get(link-2,ISP)!=04775
                    272:                        THEN error(A68LNK);
                    273:                        ELSE /*compute entry point of routine*/
                    274:                             prints(" ? ");
                    275:                        FI
                    276:                   ELSE printf("%8t");
                    277:                        valpr(name=shorten(link)+get(link-2,ISP),ISYM);
                    278:                        name=get(leng(name-2),ISP);
                    279:                        printf("%8t\""); limit=8;
                    280:                        REP word=get(leng(name),DSP); name += 2;
                    281:                            lo=word&LOBYTE; hi=(word>>8)&LOBYTE;
                    282:                            printc(lo); printc(hi);
                    283:                        PER lo ANDF hi ANDF limit-- DONE
                    284:                        printc('"');
                    285:                   FI
                    286:                   limit=4; i=6; printf("%24targs:%8t");
                    287:                   WHILE limit--
                    288:                   DO printf("%8t%o",get(frame+i,DSP)); i += 2; OD
                    289:                   printc(EOR);
                    290: 
                    291:                   frame=dynam;
                    292:                OD
                    293:                errflg=0;
                    294:                flushbuf();
                    295:                break;
                    296: #endif
                    297: 
                    298:            /*set default c frame*/
                    299:            /*print breakpoints*/
                    300:            case 'b': case 'B':
                    301:                printf("breakpoints\ncount%8tbkpt%24tcommand\n");
                    302:                FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
                    303:                DO IF bkptr->flag
                    304:                   THEN printf("%-8.8d",bkptr->count);
                    305:                        psymoff(leng(bkptr->loc),ISYM,"%24t");
                    306:                        comptr=bkptr->comm;
                    307:                        WHILE *comptr DO printc(*comptr++); OD
                    308:                   FI
                    309:                OD
                    310:                break;
                    311: 
                    312:            default: error(BADMOD);
                    313:        }
                    314: 
                    315: }
                    316: 
                    317: printmap(s,amap)
                    318: STRING s; MAP *amap;
                    319: {
                    320:        int file;
                    321:        file=amap->ufd;
                    322:        printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
                    323:        printf("b1 = %-16R",amap->b1);
                    324:        printf("e1 = %-16R",amap->e1);
                    325:        printf("f1 = %-16R",amap->f1);
                    326:        printf("\nb2 = %-16R",amap->b2);
                    327:        printf("e2 = %-16R",amap->e2);
                    328:        printf("f2 = %-16R",amap->f2);
                    329:        printc(EOR);
                    330: }
                    331: 
                    332: printregs()
                    333: {
                    334:        REG REGPTR      p;
                    335:        L_INT           v;
                    336: 
                    337:        FOR p=reglist; p < &reglist[24]; p++
                    338:        DO      printf("%s%6t%R %16t", p->rname, v= *(ADDR *)(((ADDR)&u)+p->roffs));
                    339:                valpr(v,(p->roffs==PC?ISYM:DSYM));
                    340:                printc(EOR);
                    341:        OD
                    342:        printpc();
                    343: }
                    344: 
                    345: getreg(regnam)
                    346: {
                    347:        REG REGPTR      p;
                    348:        REG STRING      regptr;
                    349:        CHAR    *olp;
                    350:        CHAR            regnxt;
                    351: 
                    352:        olp=lp;
                    353:        FOR p=reglist; p < &reglist[24]; p++
                    354:        DO      regptr=p->rname;
                    355:                IF (regnam == *regptr++)
                    356:                THEN
                    357:                        WHILE *regptr
                    358:                        DO IF (regnxt=readchar()) != *regptr++
                    359:                                THEN --regptr; break;
                    360:                                FI
                    361:                        OD
                    362:                        IF *regptr
                    363:                        THEN lp=olp;
                    364:                        ELSE return(p->roffs);
                    365:                        FI
                    366:                FI
                    367:        OD
                    368:        lp=olp;
                    369:        return(0);
                    370: }
                    371: 
                    372: printpc()
                    373: {
                    374:        dot= *(ADDR *)(((ADDR)&u)+PC);
                    375:        psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP));
                    376:        printc(EOR);
                    377: }
                    378: 
                    379: sigprint()
                    380: {
                    381:        IF (signo>=0) ANDF (signo<=MAXSIG) THEN prints(signals[signo]); FI
                    382: }
                    383: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.