Annotation of cci/usr/src/bin/adb/print.c, revision 1.1

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

unix.superglobalmegacorp.com

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