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

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;
1.1.1.2 ! root      352:        return(-1);
1.1       root      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.