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

unix.superglobalmegacorp.com

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