|
|
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: #include <sys/dir.h> ! 10: #include <sys/user.h> ! 11: ! 12: struct reglist { ! 13: char *rname; ! 14: short roffs; ! 15: TREG rval; ! 16: }; ! 17: ! 18: struct reglist reglist[] = { ! 19: {"pc", PC}, ! 20: {"ps", PS}, ! 21: {"sp", AR7}, ! 22: {"a6", AR6}, ! 23: {"a5", AR5}, ! 24: {"a4", AR4}, ! 25: {"a3", AR3}, ! 26: {"a2", AR2}, ! 27: {"a1", AR1}, ! 28: {"a0", AR0}, ! 29: {"d7", R7}, ! 30: {"d6", R6}, ! 31: {"d5", R5}, ! 32: {"d4", R4}, ! 33: {"d3", R3}, ! 34: {"d2", R2}, ! 35: {"d1", R1}, ! 36: {"d0", R0}, ! 37: {NULL} ! 38: }; ! 39: ! 40: /* ! 41: * the following are needed only to ! 42: * make registers `addressable' ! 43: * which is needed only so we can ! 44: * examine register variables ! 45: */ ! 46: ! 47: ADDR raddr[MAXREG - MINREG + 1]; ! 48: int roffs[MAXREG - MINREG + 1] = { ! 49: R0, R1, R2, R3, R4, R5, R6, R7, AR0, AR1, AR2, AR3, AR4, AR5, AR6, ! 50: SP, PS, PC ! 51: }; ! 52: ! 53: /* ! 54: * get/put registers ! 55: * in our saved copies ! 56: */ ! 57: ! 58: TREG ! 59: rget(r) ! 60: { ! 61: register struct reglist *rp; ! 62: ! 63: for (rp = reglist; rp->rname; rp++) ! 64: if (rp->roffs == r) ! 65: return (rp->rval); ! 66: error("panic: rget"); ! 67: /* NOTREACHED */ ! 68: } ! 69: ! 70: rput(r, v) ! 71: TREG v; ! 72: { ! 73: register struct reglist *rp; ! 74: ! 75: for (rp = reglist; rp->rname; rp++) ! 76: if (rp->roffs == r) { ! 77: rp->rval = v; ! 78: return; ! 79: } ! 80: error("panic: rput"); ! 81: /* NOTREACHED */ ! 82: } ! 83: ! 84: /* ! 85: * grab registers into saved copy ! 86: * should be called before looking at the process ! 87: */ ! 88: ! 89: rsnarf() ! 90: { ! 91: register struct reglist *rp; ! 92: struct user u; ! 93: int *ip; ! 94: ! 95: fget((ADDR)0, CORF|UBLKSP, (char *)&u, sizeof(u)); ! 96: ip = (int *)(((int)u.u_ar0) & 0x1fff); ! 97: for (rp = reglist; rp->rname; rp++) { ! 98: rp->rval = 0; ! 99: fget((ADDR)&ip[rp->roffs], CORF|UBLKSP, ! 100: (char *)&rp->rval, SZREG); ! 101: } ! 102: } ! 103: ! 104: /* ! 105: * put registers back ! 106: */ ! 107: ! 108: rrest() ! 109: { ! 110: register struct reglist *rp; ! 111: struct user u; ! 112: int *ip; ! 113: ! 114: if (pid == 0) ! 115: return; ! 116: fget((ADDR)0, CORF|UBLKSP, (char *)&u, sizeof(u)); ! 117: ip = (int *)(((int)u.u_ar0) & 0x1fff); ! 118: for (rp = reglist; rp->rname; rp++) ! 119: fput((ADDR)&ip[rp->roffs], CORF|UBLKSP, ! 120: (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: int tab = 0; ! 132: ! 133: for (rp = reglist; rp->rname; rp++) { ! 134: printf("%-8R >%s", rtow(rp->rval), rp->rname); ! 135: tab = !tab; ! 136: if (tab) ! 137: printf("\t"); ! 138: else ! 139: printf("\n"); ! 140: } ! 141: if (tab) ! 142: printf("\n"); ! 143: printpc(); ! 144: } ! 145: ! 146: /* ! 147: * translate a name to a magic register offset ! 148: * the latter useful in rget/rput ! 149: */ ! 150: ! 151: int ! 152: rname(n) ! 153: char *n; ! 154: { ! 155: register struct reglist *rp; ! 156: ! 157: for (rp = reglist; rp->rname; rp++) ! 158: if (strcmp(n, rp->rname) == 0) ! 159: return (rp->roffs); ! 160: return (BADREG); ! 161: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.