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