Annotation of 3BSD/cmd/adb/print.c, revision 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.