1 /*
2 * code to keep track of registers
3 */
4
5 #include "defs.h"
6 #include "fns.h"
7
8 /*
9 * translate a name to a magic register offset
10 */
11 Reglist*
rname(char * name)12 rname(char *name)
13 {
14 Reglist *rp;
15
16 for (rp = mach->reglist; rp->rname; rp++)
17 if (strcmp(name, rp->rname) == 0)
18 return rp;
19 return 0;
20 }
21
22 static uvlong
getreg(Map * map,Reglist * rp)23 getreg(Map *map, Reglist *rp)
24 {
25 uvlong v;
26 ulong w;
27 ushort s;
28 int ret;
29
30 v = 0;
31 ret = 0;
32 switch (rp->rformat)
33 {
34 case 'x':
35 ret = get2(map, rp->roffs, &s);
36 v = s;
37 break;
38 case 'f':
39 case 'X':
40 ret = get4(map, rp->roffs, &w);
41 v = w;
42 break;
43 case 'F':
44 case 'W':
45 case 'Y':
46 ret = get8(map, rp->roffs, &v);
47 break;
48 default:
49 werrstr("can't retrieve register %s", rp->rname);
50 error("%r");
51 }
52 if (ret < 0) {
53 werrstr("Register %s: %r", rp->rname);
54 error("%r");
55 }
56 return v;
57 }
58
59 uvlong
rget(Map * map,char * name)60 rget(Map *map, char *name)
61 {
62 Reglist *rp;
63
64 rp = rname(name);
65 if (!rp)
66 error("invalid register name");
67 return getreg(map, rp);
68 }
69
70 void
rput(Map * map,char * name,vlong v)71 rput(Map *map, char *name, vlong v)
72 {
73 Reglist *rp;
74 int ret;
75
76 rp = rname(name);
77 if (!rp)
78 error("invalid register name");
79 if (rp->rflags & RRDONLY)
80 error("register is read-only");
81 switch (rp->rformat)
82 {
83 case 'x':
84 ret = put2(map, rp->roffs, (ushort) v);
85 break;
86 case 'X':
87 case 'f':
88 case 'F':
89 ret = put4(map, rp->roffs, (long) v);
90 break;
91 case 'Y':
92 ret = put8(map, rp->roffs, v);
93 break;
94 default:
95 ret = -1;
96 }
97 if (ret < 0)
98 error("can't write register");
99 }
100 /*
101 * print the registers
102 */
103 void
printregs(int c)104 printregs(int c)
105 {
106 Reglist *rp;
107 int i;
108 uvlong v;
109
110 for (i = 1, rp = mach->reglist; rp->rname; rp++, i++) {
111 if ((rp->rflags & RFLT)) {
112 if (c != 'R')
113 continue;
114 if (rp->rformat == '8' || rp->rformat == '3')
115 continue;
116 }
117 v = getreg(cormap, rp);
118 if(rp->rformat == 'Y')
119 dprint("%-8s %-20#llux", rp->rname, v);
120 else
121 dprint("%-8s %-12#lux", rp->rname, (ulong)v);
122 if ((i % 3) == 0) {
123 dprint("\n");
124 i = 0;
125 }
126 }
127 if (i != 1)
128 dprint("\n");
129 dprint ("%s\n", machdata->excep(cormap, rget));
130 printpc();
131 }
132