|
|
1.1 root 1: /*
2: * code to keep track of registers
3: */
4:
5: #include "defs.h"
6: #include "regs.h"
7: #include <sys/param.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: fget((ADDR)rp->roffs, CORF|UBLKSP, (char *)&rp->rval, sizeof(rp->rval));
99: }
100:
101: /*
102: * put registers back
103: */
104:
105: rrest()
106: {
107: register struct reglist *rp;
108:
109: if (pid == 0)
110: return;
111: for (rp = ®list[FW]; rp->rname; rp++)
112: fput((ADDR)rp->roffs, CORF|UBLKSP, (char *)&rp->rval, sizeof(rp->rval));
113: }
114:
115: /*
116: * print the registers
117: */
118:
119: printregs(c)
120: char c;
121: {
122: register struct reglist *rp;
123:
124: for (rp = reglist; rp->rname; rp++) {
125: if (rp->rsys == 1 && c != 'R')
126: continue;
127: printf("%s%6t%R %16t", rp->rname, rtow(rp->rval));
128: valpr(rtow(rp->rval), (rp->roffs == PC) ? INSTSP : DATASP);
129: printc(EOR);
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.