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

1.1     ! root        1: /*
        !             2:  *     @(#)kdb_opset.c 7.4 (Berkeley) 5/1/89
        !             3:  */
        !             4: 
        !             5: #include "../kdb/defs.h"
        !             6: 
        !             7: #include "frame.h"
        !             8: 
        !             9: ADDR   kdbcallpc;
        !            10: ADDR   kdblastframe;
        !            11: 
        !            12: /*
        !            13:  * Instruction printing.
        !            14:  */
        !            15: REGLIST kdbreglist [] = {
        !            16:        "p1lr", &kdbpcb.pcb_p1lr,       "p1br", (int *)&kdbpcb.pcb_p1br,
        !            17:        "p0lr", &kdbpcb.pcb_p0lr,       "p0br", (int *)&kdbpcb.pcb_p0br,
        !            18:        "ksp",  &kdbpcb.pcb_ksp,        "esp",  &kdbpcb.pcb_esp,
        !            19:        "ssp",  &kdbpcb.pcb_ssp,        "psl",  &kdbpcb.pcb_psl,
        !            20:        "pc",   &kdbpcb.pcb_pc,         "usp",  &kdbpcb.pcb_usp,
        !            21:        "fp",   &kdbpcb.pcb_fp,         "ap",   &kdbpcb.pcb_ap,
        !            22:        "r11",  &kdbpcb.pcb_r11,        "r10",  &kdbpcb.pcb_r10,
        !            23:        "r9",   &kdbpcb.pcb_r9,         "r8",   &kdbpcb.pcb_r8,
        !            24:        "r7",   &kdbpcb.pcb_r7,         "r6",   &kdbpcb.pcb_r6,
        !            25:        "r5",   &kdbpcb.pcb_r5,         "r4",   &kdbpcb.pcb_r4,
        !            26:        "r3",   &kdbpcb.pcb_r3,         "r2",   &kdbpcb.pcb_r2,
        !            27:        "r1",   &kdbpcb.pcb_r1,         "r0",   &kdbpcb.pcb_r0,
        !            28:        0
        !            29: };
        !            30: 
        !            31: /*
        !            32:  * Argument data types
        !            33:  *
        !            34:  * If you change these definitions, you must also change the tables
        !            35:  * in assizetab.c
        !            36:  */
        !            37: #define        TYPB            000     /* byte integer */
        !            38: #define        TYPW            001     /* word integer */
        !            39: #define        TYPL            002     /* long integer */
        !            40: #define        TYPQ            003     /* quad integer */
        !            41: #define        TYPO            004     /* octa integer */
        !            42: #define        TYPF            005     /* F float */
        !            43: #define        TYPD            006     /* D float */
        !            44: #define        TYPG            007     /* G float */
        !            45: #define        TYPH            010     /* H float */
        !            46: #define        TYPUNPACKED     011     /* when unpacked into mantissa & exponent */
        !            47: #define        TYPNONE         012     /* when nothing */
        !            48: #define        TYPLG           4       /* number of bits the above take up */
        !            49: 
        !            50: #define        TYPMASK ((1<<TYPLG)-1)  /* the mask (assumes 2's comp arith) */
        !            51: /*
        !            52:  * Constructors and extractors for argument access kinds and types
        !            53:  */
        !            54: #define A_CONS(access, type)   ((access) | (type))
        !            55: #define        A_ACCEXT(consed)        ((consed) & (TYPMASK << TYPLG))
        !            56: #define        A_TYPEXT(consed)        ((consed) & TYPMASK)
        !            57: 
        !            58: /*
        !            59:  * Argument access types used to test validity of operands to operators
        !            60:  */
        !            61: #define        ACCR    (1<<TYPLG)                      /* read */
        !            62: #define        ACCW    (2<<TYPLG)                      /* write */
        !            63: #define        ACCB    (4<<TYPLG)                      /* branch displacement */
        !            64: #define        ACCA    (8<<TYPLG)                      /* address only */
        !            65: #define        ACCV    (8<<TYPLG)                      /* address only */
        !            66: #define        ACCM    (ACCR | ACCW)                   /* modify */
        !            67: #define        ACCI    (ACCB | ACCR)                   /* XFC code */
        !            68: 
        !            69: #define ACCESSMASK     (ACCA | ACCR | ACCW | ACCB)     /* the mask */
        !            70: 
        !            71: /*
        !            72:  * Construction of TYPX and ACCX, to make the instrs table
        !            73:  * easy to use and read.
        !            74:  */
        !            75: /*
        !            76:  * For real memory address
        !            77:  */
        !            78: #define        A_AB    A_CONS(ACCA, TYPB)
        !            79: #define        A_AW    A_CONS(ACCA, TYPW)
        !            80: #define        A_AL    A_CONS(ACCA, TYPL)
        !            81: #define        A_AQ    A_CONS(ACCA, TYPQ)
        !            82: #define        A_AO    A_CONS(ACCA, TYPO)
        !            83: #define        A_AF    A_CONS(ACCA, TYPF)
        !            84: #define        A_AD    A_CONS(ACCA, TYPD)
        !            85: #define        A_AG    A_CONS(ACCA, TYPG)
        !            86: #define        A_AH    A_CONS(ACCA, TYPH)
        !            87: /*
        !            88:  * For real memory addresses, or register addresses [sic]
        !            89:  *
        !            90:  * CHEAT! we just call these read access, since
        !            91:  * registers are allowed. All field instruction, except insv,
        !            92:  * are are read access fields.
        !            93:  */
        !            94: #define        A_VB    A_CONS(ACCR, TYPB)
        !            95: #define        A_VW    A_CONS(ACCR, TYPW)
        !            96: #define        A_VL    A_CONS(ACCR, TYPL)
        !            97: #define        A_VQ    A_CONS(ACCR, TYPQ)
        !            98: #define        A_VO    A_CONS(ACCR, TYPO)
        !            99: #define        A_VF    A_CONS(ACCR, TYPF)
        !           100: #define        A_VD    A_CONS(ACCR, TYPD)
        !           101: #define        A_VG    A_CONS(ACCR, TYPG)
        !           102: #define        A_VH    A_CONS(ACCR, TYPH)
        !           103: /*
        !           104:  * For branch displacement
        !           105:  */
        !           106: #define        A_BB    A_CONS(ACCB, TYPB)
        !           107: #define        A_BW    A_CONS(ACCB, TYPW)
        !           108: /*
        !           109:  * For modification
        !           110:  */
        !           111: #define        A_MB    A_CONS(ACCM, TYPB)
        !           112: #define        A_MW    A_CONS(ACCM, TYPW)
        !           113: #define        A_ML    A_CONS(ACCM, TYPL)
        !           114: #define        A_MF    A_CONS(ACCM, TYPF)
        !           115: #define        A_MD    A_CONS(ACCM, TYPD)
        !           116: #define        A_MG    A_CONS(ACCM, TYPG)
        !           117: #define        A_MH    A_CONS(ACCM, TYPH)
        !           118: /*
        !           119:  * For reading
        !           120:  */
        !           121: #define        A_RB    A_CONS(ACCR, TYPB)
        !           122: #define        A_RW    A_CONS(ACCR, TYPW)
        !           123: #define        A_RL    A_CONS(ACCR, TYPL)
        !           124: #define        A_RQ    A_CONS(ACCR, TYPQ)
        !           125: #define        A_RO    A_CONS(ACCR, TYPO)
        !           126: #define        A_RF    A_CONS(ACCR, TYPF)
        !           127: #define        A_RD    A_CONS(ACCR, TYPD)
        !           128: #define        A_RG    A_CONS(ACCR, TYPG)
        !           129: #define        A_RH    A_CONS(ACCR, TYPH)
        !           130: /*
        !           131:  * For writing
        !           132:  */
        !           133: #define        A_WB    A_CONS(ACCW, TYPB)
        !           134: #define        A_WW    A_CONS(ACCW, TYPW)
        !           135: #define        A_WL    A_CONS(ACCW, TYPL)
        !           136: #define        A_WQ    A_CONS(ACCW, TYPQ)
        !           137: #define        A_WO    A_CONS(ACCW, TYPO)
        !           138: #define        A_WF    A_CONS(ACCW, TYPF)
        !           139: #define        A_WD    A_CONS(ACCW, TYPD)
        !           140: #define        A_WG    A_CONS(ACCW, TYPG)
        !           141: #define        A_WH    A_CONS(ACCW, TYPH)
        !           142: 
        !           143: struct insttab {
        !           144:        char    *iname;
        !           145:        u_char  eopcode;
        !           146:        u_char  popcode;
        !           147:        char    nargs;
        !           148:        u_char  argtype[6];
        !           149: };
        !           150: 
        !           151: #define OP(name,eopcode,popdcode,nargs,a1,a2,a3,a4,a5,a6) \
        !           152:        {name,eopcode,popdcode,nargs,a1,a2,a3,a4,a5,a6}
        !           153: /*
        !           154:  * Definitions for the escape bytes
        !           155:  */
        !           156: #define        CORE    0
        !           157: #define        NEW     1
        !           158: #define        ESCD    0xfd
        !           159: #define        ESCF    0xff
        !           160: #define        mapescbyte(b)   ((b) == ESCD ? 1 : (b) == ESCF ? 2 : 0)
        !           161: 
        !           162: static struct insttab insttab[] = {
        !           163: #include "../vax/kdb_instrs"
        !           164: 0};
        !           165: 
        !           166: /*
        !           167:  * Convert TYP[BWLQOFDGH] into {1 if relocation not OK}
        !           168:  */
        !           169: int    ty_NORELOC[] = {
        !           170:        0,      /* TYPB */
        !           171:        0,      /* TYPW */
        !           172:        0,      /* TYPL */
        !           173:        1,      /* TYPQ */
        !           174:        1,      /* TYPO */
        !           175:        1,      /* TYPF */
        !           176:        1,      /* TYPD */
        !           177:        1,      /* TYPG */
        !           178:        1,      /* TYPH */
        !           179:        1       /* TYPNONE */
        !           180: };
        !           181: 
        !           182: /*
        !           183:  * Convert TYP[BWLQOFDGH] into {1 ... 16}
        !           184:  */
        !           185: int    ty_nbyte[] = {
        !           186:        1,      /* TYPB */
        !           187:        2,      /* TYPW */
        !           188:        4,      /* TYPL */
        !           189:        8,      /* TYPQ */
        !           190:        16,     /* TYPO */
        !           191:        4,      /* TYPF */
        !           192:        8,      /* TYPD */
        !           193:        8,      /* TYPG */
        !           194:        16,     /* TYPH */
        !           195:        0       /* TYPNONE */
        !           196: };
        !           197: 
        !           198: static char *regname[] = {
        !           199:        "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
        !           200:        "r8", "r9", "r10","r11","ap", "fp", "sp", "pc"
        !           201: };
        !           202: static char *fltimm[] = {
        !           203: "0.5", "0.5625", "0.625", "0.6875", "0.75", "0.8125", "0.875", "0.9375",
        !           204: "1.0", "1.125", "1.25", "1.375", "1.5", "1.625", "1.75", "1.875",
        !           205: "2.0", "2.25", "2.5", "2.75", "3.0", "3.25", "3.5", "3.75",
        !           206: "4.0", "4.5", "5.0", "5.5", "6.0", "6.5", "7.0", "7.5",
        !           207: "8.0", "9.0", "10.0", "11.0", "12.0", "13.0", "14.0", "15.0",
        !           208: "16.0", "18.0", "20.0", "22.0", "24.0", "26.0", "28.0", "30.0",
        !           209: "32.0", "36.0", "40.0", "44.0", "48.0", "52.0", "56.0", "60.0",
        !           210: "64.0", "72.0", "80.0", "88.0", "96.0", "104.0", "112.0", "120.0"
        !           211: };
        !           212: 
        !           213: static int type, space, incp;
        !           214: static long insoutvar[36];
        !           215: /*
        !           216:  * Definitions for registers and for operand classes
        !           217:  */
        !           218: static char *insregname();     /* how to print a register */
        !           219: 
        !           220: #define        R_PC            0xF
        !           221: 
        !           222: #define        OC_IMM0         0x0
        !           223: #define        OC_IMM1         0x1
        !           224: #define        OC_IMM2         0x2
        !           225: #define        OC_IMM3         0x3
        !           226: #define        OC_INDEX        0x4
        !           227: #define        OC_REG          0x5
        !           228: #define        OC_DREG         0x6
        !           229: #define        OC_ADREG        0x7
        !           230: #define        OC_AIREG        0x8
        !           231: #define        OC_DAIREG       0x9
        !           232: 
        !           233: #define        OC_BDISP        0xA
        !           234: #define        OC_DBDISP       0xB
        !           235: #define        OC_WDISP        0xC
        !           236: #define        OC_DWDISP       0xD
        !           237: #define        OC_LDISP        0xE
        !           238: #define        OC_DLDISP       0xF
        !           239: 
        !           240: #define        OC_SHIFT        4
        !           241: #define        OC_CONS(oc,reg) (((oc & 0xF) << OC_SHIFT) | (reg & 0xF))
        !           242: #define        OC_AMEXT(x)     (((x) >> OC_SHIFT) & 0xF)
        !           243: #define        OC_REGEXT(x)    ((x) & 0xF)
        !           244: 
        !           245: /*
        !           246:  * Definitions for large numbers
        !           247:  */
        !           248: #include "asnumber.h"
        !           249: typedef        struct  as_number       *numberp;
        !           250: static numberp snarf();
        !           251: static numberp snarfreloc();
        !           252: /*
        !           253:  * Definitions for special instructions
        !           254:  */
        !           255: #define        CASEB   0x8F
        !           256: #define        CASEW   0xAF
        !           257: #define        CASEL   0xCF
        !           258: 
        !           259: /* two level 1-based index by opcode into insttab */
        !           260: static short ioptab[3][256];
        !           261: 
        !           262: kdbsetup()
        !           263: {
        !           264:        register struct insttab *p;
        !           265:                int     mapchar;
        !           266: 
        !           267:        for(p = insttab; p->iname; p++){
        !           268:                mapchar = mapescbyte(p->eopcode);
        !           269:                if (ioptab[mapchar][p->popcode])
        !           270:                        continue;
        !           271:                ioptab[mapchar][p->popcode] = (p - insttab) + 1;
        !           272:        }
        !           273: }
        !           274: 
        !           275: static u_char snarfuchar();
        !           276: /*
        !           277:  * Global variables for communicating with the minions and printins
        !           278:  */
        !           279: static int     idsp;
        !           280: static short   argno;          /* which argument one is working on */
        !           281: static char    insoutfmt[2];   /* how to format the relocated symbols */
        !           282: 
        !           283: static savevar(val)
        !           284:        long    val;
        !           285: {
        !           286:        kdbvar[argno] = val;
        !           287:        insoutvar[argno] = val;
        !           288: }
        !           289: 
        !           290: /* ARGSUSED */
        !           291: kdbprintins(Idsp, ins)
        !           292:        u_char  ins;
        !           293:        int     Idsp;
        !           294: {
        !           295:                u_char  mode;           /* mode */
        !           296:                u_char  ins2;
        !           297:                char    *indexreg;      /* print of which register indexes */
        !           298:                char    *indexed;       /* we indexed */
        !           299:                char    *operandout();
        !           300:        register u_char         *ap;
        !           301:        register struct insttab *ip;
        !           302:                u_char  optype;
        !           303:                int     mapchar;
        !           304: 
        !           305:        idsp = Idsp;
        !           306:        type = DSYM;
        !           307:        space = idsp;
        !           308:        insoutfmt[0] = 0;
        !           309: 
        !           310:        incp = 1;
        !           311:        if ((mapchar = mapescbyte(ins)) != 0){
        !           312:                ins2 = snarfuchar();
        !           313:                if (ioptab[mapchar][ins2] == 0){
        !           314:                        /*
        !           315:                         *      Oops; not a defined instruction;
        !           316:                         *      back over this escape byte.
        !           317:                         */
        !           318:                        incp -= 1;
        !           319:                        mapchar = 0;
        !           320:                } else {
        !           321:                        ins = ins2;
        !           322:                }
        !           323:        }
        !           324:        if (ioptab[mapchar][ins] == 0){
        !           325:                kdbprintf("<undefined operator byte>: %x", ins);
        !           326:                goto ret;
        !           327:        }
        !           328:        ip = &insttab[ioptab[mapchar][ins] - 1];
        !           329:        kdbprintf("%s\t", ip->iname);
        !           330: 
        !           331:        for (ap = ip->argtype, argno = 0; argno < ip->nargs; argno++, ap++) {
        !           332:                savevar(0x80000000);    /* an illegal symbol */
        !           333:                optype = *ap;
        !           334:                if (argno != 0)
        !           335:                        kdbprintc(',');
        !           336:                indexreg = 0;
        !           337:                indexed = 0;
        !           338:                do{
        !           339:                        if (A_ACCEXT(optype) & ACCB){
        !           340:                                switch(A_TYPEXT(optype)){
        !           341:                                case TYPB:
        !           342:                                        mode = OC_CONS(OC_BDISP, R_PC);
        !           343:                                        break;
        !           344:                                case TYPW:
        !           345:                                        mode = OC_CONS(OC_WDISP, R_PC);
        !           346:                                        break;
        !           347:                                }
        !           348:                        } else {
        !           349:                                mode = snarfuchar();
        !           350:                        }
        !           351:                        indexreg = operandout(mode, optype);
        !           352:                        if (indexed)
        !           353:                                kdbprintf("[%s]", indexed);
        !           354:                        indexed = indexreg;
        !           355:                } while(indexed);
        !           356:        }
        !           357:        if (mapchar == 0){
        !           358:                switch(ins){
        !           359:                case CASEB:
        !           360:                case CASEW:
        !           361:                case CASEL:
        !           362:                        casebody(insoutvar[1], insoutvar[2]);
        !           363:                        break;
        !           364:                default:
        !           365:                        break;
        !           366:                }
        !           367:        }
        !           368:    ret: ;
        !           369: 
        !           370:        kdbdotinc = incp;
        !           371: }
        !           372: 
        !           373: casebody(base, limit)
        !           374:        long    base;
        !           375:        long    limit;
        !           376: {
        !           377:        int     i;
        !           378:        u_int   baseincp;
        !           379:        u_int   advincp;
        !           380:        struct  as_number       *valuep;
        !           381: #define        OSIZE (sizeof(short))
        !           382:        argno = 0;
        !           383:        baseincp = incp;
        !           384:        for (i = 0; i <= limit; i++) {
        !           385:                kdbprintc(EOR);
        !           386:                kdbprintf("    %R:  ", i + base);
        !           387:                valuep = snarfreloc(OSIZE, 0);
        !           388:                advincp = incp;
        !           389:                incp = baseincp;
        !           390:                dispaddress(valuep, OC_CONS(OC_WDISP, R_PC));
        !           391:                incp = advincp;
        !           392:        }
        !           393: }
        !           394: 
        !           395: /*
        !           396:  * magic values to mung an offset to a register into
        !           397:  * something that psymoff can understand.. all magic
        !           398:  */
        !           399:                              /* 0      1       2       3       4 */
        !           400: static long magic_masks[5] =   {0,     0x80,   0x8000, 0,      0};     
        !           401: static long magic_compl[5] =   {0,     0x100,  0x10000,0,      0};
        !           402: /*
        !           403:  * Snarf up some bytes, and put in the magic relocation flags
        !           404:  */
        !           405: static numberp snarfreloc(nbytes)
        !           406:        int     nbytes;
        !           407: {
        !           408:        numberp back;
        !           409:        back = snarf(nbytes);
        !           410:        if (back->num_ulong[0] & magic_masks[nbytes])
        !           411:                back->num_ulong[0] -= magic_compl[nbytes];
        !           412:        return(back);
        !           413: }
        !           414: /*
        !           415:  * The following code is NOT portable from the PDP 11 to the VAX
        !           416:  * because of the byte ordering problem.
        !           417:  */
        !           418: static numberp snarf(nbytes)
        !           419:        int     nbytes;
        !           420: {
        !           421:        register        int     i;
        !           422: 
        !           423:        static  struct  as_number       backnumber;
        !           424:        static  struct  as_number       znumber;        /* init'ed to 0 */
        !           425: 
        !           426:        backnumber = znumber;
        !           427:        for (i = 0; i < nbytes; i++)
        !           428:                backnumber.num_uchar[i] = snarfuchar();
        !           429:        return(&backnumber);
        !           430: }
        !           431: 
        !           432: /*
        !           433:  * Read one single character, and advance the dot
        !           434:  */
        !           435: static u_char
        !           436: snarfuchar()
        !           437: {
        !           438:        u_char  back;
        !           439:        /*
        !           440:         *      assert: bchkget and inkdot don't have side effects
        !           441:         */
        !           442:        back = (u_char)kdbbchkget(kdbinkdot(incp), idsp);
        !           443:        incp += 1;
        !           444:        return(back);
        !           445: }
        !           446: 
        !           447: /*
        !           448:  * normal operand; return non zero pointer to register
        !           449:  * name if this is an index instruction.
        !           450:  */
        !           451: char *operandout(mode, optype)
        !           452:        u_char  mode;
        !           453:        u_char  optype;
        !           454: {
        !           455:        char    *r;
        !           456:        int     regnumber;
        !           457:        int     nbytes;
        !           458: 
        !           459:        regnumber = OC_REGEXT(mode);
        !           460:        r = insregname(regnumber);
        !           461:        switch (OC_AMEXT(mode)){
        !           462:        case OC_IMM0:
        !           463:        case OC_IMM1:
        !           464:        case OC_IMM2:
        !           465:        case OC_IMM3:
        !           466:                shortliteral(mode, optype);
        !           467:                return(0);
        !           468:        case OC_INDEX:
        !           469:                return(r);              /* will be printed later */
        !           470:        case OC_REG:
        !           471:                kdbprintf("%s", r);
        !           472:                return(0);
        !           473:        case OC_DREG:
        !           474:                kdbprintf("(%s)", r);
        !           475:                return(0);
        !           476:        case OC_ADREG:
        !           477:                kdbprintf("-(%s)", r);
        !           478:                return(0);
        !           479:        case OC_DAIREG:
        !           480:                kdbprintc('*');
        !           481:        case OC_AIREG:
        !           482:                if (regnumber == R_PC){
        !           483:                        pcimmediate(mode, optype);
        !           484:                } else {
        !           485:                        kdbprintf("(%s)+", r);
        !           486:                }
        !           487:                return(0);
        !           488:        case OC_DBDISP:
        !           489:                kdbprintc('*');
        !           490:        case OC_BDISP:
        !           491:                nbytes = 1;
        !           492:                break;
        !           493:        case OC_DWDISP:
        !           494:                kdbprintc('*');
        !           495:        case OC_WDISP:
        !           496:                nbytes = 2;
        !           497:                break;
        !           498:        case OC_DLDISP:
        !           499:                kdbprintc('*');
        !           500:        case OC_LDISP:
        !           501:                nbytes = 4;
        !           502:                break;
        !           503:        }
        !           504:        dispaddress(snarfreloc(nbytes), mode);
        !           505:        return(0);
        !           506: }
        !           507: 
        !           508: dispaddress(valuep, mode)
        !           509:        numberp valuep;
        !           510:        u_char  mode;
        !           511: {
        !           512:        int     regnumber = OC_REGEXT(mode);
        !           513: 
        !           514:        switch(OC_AMEXT(mode)){
        !           515:        case OC_BDISP:
        !           516:        case OC_DBDISP:
        !           517:        case OC_WDISP:
        !           518:        case OC_DWDISP:
        !           519:        case OC_LDISP:
        !           520:        case OC_DLDISP:
        !           521:                if (regnumber == R_PC){
        !           522:                        /* PC offset addressing */
        !           523:                        valuep->num_ulong[0] += kdbinkdot(incp);
        !           524:                }
        !           525:        }
        !           526:        if (regnumber == R_PC)
        !           527:                kdbpsymoff(valuep->num_ulong[0], type, &insoutfmt[0]);
        !           528:        else {                          /* } */
        !           529:                kdbprintf(LPRMODE, valuep->num_ulong[0]);
        !           530:                kdbprintf(insoutfmt);
        !           531:                kdbprintf("(%s)", insregname(regnumber));
        !           532:        }
        !           533:        savevar((long)valuep->num_ulong[0]);
        !           534: }
        !           535: 
        !           536: /*
        !           537:  * get a register name
        !           538:  */
        !           539: static char *
        !           540: insregname(regnumber)
        !           541:        int     regnumber;
        !           542: {
        !           543:        char    *r;
        !           544:        r = regname[regnumber];
        !           545:        return(r);
        !           546: }
        !           547: 
        !           548: /*
        !           549:  * print out a short literal
        !           550:  */
        !           551: shortliteral(mode, optype)
        !           552:        u_char  mode;
        !           553:        u_char  optype;
        !           554: {
        !           555:        savevar((long)mode);
        !           556:        switch(A_TYPEXT(optype)){
        !           557:        case TYPF:
        !           558:        case TYPD:
        !           559:        case TYPG:
        !           560:        case TYPH:
        !           561:                kdbprintf("$%s", fltimm[mode]);
        !           562:                break;
        !           563:        default:
        !           564:                kdbprintf("$%r", mode);
        !           565:                break;
        !           566:        }
        !           567: }
        !           568: 
        !           569: pcimmediate(mode, optype)
        !           570:        u_char  mode;
        !           571:        u_char  optype;
        !           572: {
        !           573:        int     nbytes;
        !           574: 
        !           575:        kdbprintc('$');
        !           576:        if (mode == OC_CONS(OC_DAIREG, R_PC)){  /* PC absolute, always 4 bytes*/
        !           577:                dispaddress(snarfreloc(4), mode);
        !           578:                return;
        !           579:        }
        !           580:        nbytes = ty_nbyte[A_TYPEXT(optype)];
        !           581:        if (! ty_NORELOC[A_TYPEXT(optype)]){
        !           582:                dispaddress(snarfreloc(nbytes), mode);
        !           583:                return;
        !           584:        }
        !           585:        bignumprint(nbytes, optype);
        !           586: }
        !           587: 
        !           588: bignumprint(nbytes, optype)
        !           589:        int     nbytes;
        !           590:        u_char  optype;
        !           591: {
        !           592:        numberp valuep;
        !           593:        int     leading_zero = 1;
        !           594:        register int    bindex;
        !           595:        register int    nindex;
        !           596:        register int    ch;
        !           597: 
        !           598:        valuep = snarf(nbytes);
        !           599:        switch(A_TYPEXT(optype)){
        !           600:        case TYPF:      
        !           601:                kdbprintf("0f%f", valuep->num_num.numFf_float.Ff_value);
        !           602:                break;
        !           603:        case TYPD:
        !           604:                kdbprintf("0d%f", valuep->num_num.numFd_float.Fd_value);
        !           605:                break;
        !           606:        case TYPG:
        !           607:                kdbprintf("0g::"); goto qprint;
        !           608:        case TYPH:
        !           609:                kdbprintf("0h::"); goto qprint;
        !           610:        case TYPQ:
        !           611:        case TYPO:
        !           612:        qprint:
        !           613:                for (bindex = nbytes - 1; bindex >= 0; --bindex){
        !           614:                        for (nindex = 4; nindex >= 0; nindex -= 4){
        !           615:                                ch = (valuep->num_uchar[bindex] >> nindex);
        !           616:                                ch &= 0x0F;
        !           617:                                if ( ! (leading_zero &= (ch == 0) ) ){
        !           618:                                        if (ch <= 0x09)
        !           619:                                                kdbprintc(ch + '0');
        !           620:                                        else
        !           621:                                                kdbprintc(ch - 0x0A + 'a');
        !           622:                                }
        !           623:                        }
        !           624:                }
        !           625:                break;
        !           626:        }
        !           627: }
        !           628: 
        !           629: kdbstacktrace(dolocals)
        !           630:        int dolocals;
        !           631: {
        !           632:        register ADDR ap, fp;
        !           633:        register int i, narg, tramp;
        !           634:        struct frame fr;
        !           635: 
        !           636:        if (kdbadrflg) {
        !           637:                /*
        !           638:                 * Can only find args if called via `calls' (not callg).
        !           639:                 * The horrible expression below reads the second
        !           640:                 * longword of the given frame address; this contains
        !           641:                 * fr_s and fr_spa, plus the register save mask.  The
        !           642:                 * memory layout is
        !           643:                 *      fp+0x00: call frame structure
        !           644:                 *      fp+0x14: saved registers
        !           645:                 *      fp+0xMM: stack alignment bytes
        !           646:                 *      fp+0xNN: arguments
        !           647:                 */
        !           648:                fp = kdbadrval;
        !           649:                ((int *)&fr)[1] = kdbget((off_t)fp + 4, DSP);
        !           650:                if (fr.fr_s) {
        !           651:                        ap = fp + sizeof(fr) + fr.fr_spa;
        !           652:                        for (i = fr.fr_mask; i != 0; i >>= 1)
        !           653:                                if (i & 1)
        !           654:                                        ap += 4;
        !           655:                } else
        !           656:                        ap = 0;
        !           657:                kdbcallpc = getprevpc(fp);
        !           658:        } else {
        !           659:                fp = kdbpcb.pcb_fp;
        !           660:                ap = kdbpcb.pcb_ap;
        !           661:                kdbcallpc = kdbpcb.pcb_pc;
        !           662:        }
        !           663: 
        !           664:        kdblastframe = NOFRAME;
        !           665:        while (kdbcntval-- && fp != NOFRAME) {
        !           666:                char *name;
        !           667: 
        !           668:                kdbchkerr();
        !           669:                /* check for pc in pcb (signal trampoline code) */
        !           670:                if (issignalpc(kdbcallpc)) {
        !           671:                        tramp = 1;
        !           672:                        name = "sigtramp";
        !           673:                } else {
        !           674:                        tramp = 0;
        !           675:                        (void) kdbfindsym((long)kdbcallpc, ISYM);
        !           676:                        if (kdbcursym)
        !           677:                                name = kdbcursym->n_un.n_name;
        !           678:                        else
        !           679:                                name = "?";
        !           680:                }
        !           681:                kdbprintf("%s(", name);
        !           682:                if (ap) {
        !           683:                        /* byte at ap tells how many arguments */
        !           684:                        narg = kdbget((off_t)ap, DSP) & 0xff;
        !           685:                        for (i = narg > 10 ? 10 : narg; i;) {
        !           686:                                ap += 4;
        !           687:                                kdbprintf("%R", kdbget((off_t)ap, DSP));
        !           688:                                if (--i != 0)
        !           689:                                        kdbprintc(',');
        !           690:                        }
        !           691:                } else
        !           692:                        kdbprintc('?');
        !           693:                kdbprintf(") at ");
        !           694:                kdbpsymoff((long)kdbcallpc, ISYM, "\n");
        !           695: 
        !           696:                if (dolocals) {
        !           697:                        register ADDR word;
        !           698: 
        !           699:                        while (kdblocalsym((long)fp)) {
        !           700:                                word = kdbget((off_t)kdblocalval, DSP);
        !           701:                                kdbprintf("%8t%s:%10t",
        !           702:                                    kdbcursym->n_un.n_name);
        !           703:                                if (kdberrflg) {
        !           704:                                        kdbprintf("?\n");
        !           705:                                        kdberrflg = 0;
        !           706:                                } else
        !           707:                                        kdbprintf("%R\n", word);
        !           708:                        }
        !           709:                }
        !           710:                if (!tramp) {
        !           711:                        kdbcallpc = getprevpc(fp);
        !           712:                        kdblastframe = fp;
        !           713:                        /* 8 below == offsetof(struct frame, fr_savap) */
        !           714:                        ap = kdbget((off_t)fp + 8, DSP);
        !           715:                        fp = getprevframe(fp);
        !           716:                } else {
        !           717:                        kdbcallpc = getsignalpc(kdblastframe);
        !           718:                        /* ??? WHAT ABOUT ap AND fp ??? */
        !           719:                }
        !           720:                if (!kdbadrflg && !INSTACK(fp))
        !           721:                        break;
        !           722:        }
        !           723: }

unix.superglobalmegacorp.com

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