Annotation of 43BSDReno/sys/tahoe/kdb_opset.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1988 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  *
        !             6:  *     @(#)kdb_opset.c 7.6 (Berkeley) 6/22/90
        !             7:  */
        !             8: 
        !             9: #include "../kdb/defs.h"
        !            10: 
        !            11: /*
        !            12:  * Instruction printing.
        !            13:  */
        !            14: 
        !            15: REGLIST kdbreglist[] = {
        !            16:        "p2lr", &kdbpcb.pcb_p2lr,       "p2br", (int *)&kdbpcb.pcb_p2br,
        !            17:        "p1lr", &kdbpcb.pcb_p1lr,       "p1br", (int *)&kdbpcb.pcb_p1br,
        !            18:        "p0lr", &kdbpcb.pcb_p0lr,       "p0br", (int *)&kdbpcb.pcb_p0br,
        !            19:        "ksp",  &kdbpcb.pcb_ksp,        "hfs",  &kdbpcb.pcb_hfs,
        !            20:        "psl",  &kdbpcb.pcb_psl,        "pc",   &kdbpcb.pcb_pc,
        !            21:        "ach",  &kdbpcb.pcb_ach,        "acl",  &kdbpcb.pcb_acl,
        !            22:        "usp",  &kdbpcb.pcb_usp,        "fp",   &kdbpcb.pcb_fp,
        !            23:        "r12",  &kdbpcb.pcb_r12,        "r11",  &kdbpcb.pcb_r11,
        !            24:        "r10",  &kdbpcb.pcb_r10,        "r9",   &kdbpcb.pcb_r9,
        !            25:        "r8",   &kdbpcb.pcb_r8, "r7",   &kdbpcb.pcb_r7,
        !            26:        "r6",   &kdbpcb.pcb_r6, "r5",   &kdbpcb.pcb_r5,
        !            27:        "r4",   &kdbpcb.pcb_r4, "r3",   &kdbpcb.pcb_r3,
        !            28:        "r2",   &kdbpcb.pcb_r2, "r1",   &kdbpcb.pcb_r1,
        !            29:        "r0",   &kdbpcb.pcb_r0,
        !            30:        0
        !            31: };
        !            32: 
        !            33: /*
        !            34:  * Argument access types
        !            35:  */
        !            36: #define ACCA   (8<<3)  /* address only */
        !            37: #define ACCR   (1<<3)  /* read */
        !            38: #define ACCW   (2<<3)  /* write */
        !            39: #define ACCM   (3<<3)  /* modify */
        !            40: #define ACCB   (4<<3)  /* branch displacement */
        !            41: #define ACCI   (5<<3)  /* XFC code */
        !            42: 
        !            43: /*
        !            44:  * Argument data types
        !            45:  */
        !            46: #define TYPB   0       /* byte */
        !            47: #define TYPW   1       /* word */
        !            48: #define TYPL   2       /* long */
        !            49: #define TYPQ   3       /* quad */
        !            50: #define TYPF   4       /* float */
        !            51: #define TYPD   5       /* double */
        !            52: 
        !            53: struct optab {
        !            54:        char *iname;
        !            55:        char val;
        !            56:        char nargs;
        !            57:        char argtype[6];
        !            58: };
        !            59: 
        !            60: static struct optab *ioptab[256];      /* index by opcode to optab */
        !            61: static struct optab optab[] = {        /* opcode table */
        !            62: #define OP(a,b,c,d,e,f,g,h,i) {a,b,c,d,e,f,g,h,i}
        !            63: #include "../tahoe/kdb_instrs"
        !            64: 0};
        !            65: static char *regname[] = {
        !            66:        "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
        !            67:        "r8", "r9", "r10", "r11", "r12", "fp", "sp", "pc"
        !            68: };
        !            69: static int type, space, incp;
        !            70: 
        !            71: /* set up ioptab */
        !            72: kdbsetup()
        !            73: {
        !            74:        register struct optab *p;
        !            75: 
        !            76:        for (p = optab; p->iname; p++)
        !            77:                ioptab[p->val&LOBYTE] = p;
        !            78: }
        !            79: 
        !            80: static long
        !            81: snarf(nbytes, idsp)
        !            82: {
        !            83:        register long value;
        !            84: 
        !            85:        value = (u_int)kdbchkget((off_t)kdbinkdot(incp), idsp);
        !            86:        incp += nbytes;
        !            87:        return(value>>(4-nbytes)*8);
        !            88: }
        !            89: 
        !            90: kdbprintins(idsp, ins)
        !            91:        register long ins;
        !            92: {
        !            93:        short argno;            /* argument index */
        !            94:        register mode;          /* mode */
        !            95:        register r;             /* register name */
        !            96:        register long d;        /* assembled byte, word, long or float */
        !            97:        register char *ap;
        !            98:        register struct optab *ip;
        !            99: 
        !           100:        type = DSYM;
        !           101:        space = idsp;
        !           102:        ins = byte(ins);
        !           103:        if ((ip = ioptab[ins]) == (struct optab *)0) {
        !           104:                kdbprintf("?%2x%8t", ins);
        !           105:                kdbdotinc = 1;
        !           106:                return;
        !           107:        }
        !           108:        kdbprintf("%s%8t",ip->iname);
        !           109:        incp = 1;
        !           110:        ap = ip->argtype;
        !           111:        for (argno = 0; argno < ip->nargs; argno++, ap++) {
        !           112:                kdbvar[argno] = 0x80000000;
        !           113:                if (argno!=0) kdbprintc(',');
        !           114:          top:
        !           115:                if (*ap&ACCB)
        !           116:                        mode = 0xAF + ((*ap&7)<<5);  /* branch displacement */
        !           117:                else {
        !           118:                        mode = kdbbchkget(kdbinkdot(incp),idsp); ++incp;
        !           119:                }
        !           120:                r = mode&0xF;
        !           121:                mode >>= 4;
        !           122:                switch ((int)mode) {
        !           123:                        case 0: case 1:
        !           124:                        case 2: case 3: /* short literal */
        !           125:                                kdbprintc('$');
        !           126:                                d = mode<<4|r;
        !           127:                                goto immed;
        !           128:                        case 4: /* [r] */
        !           129:                                kdbprintf("[%s]", regname[r]);
        !           130:                                goto top;
        !           131:                        case 5: /* r */
        !           132:                                kdbprintf("%s", regname[r]);
        !           133:                                break;
        !           134:                        case 6: /* (r) */
        !           135:                                kdbprintf("(%s)", regname[r]);
        !           136:                                break;
        !           137:                        case 7: /* -(r) */
        !           138:                                kdbprintf("-(%s)", regname[r]);
        !           139:                                break;
        !           140:                        case 9: /* *(r)+ */
        !           141:                                kdbprintc('*');
        !           142:                        case 8: /* (r)+ */
        !           143:                                if (r == 0xF ||
        !           144:                                    mode == 8 && (r == 8 || r == 9)) {
        !           145:                                        kdbprintc('$');
        !           146:                                        d = snarf((r&03)+1, idsp);
        !           147:                                } else {        /*it's not PC immediate or abs*/
        !           148:                                        kdbprintf("(%s)+", regname[r]);
        !           149:                                        break;
        !           150:                                }
        !           151:                        immed:
        !           152:                                if (ins == KCALL && d >= 0 && d < 200) {
        !           153:                                        kdbprintf("%R", d);
        !           154:                                        break;
        !           155:                                }
        !           156:                                goto disp;
        !           157:                        case 0xB:       /* byte displacement deferred */
        !           158:                        case 0xD:       /* word displacement deferred */
        !           159:                        case 0xF:       /* long displacement deferred */
        !           160:                                kdbprintc('*');
        !           161:                        case 0xA:       /* byte displacement */
        !           162:                        case 0xC:       /* word displacement */
        !           163:                        case 0xE:       /* long displacement */
        !           164:                                d = snarf(1<<((mode>>1&03)-1), idsp);
        !           165:                                if (r==0xF) { /* PC offset addressing */
        !           166:                                        d += kdbdot+incp;
        !           167:                                        kdbpsymoff(d,type,"");
        !           168:                                        kdbvar[argno]=d;
        !           169:                                        break;
        !           170:                                }
        !           171:                        disp:
        !           172:                                if (d >= 0 && d < kdbmaxoff)
        !           173:                                        kdbprintf("%R", d);
        !           174:                                else
        !           175:                                        kdbpsymoff(d,type,"");
        !           176:                                if (mode >= 0xA)
        !           177:                                        kdbprintf("(%s)", regname[r]);
        !           178:                                kdbvar[argno] = d;
        !           179:                                break;
        !           180:                }
        !           181:        }
        !           182:        if (ins == CASEL) {
        !           183:                if (kdbinkdot(incp)&01) /* align */
        !           184:                        incp++;
        !           185:                for (argno = 0; argno <= kdbvar[2]; ++argno) {
        !           186:                        kdbprintc(EOR);
        !           187:                        kdbprintf("    %R:  ", argno+kdbvar[1]);
        !           188:                        d = shorten(kdbget(kdbinkdot(incp+argno+argno), idsp));
        !           189:                        if (d&0x8000)
        !           190:                                d -= 0x10000;
        !           191:                        kdbpsymoff(kdbinkdot(incp)+d, type, "");
        !           192:                }
        !           193:                incp += kdbvar[2]+kdbvar[2]+2;
        !           194:        }
        !           195:        kdbdotinc = incp;
        !           196: }
        !           197: ADDR   kdblastframe;
        !           198: ADDR   kdbcallpc;
        !           199: 
        !           200: 
        !           201: kdbstacktrace(dolocals)
        !           202:        int dolocals;
        !           203: {
        !           204:        register int narg;
        !           205:        register ADDR argp, frame;
        !           206:        int tramp;
        !           207: 
        !           208:        if (kdbadrflg) {
        !           209:                frame = kdbadrval;
        !           210:                kdbcallpc = getprevpc(frame);
        !           211:        } else {
        !           212:                frame = kdbpcb.pcb_fp;
        !           213:                kdbcallpc = kdbpcb.pcb_pc;
        !           214:        }
        !           215:        kdblastframe = NOFRAME;
        !           216:        while (kdbcntval-- && frame != NOFRAME) {
        !           217:                char *name;
        !           218: 
        !           219:                kdbchkerr();
        !           220:                /* check for pc in pcb (signal trampoline code) */
        !           221:                if (issignalpc(kdbcallpc)) {
        !           222:                        tramp = 1;
        !           223:                        name = "sigtramp";
        !           224:                } else {
        !           225:                        tramp = 0;
        !           226:                        (void) kdbfindsym((long)kdbcallpc, ISYM);
        !           227:                        if (kdbcursym)
        !           228:                                name = kdbcursym->n_un.n_name;
        !           229:                        else
        !           230:                                name = "?";
        !           231:                }
        !           232:                kdbprintf("%s(", name);
        !           233:                narg = getnargs(frame);
        !           234:                if (narg > 10)
        !           235:                        narg = 10;
        !           236:                argp = frame;
        !           237:                if (!tramp)
        !           238:                        while (narg) {
        !           239:                                kdbprintf("%R",
        !           240:                                    kdbget((off_t)(argp = nextarg(argp)),
        !           241:                                        DSP));
        !           242:                                if (--narg != 0)
        !           243:                                        kdbprintc(',');
        !           244:                        }
        !           245:                kdbprintf(") at ");
        !           246:                kdbpsymoff((long)kdbcallpc, ISYM, "\n");
        !           247: 
        !           248:                if (dolocals) {
        !           249:                        register ADDR word;
        !           250: 
        !           251:                        while (kdblocalsym((long)frame)) {
        !           252:                                word = kdbget((off_t)kdblocalval, DSP);
        !           253:                                kdbprintf("%8t%s:%10t",
        !           254:                                    kdbcursym->n_un.n_name);
        !           255:                                if (kdberrflg) {
        !           256:                                        kdbprintf("?\n");
        !           257:                                        kdberrflg = 0;
        !           258:                                } else
        !           259:                                        kdbprintf("%R\n", word);
        !           260:                        }
        !           261:                }
        !           262:                if (!tramp) {
        !           263:                        kdbcallpc = getprevpc(frame);
        !           264:                        kdblastframe = frame;
        !           265:                        frame = getprevframe(frame);
        !           266:                } else
        !           267:                        kdbcallpc = getsignalpc(kdblastframe);
        !           268:                if (!kdbadrflg && !INSTACK(frame))
        !           269:                        break;
        !           270:        }
        !           271: }

unix.superglobalmegacorp.com

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