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

unix.superglobalmegacorp.com

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