|
|
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: {"ps", PS, 0},
18: {"pc", PC, 0},
19: {"sp", SP, 0},
20: {"r5", R5, 0},
21: {"r4", R4, 0},
22: {"r3", R3, 0},
23: {"r2", R2, 0},
24: {"r1", R1, 0},
25: {"r0", R0, 0},
26: {NULL}
27: };
28:
29: /*
30: * the following are needed only to
31: * make registers `addressable'
32: * which is needed only so we can
33: * examine register variables
34: */
35:
36: ADDR raddr[MAXREG - MINREG + 1];
37: int roffs[MAXREG - MINREG + 1] = {
38: #if NOTDEF
39: R0, R1, R2, R3, R4, R5
40: #else
41: 0
42: #endif
43: };
44:
45: /*
46: * get/put registers
47: * in our saved copies
48: */
49:
50: TREG
51: rget(r)
52: {
53: register struct reglist *rp;
54:
55: for (rp = reglist; rp->rname; rp++)
56: if (rp->roffs == r)
57: return (rp->rval);
58: error("panic: rget");
59: /* NOTREACHED */
60: }
61:
62: rput(r, v)
63: TREG v;
64: {
65: register struct reglist *rp;
66:
67: for (rp = reglist; rp->rname; rp++)
68: if (rp->roffs == r) {
69: rp->rval = v;
70: return;
71: }
72: error("panic: rput");
73: /* NOTREACHED */
74: }
75:
76: /*
77: * grab registers into saved copy
78: * should be called before looking at the process
79: */
80:
81: rsnarf()
82: {
83: register struct reglist *rp;
84:
85: for (rp = reglist; rp->rname; rp++) {
86: rp->rval = 0;
87: fget((ADDR)rp->roffs, CORF|UBLKSP, (char *)&rp->rval, SZREG);
88: }
89: }
90:
91: /*
92: * put registers back
93: */
94:
95: rrest()
96: {
97: register struct reglist *rp;
98:
99: if (pid == 0)
100: return;
101: for (rp = ®list[0]; rp->rname; rp++)
102: fput((ADDR)rp->roffs, CORF|UBLKSP, (char *)&rp->rval, SZREG);
103: }
104:
105: /*
106: * print the registers
107: */
108:
109: printregs(c)
110: char c;
111: {
112: register struct reglist *rp;
113:
114: for (rp = reglist; rp->rname; rp++) {
115: if (rp->rsys == 1 && c != 'R')
116: continue;
117: printf("%-8R >%s\n", rtow(rp->rval), rp->rname);
118: }
119: printpc();
120: }
121:
122: /*
123: * translate a name to a magic register offset
124: * the latter useful in rget/rput
125: */
126:
127: int
128: rname(n)
129: char *n;
130: {
131: register struct reglist *rp;
132:
133: for (rp = reglist; rp->rname; rp++)
134: if (strcmp(n, rp->rname) == 0)
135: return (rp->roffs);
136: return (BADREG);
137: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.