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