xref: /plan9/sys/src/cmd/db/regs.c (revision 4de34a7edde43207e841ec91ecd12e6cf5f5ebe7)
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