|
|
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: {"fp", A6, 0},
21: {"a5", A5, 0},
22: {"a4", A4, 0},
23: {"a3", A3, 0},
24: {"a2", A2, 0},
25: {"a1", A1, 0},
26: {"a0", A0, 0},
27: {"d7", D7, 0},
28: {"d6", D6, 0},
29: {"d5", D5, 0},
30: {"d4", D4, 0},
31: {"d3", D3, 0},
32: {"d2", D2, 0},
33: {"d1", D1, 0},
34: {"d0", D0, 0},
35: {NULL}
36: };
37:
38: /*
39: * the following are needed only to
40: * make registers `addressable'
41: * which is needed only so we can
42: * examine register variables
43: */
44:
45: ADDR raddr[MAXREG - MINREG + 1];
46: int roffs[MAXREG - MINREG + 1] = {
47: #if NOTDEF
48: R0, R1, R2, R3, R4, R5
49: #else
50: 0
51: #endif
52: };
53:
54: /*
55: * get/put registers
56: * in our saved copies
57: */
58:
59: TREG
60: rget(r)
61: {
62: register struct reglist *rp;
63:
64: for (rp = reglist; rp->rname; rp++)
65: if (rp->roffs == r)
66: return (rp->rval);
67: error("panic: rget");
68: /* NOTREACHED */
69: }
70:
71: rput(r, v)
72: TREG v;
73: {
74: register struct reglist *rp;
75:
76: for (rp = reglist; rp->rname; rp++)
77: if (rp->roffs == r) {
78: rp->rval = v;
79: return;
80: }
81: error("panic: rput");
82: /* NOTREACHED */
83: }
84:
85: /*
86: * grab registers into saved copy
87: * should be called before looking at the process
88: */
89:
90: rsnarf()
91: {
92: register struct reglist *rp;
93:
94: for (rp = reglist+1; rp->rname; rp++) {
95: rp->rval = 0;
96: fget((ADDR)rp->roffs, CORF|UBLKSP, (char *)&rp->rval, SZREG);
97: }
98: reglist[0].rval = (WORD)sget((ADDR)PS, CORF|UBLKSP);
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 = reglist+1; rp->rname; rp++)
112: fput((ADDR)rp->roffs, CORF|UBLKSP, (char *)&rp->rval, SZREG);
113: sput((ADDR)PS, CORF|UBLKSP, (TSHORT)reglist[0].rval);
114: }
115:
116: /*
117: * print the registers
118: */
119:
120: printregs(c)
121: char c;
122: {
123: register struct reglist *rp;
124:
125: for (rp = reglist; rp->rname; rp++) {
126: if (rp->rsys == 1 && c != 'R')
127: continue;
128: printf("%-8R >%s\n", rtow(rp->rval), rp->rname);
129: }
130: printpc();
131: }
132:
133: /*
134: * translate a name to a magic register offset
135: * the latter useful in rget/rput
136: */
137:
138: int
139: rname(n)
140: char *n;
141: {
142: register struct reglist *rp;
143:
144: for (rp = reglist; rp->rname; rp++)
145: if (strcmp(n, rp->rname) == 0)
146: return (rp->roffs);
147: return (BADREG);
148: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.