|
|
1.1 ! root 1: /* ! 2: * code to keep track of registers ! 3: */ ! 4: ! 5: #include "defs.h" ! 6: #include "space.h" ! 7: #include "regs.h" ! 8: #include "machine.h" ! 9: #include <sys/param.h> ! 10: #include <sys/dir.h> ! 11: #include <sys/user.h> ! 12: ! 13: #define UOFF(x) (ADDR)(&((struct user *)0)->x) ! 14: ! 15: struct reglist { ! 16: char *rname; ! 17: short roffs; ! 18: short rsys; ! 19: TREG rval; ! 20: }; ! 21: ! 22: struct reglist reglist[] = { ! 23: #define FW 0 /* first register we may write */ ! 24: {"modpsr", MODPSR, 0}, ! 25: {"pc", PC, 0}, ! 26: {"sp", SP, 0}, ! 27: {"fp", FP, 0}, ! 28: {"r7", R7, 0}, ! 29: {"r6", R6, 0}, ! 30: {"r5", R5, 0}, ! 31: {"r4", R4, 0}, ! 32: {"r3", R3, 0}, ! 33: {"r2", R2, 0}, ! 34: {"r1", R1, 0}, ! 35: {"r0", R0, 0}, ! 36: {NULL} ! 37: }; ! 38: ! 39: /* ! 40: * the following are needed only to ! 41: * make registers `addressable' ! 42: * which is needed only so we can ! 43: * examine register variables ! 44: */ ! 45: ! 46: ADDR raddr[MAXREG - MINREG + 1]; ! 47: int roffs[MAXREG - MINREG + 1] = { ! 48: R0, R1, R2, R3, R4, R5, R6, R7, ! 49: }; ! 50: ! 51: /* ! 52: * get/put registers ! 53: * in our saved copies ! 54: */ ! 55: ! 56: TREG ! 57: rget(r) ! 58: { ! 59: register struct reglist *rp; ! 60: ! 61: for (rp = reglist; rp->rname; rp++) ! 62: if (rp->roffs == r) ! 63: return (rp->rval); ! 64: error("panic: rget"); ! 65: /* NOTREACHED */ ! 66: } ! 67: ! 68: rput(r, v) ! 69: TREG v; ! 70: { ! 71: register struct reglist *rp; ! 72: ! 73: for (rp = reglist; rp->rname; rp++) ! 74: if (rp->roffs == r) { ! 75: rp->rval = v; ! 76: return; ! 77: } ! 78: error("panic: rput"); ! 79: /* NOTREACHED */ ! 80: } ! 81: ! 82: /* ! 83: * grab registers into saved copy ! 84: * should be called before looking at the process ! 85: */ ! 86: ! 87: rsnarf() ! 88: { ! 89: register struct reglist *rp; ! 90: register ADDR base; ! 91: ! 92: base = (ADDR)atow(aget(UOFF(u_ar0), CORF|UBLKSP)); ! 93: if (base == 0) ! 94: return; ! 95: base -= USRBLK; ! 96: for (rp = reglist; rp->rname; rp++) { ! 97: rp->rval = 0; ! 98: fget((ADDR)(rp->roffs*SZREG+base), ! 99: CORF|UBLKSP, (char *)&rp->rval, SZREG); ! 100: } ! 101: } ! 102: ! 103: /* ! 104: * put registers back ! 105: */ ! 106: ! 107: rrest() ! 108: { ! 109: register struct reglist *rp; ! 110: register ADDR base; ! 111: ! 112: if (pid == 0) ! 113: return; ! 114: base = (ADDR)atow(aget(UOFF(u_ar0), CORF|UBLKSP)); ! 115: if (base == 0) ! 116: return; ! 117: base -= USRBLK; ! 118: for (rp = ®list[FW]; rp->rname; rp++) ! 119: fput((ADDR)(rp->roffs*SZREG+base), ! 120: CORF|UBLKSP, (char *)&rp->rval, SZREG); ! 121: } ! 122: ! 123: /* ! 124: * print the registers ! 125: */ ! 126: ! 127: printregs(c) ! 128: char c; ! 129: { ! 130: register struct reglist *rp; ! 131: ! 132: for (rp = reglist; rp->rname; rp++) { ! 133: if (rp->rsys == 1 && c != 'R') ! 134: continue; ! 135: printf("%s%6t%R %16t", rp->rname, rtow(rp->rval)); ! 136: valpr(rtow(rp->rval), (rp->roffs == PC) ? INSTSP : DATASP); ! 137: printc(EOR); ! 138: } ! 139: printpc(); ! 140: } ! 141: ! 142: /* ! 143: * translate a name to a magic register offset ! 144: * the latter useful in rget/rput ! 145: */ ! 146: ! 147: int ! 148: rname(n) ! 149: char *n; ! 150: { ! 151: register struct reglist *rp; ! 152: ! 153: for (rp = reglist; rp->rname; rp++) ! 154: if (strcmp(n, rp->rname) == 0) ! 155: return (rp->roffs); ! 156: return (BADREG); ! 157: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.