Annotation of researchv10dc/cmd/adb/vax/mchframe.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * machine-dependent code for
                      3:  * looking in stack frames
                      4:  * vax version
                      5:  */
                      6: 
                      7: #include "defs.h"
                      8: #include "regs.h"
                      9: #include "sym.h"
                     10: #include "space.h"
                     11: 
                     12: int maxargs = 20;
                     13: 
                     14: /*
                     15:  * VAX stack frame
                     16:  */
                     17: 
                     18: #define        F_PSW   4
                     19: #define        F_FLAGS 6
                     20: #define        F_AP    8       /* saved ap */
                     21: #define        F_FP    12      /* saved fp */
                     22: #define        F_PC    16      /* return pc */
                     23: #define        F_REGS  20      /* saved regs, if any */
                     24: 
                     25: /*
                     26:  * flags
                     27:  */
                     28: 
                     29: #define        FFREGS  0x1fff  /* saved register flags; 01 is r0 */
                     30: #define        FFCALLS 0x2000  /* called by calls, not callg */
                     31: #define        FFOFF   0xc000  /* offset added to align stack */
                     32: #define        SALIGN(f)       (((f)>>14) & 03)
                     33: 
                     34: /*
                     35:  * is the saved psw reasonable?
                     36:  * really just a last resort to find the end of the stack
                     37:  */
                     38: 
                     39: #define        BADPSW(p)       (((p)&0xff00) != 0)
                     40: 
                     41: /*
                     42:  * is the pc probably in signal trampoline code?
                     43:  * == it's in the user block
                     44:  */
                     45: 
                     46: #define        sigtramp(pc)    (0x80000000 > (pc) && (pc) > 0x80000000 - ctob(UPAGES))
                     47: 
                     48: #define        F_HACK  64      /* where to find the saved pc in a trampoline frame */
                     49: /*
                     50:  * return an address for a local variable
                     51:  * no register vars, unfortunately, as we can't provide an address
                     52:  * gn is the procedure; ln the local name
                     53:  *
                     54:  * this is vax dependent because symbol tables vary
                     55:  */
                     56: 
                     57: localaddr(gn, ln)
                     58: char *gn, *ln;
                     59: {
                     60:        WORD fp, ap;
                     61:        extern WORD expv;
                     62:        extern int expsp;
                     63:        ADDR laddr();
                     64: 
                     65:        if (gn) {
                     66:                if (findrtn(gn) == 0)
                     67:                        error("function not found");
                     68:        }
                     69:        else {
                     70:                findsym((WORD)atow(rget(PC)), INSTSP);
                     71:                if (cursym == NULL)
                     72:                        error("function not found");
                     73:        }
                     74:        if (findframe(&fp, &ap) == 0)
                     75:                error("stack frame not found");
                     76:        if (ln == NULL) {
                     77:                expsp = 0;
                     78:                expv = fp;
                     79:                return;
                     80:        }
                     81:        while (localsym()) {
                     82:                if (strcmp(ln, cursym->y_name) != 0)
                     83:                        continue;
                     84:                expv = laddr(cursym, fp, ap);
                     85:                if (cursym->y_ltype == S_RSYM)
                     86:                        expsp = REGSP;
                     87:                else
                     88:                        expsp = NOSP;
                     89:                return;
                     90:        }
                     91:        error("bad local variable");
                     92:        /* NOTREACHED */
                     93: }
                     94: 
                     95: /*
                     96:  * print a stack traceback
                     97:  * give locals if possible
                     98:  */
                     99: 
                    100: ctrace(modif)
                    101: char modif;
                    102: {
                    103:        register ADDR fp, ap, callpc;
                    104:        register int narg;
                    105:        ADDR oap;
                    106:        register int fl;
                    107:        int tramp;
                    108: 
                    109:        if (adrflg) {
                    110:                fp = adrval;
                    111:                fl = stow(sget(fp + F_FLAGS, CORF|DATASP));
                    112:                if ((fl & FFCALLS) == 0)
                    113:                        ap = fp;        /* callg, can't figure out ap */
                    114:                else {
                    115:                        ap = adrval + F_REGS + SALIGN(fl);
                    116:                        fl &= FFREGS;
                    117:                        while (fl) {
                    118:                                if (fl & 1)
                    119:                                        ap += SZREG;
                    120:                                fl >>= 1;
                    121:                        }
                    122:                }
                    123:                callpc = atow(aget(fp + F_PC, CORF|DATASP));
                    124:        } else {
                    125:                ap = (ADDR)rtow(rget(AP));
                    126:                fp = (ADDR)rtow(rget(FP));
                    127:                callpc = (ADDR)rtow(rget(PC));
                    128:        }
                    129:        clrraddr();
                    130:        while (cntval--) {
                    131:                chkerr();
                    132:                tramp = 0;
                    133:                if (sigtramp(callpc)) {
                    134:                        printf("sigtramp(");
                    135:                        tramp++;
                    136:                } else {
                    137:                        findsym(callpc, INSTSP);
                    138:                        if (cursym == NULL)
                    139:                                printf("?(");
                    140:                        else if (strcmp("start", cursym->y_name) == 0)
                    141:                                break;
                    142:                        else
                    143:                                printf("%s(", cursym->y_name);
                    144:                }
                    145:                fl = ctow(cget(ap, CORF|DATASP));
                    146:                if ((narg = fl) > maxargs)
                    147:                        narg = maxargs;
                    148:                oap = ap;
                    149:                while (--fl, --narg >= 0) {
                    150:                        printf("%R", ltow(lget(ap += SZREG, CORF|DATASP)));
                    151:                        if (narg != 0)
                    152:                                printc(',');
                    153:                }
                    154:                if (fl >= 0)
                    155:                        printf(",...");
                    156:                printf(") from %R\n", callpc);
                    157:                if (modif == 'C')
                    158:                        locals(fp, oap);
                    159:                if (tramp)      /* hack */
                    160:                        callpc = atow(aget(fp + F_HACK, CORF|DATASP));
                    161:                else
                    162:                        callpc = atow(aget(fp + F_PC, CORF|DATASP));
                    163:                fl = stow(sget(fp + F_FLAGS, CORF|DATASP));
                    164:                setraddr(fl, fp);
                    165:                ap = atow(aget(fp + F_AP, CORF|DATASP));
                    166:                fp = atow(aget(fp + F_FP + SALIGN(fl), CORF|DATASP));
                    167:                if (fp == 0)
                    168:                        break;
                    169:                fl = stow(sget(fp + F_PSW, CORF|DATASP));
                    170:                if (BADPSW(fl))
                    171:                        break;
                    172:        }
                    173:        clrraddr();
                    174: }
                    175: 
                    176: static
                    177: locals(fp, ap)
                    178: ADDR fp, ap;
                    179: {
                    180:        WORD val;
                    181:        register int sp;
                    182:        ADDR laddr();
                    183: 
                    184:        while (localsym()) {
                    185:                sp = CORF | DATASP;
                    186:                if (cursym->y_ltype == S_RSYM)
                    187:                        sp = CORF | REGSP;
                    188:                val = ltow(lget(laddr(cursym, fp, ap), sp));
                    189:                if (errflg == 0)
                    190:                        printf("%8t%s/%10t%R\n", cursym->y_name, val);
                    191:                else {
                    192:                        printf("%8t%s/%10t?\n", cursym->y_name);
                    193:                        errflg = 0;
                    194:                }
                    195:        }
                    196: }
                    197: 
                    198: static ADDR
                    199: laddr(sp, fp, ap)
                    200: struct sym *sp;
                    201: ADDR fp, ap;
                    202: {
                    203: 
                    204:        switch (sp->y_ltype) {
                    205:        case S_STSYM:
                    206:                return (sp->y_value);
                    207: 
                    208:        case S_LSYM:
                    209:                return (fp - sp->y_value);
                    210: 
                    211:        case S_PSYM:
                    212:                return (ap + sp->y_value);
                    213: 
                    214:        case S_RSYM:
                    215:                return (sp->y_value * SZREG);
                    216:        }
                    217:        error("bad local symbol");
                    218:        /* NOTREACHED */
                    219: }
                    220: 
                    221: static int
                    222: findframe(fpp, app)
                    223: ADDR *fpp, *app;
                    224: {
                    225:        register ADDR fp, ap, pc;
                    226:        register int fl;
                    227:        struct sym *svcur;
                    228: 
                    229:        svcur = cursym;
                    230:        fp = rtow(rget(FP));
                    231:        ap = rtow(rget(AP));
                    232:        pc = rtow(rget(PC));
                    233:        if (errflg)
                    234:                return (0);
                    235:        clrraddr();
                    236:        for (;;) {
                    237:                findsym(pc, INSTSP);
                    238:                if (cursym == svcur)
                    239:                        break;
                    240:                if (cursym && strcmp(cursym->y_name, "start") == 0) {
                    241:                        clrraddr();
                    242:                        return (0);
                    243:                }
                    244:                fl = stow(sget((ADDR)fp + F_FLAGS, CORF|DATASP));
                    245:                setraddr(fl, fp);
                    246:                pc = atow(aget(fp + F_PC, CORF|DATASP));
                    247:                ap = atow(aget(fp + F_AP, CORF|DATASP));
                    248:                fp = atow(aget(fp + F_FP + SALIGN(fl), CORF|DATASP));
                    249:                /* sigtramp? */
                    250:                if (errflg) {
                    251:                        clrraddr();
                    252:                        return (0);
                    253:                }
                    254:        }
                    255:        *fpp = fp;
                    256:        *app = ap;
                    257:        return (1);
                    258: }
                    259: 
                    260: /*
                    261:  * set addresses for saved registers for this frame
                    262:  */
                    263: 
                    264: static
                    265: setraddr(mask, fp)
                    266: register int mask;
                    267: register ADDR fp;
                    268: {
                    269:        register int r;
                    270:        register int i;
                    271:        extern ADDR raddr[];
                    272: 
                    273:        mask &= FFREGS;
                    274:        for (r = 0, i = 0; mask; r++)
                    275:                if (mask & (1 << r)) {
                    276:                        if (MINREG <= r && r <= MAXREG)
                    277:                                raddr[r - MINREG] = fp + F_REGS +
                    278:                                        i * SZREG;
                    279:                        i++;
                    280:                        mask &=~ (1 << r);
                    281:                }
                    282: }
                    283: 
                    284: static
                    285: clrraddr()
                    286: {
                    287:        register int i;
                    288:        extern ADDR raddr[];
                    289: 
                    290:        for (i = 0; i <= MAXREG - MINREG; i++)
                    291:                raddr[i] = 0;
                    292: }

unix.superglobalmegacorp.com

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