|
|
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.