Annotation of researchv9/cmd/adb/sun/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 <sys/dir.h>
        !            10: #include <sys/user.h>
        !            11: #include "regs.h"
        !            12: #include "sym.h"
        !            13: #include "space.h"
        !            14: 
        !            15: int maxargs = 20;
        !            16: 
        !            17: /*
        !            18:  * mc68000 stack frame
        !            19:  */
        !            20: 
        !            21: #define        F_FP    0       /* saved fp */
        !            22: #define        F_PC    4       /* return pc */
        !            23: #define        F_ARG   8       /* first argument */
        !            24: #define        FP      AR6
        !            25: 
        !            26: /*
        !            27:  * is the saved psw reasonable?
        !            28:  * really just a last resort to find the end of the stack
        !            29:  */
        !            30: 
        !            31: #define        BADPSW(p)       (((p)&0xff00) != 0)
        !            32: 
        !            33: /*
        !            34:  * return an address for a local variable
        !            35:  * no register vars, unfortunately, as we can't provide an address
        !            36:  * gn is the procedure; ln the local name
        !            37:  */
        !            38: 
        !            39: localaddr(gn, ln)
        !            40: char *gn, *ln;
        !            41: {
        !            42:        WORD fp;
        !            43:        extern WORD expv;
        !            44:        extern int expsp;
        !            45:        ADDR laddr();
        !            46: 
        !            47:        if (gn) {
        !            48:                if (findrtn(gn) == 0)
        !            49:                        error("function not found");
        !            50:        }
        !            51:        else {
        !            52:                findsym((WORD)atow(rget(PC)), INSTSP);
        !            53:                if (cursym == NULL)
        !            54:                        error("function not found");
        !            55:        }
        !            56:        if (findframe(&fp) == 0)
        !            57:                error("stack frame not found");
        !            58:        if (ln == NULL) {
        !            59:                expsp = 0;
        !            60:                expv = fp;
        !            61:                return;
        !            62:        }
        !            63:        while (localsym()) {
        !            64:                if (strcmp(ln, cursym->y_name) != 0)
        !            65:                        continue;
        !            66:                expv = laddr(cursym, fp);
        !            67:                if (cursym->y_ltype == S_RSYM)
        !            68:                        expsp = REGSP;
        !            69:                else
        !            70:                        expsp = NOSP;
        !            71:                return;
        !            72:        }
        !            73:        error("bad local variable");
        !            74:        /* NOTREACHED */
        !            75: }
        !            76: 
        !            77: /*
        !            78:  * print a stack traceback
        !            79:  * give locals if possible
        !            80:  */
        !            81: 
        !            82: ctrace(modif)
        !            83: char modif;
        !            84: {
        !            85:        register ADDR fp, ap, callpc;
        !            86:        register int narg;
        !            87:        register int fl;
        !            88: 
        !            89:        if (adrflg) {
        !            90:                fp = adrval;
        !            91:                callpc = atow(aget(fp + F_PC, CORF|DATASP));
        !            92:        } else {
        !            93:                fp = (ADDR)rtow(rget(FP));
        !            94:                callpc = (ADDR)rtow(rget(PC));
        !            95:        }
        !            96:        clrraddr();
        !            97:        while (cntval--) {
        !            98:                chkerr();
        !            99:                findsym(callpc, INSTSP);
        !           100:                if (cursym == NULL)
        !           101:                        printf("?(");
        !           102:                else if (strcmp("start", cursym->y_name) == 0)
        !           103:                        break;
        !           104:                else
        !           105:                        printf("%s(", cursym->y_name);
        !           106:                fl = getnargs(fp);
        !           107:                if ((narg = fl) > maxargs)
        !           108:                        narg = maxargs;
        !           109:                ap = fp + F_ARG;
        !           110:                while (--fl, --narg >= 0) {
        !           111:                        printf("%R", ltow(lget(ap, CORF|DATASP)));
        !           112:                        ap += SZREG;
        !           113:                        if (narg != 0)
        !           114:                                printc(',');
        !           115:                }
        !           116:                if (fl >= 0)
        !           117:                        printf(",...");
        !           118:                printf(") from %R\n", callpc);
        !           119:                if (modif == 'C')
        !           120:                        locals(fp);
        !           121:                callpc = atow(aget(fp + F_PC, CORF|DATASP));
        !           122:                setraddr(fp);
        !           123:                fp = atow(aget(fp + F_FP, CORF|DATASP));
        !           124:                if (fp == 0)
        !           125:                        break;
        !           126:        }
        !           127:        clrraddr();
        !           128: }
        !           129: 
        !           130: /*
        !           131:  * Given a frame pointer determine the number of arguments.
        !           132:  * Unlike the vax, there is no argument pointer so we look at
        !           133:  * the instruction in the return pc and try to determine how
        !           134:  * may arguments are there by the resetting of the stack pointer.
        !           135:  */
        !           136: #define        LEASPSP         0x4fef          /* Lea sp@(xx),sp instruction */
        !           137: #define        ADDQWL          0x500f          /* Addqw #xx,sp instruction */
        !           138: 
        !           139: getnargs(fp)
        !           140: ADDR fp;
        !           141: {
        !           142:        ADDR callpc;
        !           143:        WORD instr, nargs;
        !           144: 
        !           145:        callpc = atow(aget(fp + F_PC, CORF|DATASP));
        !           146:        instr = stow(sget(callpc, SYMF|INSTSP));
        !           147:        if (instr == LEASPSP)
        !           148:                nargs = stow(sget(callpc + 2, SYMF|INSTSP));
        !           149:        else if ((instr & 0xf12f) == ADDQWL) {
        !           150:                nargs = (instr >> 9) & 7;
        !           151:                if (nargs == 0)
        !           152:                        nargs = 8;
        !           153:        }
        !           154:        else
        !           155:                nargs = 0;
        !           156:        return (nargs / SZREG);
        !           157: }
        !           158: 
        !           159: static
        !           160: locals(fp)
        !           161: ADDR fp;
        !           162: {
        !           163:        WORD val;
        !           164:        register int sp;
        !           165:        ADDR laddr();
        !           166: 
        !           167:        while (localsym()) {
        !           168:                sp = CORF | DATASP;
        !           169:                if (cursym->y_ltype == S_RSYM)
        !           170:                        sp = CORF | REGSP;
        !           171:                val = ltow(lget(laddr(cursym, fp), sp));
        !           172:                if (errflg == 0)
        !           173:                        printf("%8t%s/%10t%R\n", cursym->y_name, val);
        !           174:                else {
        !           175:                        printf("%8t%s/%10t?\n", cursym->y_name);
        !           176:                        errflg = 0;
        !           177:                }
        !           178:        }
        !           179: }
        !           180: 
        !           181: static ADDR
        !           182: laddr(sp, fp)
        !           183: struct sym *sp;
        !           184: ADDR fp;
        !           185: {
        !           186: 
        !           187:        switch (sp->y_ltype) {
        !           188:        case S_STSYM:
        !           189:                return (sp->y_value);
        !           190: 
        !           191:        case S_LSYM:
        !           192:                return (fp - sp->y_value);
        !           193: 
        !           194:        case S_PSYM:
        !           195:                return (fp + sp->y_value);
        !           196: 
        !           197:        case S_RSYM:
        !           198:                return (sp->y_value);
        !           199:        }
        !           200:        error("bad local symbol");
        !           201:        /* NOTREACHED */
        !           202: }
        !           203: 
        !           204: static int
        !           205: findframe(fpp)
        !           206: ADDR *fpp;
        !           207: {
        !           208:        register ADDR fp, pc;
        !           209:        struct sym *svcur;
        !           210: 
        !           211:        svcur = cursym;
        !           212:        fp = rtow(rget(FP));
        !           213:        pc = rtow(rget(PC));
        !           214:        if (errflg)
        !           215:                return (0);
        !           216:        clrraddr();
        !           217:        for (;;) {
        !           218:                findsym(pc, INSTSP);
        !           219:                if (cursym == svcur)
        !           220:                        break;
        !           221:                if (cursym && strcmp(cursym->y_name, "start") == 0) {
        !           222:                        clrraddr();
        !           223:                        return (0);
        !           224:                }
        !           225:                setraddr(fp);
        !           226:                pc = atow(aget(fp + F_PC, CORF|DATASP));
        !           227:                fp = atow(aget(fp + F_FP, CORF|DATASP));
        !           228:                if (errflg) {
        !           229:                        clrraddr();
        !           230:                        return (0);
        !           231:                }
        !           232:        }
        !           233:        *fpp = fp;
        !           234:        return (1);
        !           235: }
        !           236: 
        !           237: /*
        !           238:  * set addresses for saved registers for this frame
        !           239:  */
        !           240: 
        !           241: static
        !           242: setraddr(fp)
        !           243: register ADDR fp;
        !           244: {
        !           245:        register int r;
        !           246:        register int i;
        !           247:        extern ADDR raddr[];
        !           248: 
        !           249:        /* all wrong */
        !           250: }
        !           251: 
        !           252: static
        !           253: clrraddr()
        !           254: {
        !           255:        register int i;
        !           256:        extern ADDR raddr[];
        !           257: 
        !           258:        for (i = 0; i <= MAXREG - MINREG; i++)
        !           259:                raddr[i] = 0;
        !           260: }

unix.superglobalmegacorp.com

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