Annotation of 43BSD/bin/adb/print.c, revision 1.1

1.1     ! root        1: static char sccsid[] = "@(#)print.c 4.11 5/2/85";
        !             2: /*
        !             3:  *
        !             4:  *     UNIX debugger
        !             5:  *
        !             6:  */
        !             7: #include "defs.h"
        !             8: 
        !             9: MSG            LONGFIL;
        !            10: MSG            NOTOPEN;
        !            11: MSG            A68BAD;
        !            12: MSG            A68LNK;
        !            13: MSG            BADMOD;
        !            14: 
        !            15: MAP            txtmap;
        !            16: MAP            datmap;
        !            17: 
        !            18: ADDR           lastframe;
        !            19: ADDR           callpc;
        !            20: 
        !            21: INT            infile;
        !            22: INT            outfile;
        !            23: CHAR           *lp;
        !            24: L_INT          maxoff;
        !            25: L_INT          maxpos;
        !            26: INT            radix;
        !            27: 
        !            28: /* symbol management */
        !            29: L_INT          localval;
        !            30: 
        !            31: /* breakpoints */
        !            32: BKPTR          bkpthead;
        !            33: 
        !            34: REGLIST reglist [] = {
        !            35:        "p1lr", P1LR,   &pcb.pcb_p1lr,
        !            36:        "p1br", P1BR,   &pcb.pcb_p1br,
        !            37:        "p0lr", P0LR,   &pcb.pcb_p0lr,
        !            38:        "p0br", P0BR,   &pcb.pcb_p0br,
        !            39:        "ksp",  KSP,    &pcb.pcb_ksp,
        !            40:        "esp",  ESP,    &pcb.pcb_esp,
        !            41:        "ssp",  SSP,    &pcb.pcb_ssp,
        !            42:        "psl",  PSL,    &pcb.pcb_psl,
        !            43:        "pc",   PC,     &pcb.pcb_pc,
        !            44:        "usp",  USP,    &pcb.pcb_usp,
        !            45:        "fp",   FP,     &pcb.pcb_fp,
        !            46:        "ap",   AP,     &pcb.pcb_ap,
        !            47:        "r11",  R11,    &pcb.pcb_r11,
        !            48:        "r10",  R10,    &pcb.pcb_r10,
        !            49:        "r9",   R9,     &pcb.pcb_r9,
        !            50:        "r8",   R8,     &pcb.pcb_r8,
        !            51:        "r7",   R7,     &pcb.pcb_r7,
        !            52:        "r6",   R6,     &pcb.pcb_r6,
        !            53:        "r5",   R5,     &pcb.pcb_r5,
        !            54:        "r4",   R4,     &pcb.pcb_r4,
        !            55:        "r3",   R3,     &pcb.pcb_r3,
        !            56:        "r2",   R2,     &pcb.pcb_r2,
        !            57:        "r1",   R1,     &pcb.pcb_r1,
        !            58:        "r0",   R0,     &pcb.pcb_r0,
        !            59: };
        !            60: 
        !            61: char           lastc;
        !            62: 
        !            63: INT            fcor;
        !            64: STRING         errflg;
        !            65: INT            signo;
        !            66: INT            sigcode;
        !            67: 
        !            68: 
        !            69: L_INT          dot;
        !            70: L_INT          var[];
        !            71: STRING         symfil;
        !            72: STRING         corfil;
        !            73: INT            pid;
        !            74: L_INT          adrval;
        !            75: INT            adrflg;
        !            76: L_INT          cntval;
        !            77: INT            cntflg;
        !            78: 
        !            79: STRING         signals[] = {
        !            80:                "",
        !            81:                "hangup",
        !            82:                "interrupt",
        !            83:                "quit",
        !            84:                "illegal instruction",
        !            85:                "trace/BPT",
        !            86:                "IOT",
        !            87:                "EMT",
        !            88:                "floating exception",
        !            89:                "killed",
        !            90:                "bus error",
        !            91:                "memory fault",
        !            92:                "bad system call",
        !            93:                "broken pipe",
        !            94:                "alarm call",
        !            95:                "terminated",
        !            96:                "signal 16",
        !            97:                "stop (signal)",
        !            98:                "stop (tty)",
        !            99:                "continue (signal)",
        !           100:                "child termination",
        !           101:                "stop (tty input)",
        !           102:                "stop (tty output)",
        !           103:                "input available (signal)",
        !           104:                "cpu timelimit",
        !           105:                "file sizelimit",
        !           106:                "signal 26",
        !           107:                "signal 27",
        !           108:                "signal 28",
        !           109:                "signal 29",
        !           110:                "signal 30",
        !           111:                "signal 31",
        !           112: };
        !           113: 
        !           114: /* general printing routines ($) */
        !           115: 
        !           116: printtrace(modif)
        !           117: {
        !           118:        INT             narg, i, stat, name, limit;
        !           119:        POS             dynam;
        !           120:        REG BKPTR       bkptr;
        !           121:        CHAR            hi, lo;
        !           122:        ADDR            word;
        !           123:        STRING          comptr;
        !           124:        ADDR            argp, frame, link;
        !           125:        register struct nlist *sp;
        !           126:        INT             stack;
        !           127:        INT             ntramp;
        !           128: 
        !           129:        IF cntflg==0 THEN cntval = -1; FI
        !           130: 
        !           131:        switch (modif) {
        !           132: 
        !           133:            case '<':
        !           134:                IF cntval == 0
        !           135:                THEN    WHILE readchar() != EOR
        !           136:                        DO OD
        !           137:                        lp--;
        !           138:                        break;
        !           139:                FI
        !           140:                IF rdc() == '<'
        !           141:                THEN    stack = 1;
        !           142:                ELSE    stack = 0; lp--;
        !           143:                FI
        !           144:                /* fall thru... */
        !           145: 
        !           146:            case '>':
        !           147:                {CHAR           file[64];
        !           148:                CHAR            Ifile[128];
        !           149:                extern CHAR     *Ipath;
        !           150:                INT             index;
        !           151: 
        !           152:                index=0;
        !           153:                IF rdc()!=EOR
        !           154:                THEN    REP file[index++]=lastc;
        !           155:                            IF index>=63 THEN error(LONGFIL); FI
        !           156:                        PER readchar()!=EOR DONE
        !           157:                        file[index]=0;
        !           158:                        IF modif=='<'
        !           159:                        THEN    IF Ipath THEN
        !           160:                                        strcpy(Ifile, Ipath);
        !           161:                                        strcat(Ifile, "/");
        !           162:                                        strcat(Ifile, file);
        !           163:                                FI
        !           164:                                IF strcmp(file, "-")!=0
        !           165:                                THEN    iclose(stack, 0);
        !           166:                                        infile=open(file,0);
        !           167:                                        IF infile<0
        !           168:                                        THEN    infile=open(Ifile,0);
        !           169:                                        FI
        !           170:                                ELSE    lseek(infile, 0L, 0);
        !           171:                                FI
        !           172:                                IF infile<0
        !           173:                                THEN    infile=0; error(NOTOPEN);
        !           174:                                ELSE    IF cntflg
        !           175:                                        THEN    var[9] = cntval;
        !           176:                                        ELSE    var[9] = 1;
        !           177:                                        FI
        !           178:                                FI
        !           179:                        ELSE    oclose();
        !           180:                                outfile=open(file,1);
        !           181:                                IF outfile<0
        !           182:                                THEN    outfile=creat(file,0644);
        !           183: #ifndef EDDT
        !           184:                                ELSE    lseek(outfile,0L,2);
        !           185: #endif
        !           186:                                FI
        !           187:                        FI
        !           188: 
        !           189:                ELSE    IF modif == '<'
        !           190:                        THEN    iclose(-1, 0);
        !           191:                        ELSE    oclose();
        !           192:                        FI
        !           193:                FI
        !           194:                lp--;
        !           195:                }
        !           196:                break;
        !           197: 
        !           198:            case 'p':
        !           199:                IF kernel == 0
        !           200:                THEN    printf("not debugging kernel\n");
        !           201:                ELSE    IF adrflg
        !           202:                        THEN    int pte = access(RD, dot, DSP, 0);
        !           203:                                masterpcbb = (pte&PG_PFNUM)*512;
        !           204:                        FI
        !           205:                        getpcb();
        !           206:                FI
        !           207:                break;
        !           208: 
        !           209:            case 'd':
        !           210:                IF adrflg
        !           211:                THEN    IF adrval < 2 ORF adrval > 16
        !           212:                        THEN    printf("must have 2 <= radix <= 16");
        !           213:                                break;
        !           214:                        FI
        !           215:                        printf("radix=%d base ten",radix=adrval);
        !           216:                FI
        !           217:                break;
        !           218: 
        !           219:            case 'q': case 'Q': case '%':
        !           220:                done();
        !           221: 
        !           222:            case 'w': case 'W':
        !           223:                maxpos=(adrflg?adrval:MAXPOS);
        !           224:                break;
        !           225: 
        !           226:            case 's': case 'S':
        !           227:                maxoff=(adrflg?adrval:MAXOFF);
        !           228:                break;
        !           229: 
        !           230:            case 'v': case 'V':
        !           231:                prints("variables\n");
        !           232:                FOR i=0;i<=35;i++
        !           233:                DO      IF var[i]
        !           234:                        THEN printc((i<=9 ? '0' : 'a'-10) + i);
        !           235:                                printf(" = %x\n",var[i]);
        !           236:                        FI
        !           237:                OD
        !           238:                break;
        !           239: 
        !           240:            case 'm': case 'M':
        !           241:                printmap("? map",&txtmap);
        !           242:                printmap("/ map",&datmap);
        !           243:                break;
        !           244: 
        !           245:            case 0: case '?':
        !           246:                IF pid
        !           247:                THEN printf("pcs id = %d\n",pid);
        !           248:                ELSE prints("no process\n");
        !           249:                FI
        !           250:                sigprint(); flushbuf();
        !           251: 
        !           252:            case 'r': case 'R':
        !           253:                printregs();
        !           254:                return;
        !           255: 
        !           256:            case 'c': case 'C':
        !           257:                IF adrflg
        !           258:                THEN    frame=adrval;
        !           259:                        word=get(adrval+6,DSP)&0xFFFF;
        !           260:                        IF word&0x2000
        !           261:                        THEN    /* 'calls', can figure out argp */
        !           262:                                argp=adrval+20+((word>>14)&3); word &= 0xFFF;
        !           263:                                WHILE word
        !           264:                                DO      IF word&1
        !           265:                                        THEN    argp+=4;
        !           266:                                        FI
        !           267:                                        word>>=1;
        !           268:                                OD
        !           269:                        ELSE    /* 'callg', can't tell where argp is */
        !           270:                                argp=frame;
        !           271:                        FI
        !           272:                        callpc=get(frame+16,DSP);
        !           273:                ELIF kcore
        !           274:                THEN    argp = pcb.pcb_ap;
        !           275:                        frame = pcb.pcb_fp;
        !           276:                        callpc = pcb.pcb_pc;
        !           277:                ELSE    argp= *(ADDR *)(((ADDR)&u)+AP);
        !           278:                        frame= *(ADDR *)(((ADDR)&u)+FP);
        !           279:                        callpc= *(ADDR *)(((ADDR)&u)+PC);
        !           280:                FI
        !           281:                lastframe=0;
        !           282:                ntramp = 0;
        !           283:                WHILE cntval--
        !           284:                DO      char *name;
        !           285:                        chkerr();
        !           286:                        /* if in extended pcb must be signal trampoline code */
        !           287:                        IF KERNOFF - ctob(UPAGES) < callpc ANDF
        !           288:                            (unsigned)callpc < KERNOFF
        !           289:                        THEN    name = "sigtramp";
        !           290:                                ntramp++;
        !           291:                        ELSE    ntramp = 0;
        !           292:                                findsym(callpc,ISYM);
        !           293:                                IF cursym ANDF
        !           294:                                    !strcmp(cursym->n_un.n_name, "start")
        !           295:                                THEN break;
        !           296:                                FI
        !           297:                                IF cursym
        !           298:                                THEN name = cursym->n_un.n_name;
        !           299:                                ELSE name = "?";
        !           300:                                FI
        !           301:                        FI
        !           302:                        printf("%s(", name);
        !           303:                        narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI
        !           304:                        LOOP    IF narg==0 THEN break; FI
        !           305:                                printf("%R", get(argp += 4, DSP));
        !           306:                                IF --narg!=0 THEN printc(','); FI
        !           307:                        POOL
        !           308:                        IF ntramp == 1
        !           309:                        THEN callpc=get(frame+92, DSP);
        !           310:                        ELSE callpc=get(frame+16, DSP);
        !           311:                        FI
        !           312:                        IF callpc != 0
        !           313:                        THEN    prints(") from ");
        !           314:                                psymoff(callpc, ISYM, "\n");
        !           315:                        ELSE    prints(")\n");
        !           316:                        FI
        !           317: 
        !           318:                        IF modif=='C'
        !           319:                        THEN    WHILE localsym(frame,argp)
        !           320:                                DO      word=get(localval,DSP);
        !           321:                                        printf("%8t%s:%10t",
        !           322:                                            cursym->n_un.n_name);
        !           323:                                        IF errflg
        !           324:                                        THEN prints("?\n"); errflg=0;
        !           325:                                        ELSE printf("%R\n",word);
        !           326:                                        FI
        !           327:                                OD
        !           328:                        FI
        !           329: 
        !           330:                        argp=get(frame+8, DSP);
        !           331:                        lastframe=frame;
        !           332:                        frame=get(frame+12, DSP)&EVEN;
        !           333:                        IF frame==0 THEN break; FI
        !           334:                        IF !adrflg ANDF !INSTACK(frame)
        !           335:                        THEN    IF !kcore ORF !kstackaddr(frame)
        !           336:                                THEN break;
        !           337:                                FI
        !           338:                        FI
        !           339:                OD
        !           340:                break;
        !           341: 
        !           342:            /*print externals*/
        !           343:            case 'e': case 'E':
        !           344:                FOR sp = symtab; sp < esymtab; sp++
        !           345:                DO      IF sp->n_type == (N_DATA|N_EXT) ORF
        !           346:                           sp->n_type == (N_BSS|N_EXT)
        !           347:                        THEN printf("%s:%12t%R\n", sp->n_un.n_name,
        !           348:                                    get(sp->n_value,DSP));
        !           349:                        FI
        !           350:                OD
        !           351:                break;
        !           352: 
        !           353:            case 'a': case 'A':
        !           354:                error("No algol 68 on VAX");
        !           355:                /*NOTREACHED*/
        !           356: 
        !           357:            /*print breakpoints*/
        !           358:            case 'b': case 'B':
        !           359:                printf("breakpoints\ncount%8tbkpt%24tcommand\n");
        !           360:                FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
        !           361:                DO      IF bkptr->flag
        !           362:                        THEN    printf("%-8.8d",bkptr->count);
        !           363:                                psymoff(leng(bkptr->loc),ISYM,"%24t");
        !           364:                                comptr=bkptr->comm;
        !           365:                                WHILE *comptr DO printc(*comptr++); OD
        !           366:                        FI
        !           367:                OD
        !           368:                break;
        !           369: 
        !           370:            default:
        !           371:                error(BADMOD);
        !           372:        }
        !           373: 
        !           374: }
        !           375: 
        !           376: printmap(s,amap)
        !           377: STRING s; MAP *amap;
        !           378: {
        !           379:        int file;
        !           380:        file=amap->ufd;
        !           381:        printf("%s%12t`%s'\n", s,
        !           382:            (file<0 ? "-" : (file==fcor ? corfil : symfil)));
        !           383:        printf("b1 = %-16R",amap->b1);
        !           384:        printf("e1 = %-16R",amap->e1);
        !           385:        printf("f1 = %-16R",amap->f1);
        !           386:        printf("\nb2 = %-16R",amap->b2);
        !           387:        printf("e2 = %-16R",amap->e2);
        !           388:        printf("f2 = %-16R",amap->f2);
        !           389:        printc(EOR);
        !           390: }
        !           391: 
        !           392: printregs()
        !           393: {
        !           394:        REG REGPTR      p;
        !           395:        L_INT           v;
        !           396: 
        !           397:        FOR p=reglist; p < &reglist[24]; p++
        !           398:        DO      v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs);
        !           399:                printf("%s%6t%R %16t", p->rname, v);
        !           400:                valpr(v,(p->roffs==PC?ISYM:DSYM));
        !           401:                printc(EOR);
        !           402:        OD
        !           403:        printpc();
        !           404: }
        !           405: 
        !           406: getreg(regnam) {
        !           407:        REG REGPTR      p;
        !           408:        REG STRING      regptr;
        !           409:        CHAR    *olp;
        !           410:        CHAR            regnxt;
        !           411: 
        !           412:        olp=lp;
        !           413:        FOR p=reglist; p < &reglist[24]; p++
        !           414:        DO      regptr=p->rname;
        !           415:                IF (regnam == *regptr++)
        !           416:                THEN
        !           417:                        WHILE *regptr
        !           418:                        DO IF (regnxt=readchar()) != *regptr++
        !           419:                                THEN --regptr; break;
        !           420:                                FI
        !           421:                        OD
        !           422:                        IF *regptr
        !           423:                        THEN lp=olp;
        !           424:                        ELSE
        !           425:                                int i = kcore ? (int)p->rkern : p->roffs;
        !           426:                                return (i);
        !           427:                        FI
        !           428:                FI
        !           429:        OD
        !           430:        lp=olp;
        !           431:        return(0);
        !           432: }
        !           433: 
        !           434: printpc()
        !           435: {
        !           436:        dot= *(ADDR *)(((ADDR)&u)+PC);
        !           437:        psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP));
        !           438:        printc(EOR);
        !           439: }
        !           440: 
        !           441: char   *illinames[] = {
        !           442:        "reserved addressing fault",
        !           443:        "priviliged instruction fault",
        !           444:        "reserved operand fault"
        !           445: };
        !           446: char   *fpenames[] = {
        !           447:        0,
        !           448:        "integer overflow trap",
        !           449:        "integer divide by zero trap",
        !           450:        "floating overflow trap",
        !           451:        "floating/decimal divide by zero trap",
        !           452:        "floating underflow trap",
        !           453:        "decimal overflow trap",
        !           454:        "subscript out of range trap",
        !           455:        "floating overflow fault",
        !           456:        "floating divide by zero fault",
        !           457:        "floating undeflow fault"
        !           458: };
        !           459: 
        !           460: sigprint()
        !           461: {
        !           462:        IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0])
        !           463:        THEN prints(signals[signo]); FI
        !           464:        switch (signo) {
        !           465: 
        !           466:        case SIGFPE:
        !           467:                IF (sigcode > 0 &&
        !           468:                    sigcode < sizeof fpenames / sizeof fpenames[0]) THEN
        !           469:                        prints(" ("); prints(fpenames[sigcode]); prints(")");
        !           470:                FI
        !           471:                break;
        !           472: 
        !           473:        case SIGILL:
        !           474:                IF (sigcode >= 0 &&
        !           475:                    sigcode < sizeof illinames / sizeof illinames[0]) THEN
        !           476:                        prints(" ("); prints(illinames[sigcode]); prints(")");
        !           477:                FI
        !           478:                break;
        !           479:        }
        !           480: }

unix.superglobalmegacorp.com

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