xref: /plan9/sys/src/cmd/db/regs.c (revision 4de34a7edde43207e841ec91ecd12e6cf5f5ebe7)
13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier  * code to keep track of registers
33e12c5d1SDavid du Colombier  */
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier #include "defs.h"
63e12c5d1SDavid du Colombier #include "fns.h"
73e12c5d1SDavid du Colombier 
83e12c5d1SDavid du Colombier /*
9219b2ee8SDavid du Colombier  * translate a name to a magic register offset
103e12c5d1SDavid du Colombier  */
11219b2ee8SDavid du Colombier Reglist*
rname(char * name)12219b2ee8SDavid du Colombier rname(char *name)
133e12c5d1SDavid du Colombier {
143e12c5d1SDavid du Colombier 	Reglist *rp;
153e12c5d1SDavid du Colombier 
16219b2ee8SDavid du Colombier 	for (rp = mach->reglist; rp->rname; rp++)
17219b2ee8SDavid du Colombier 		if (strcmp(name, rp->rname) == 0)
18219b2ee8SDavid du Colombier 			return rp;
19219b2ee8SDavid du Colombier 	return 0;
203e12c5d1SDavid du Colombier }
21219b2ee8SDavid du Colombier 
22*4de34a7eSDavid du Colombier static uvlong
getreg(Map * map,Reglist * rp)23219b2ee8SDavid du Colombier getreg(Map *map, Reglist *rp)
24219b2ee8SDavid du Colombier {
25*4de34a7eSDavid du Colombier 	uvlong v;
26*4de34a7eSDavid du Colombier 	ulong w;
27*4de34a7eSDavid du Colombier 	ushort s;
28219b2ee8SDavid du Colombier 	int ret;
29219b2ee8SDavid du Colombier 
307dd7cddfSDavid du Colombier 	v = 0;
31219b2ee8SDavid du Colombier 	ret = 0;
32219b2ee8SDavid du Colombier 	switch (rp->rformat)
33219b2ee8SDavid du Colombier 	{
34219b2ee8SDavid du Colombier 	case 'x':
35*4de34a7eSDavid du Colombier 		ret = get2(map, rp->roffs, &s);
36*4de34a7eSDavid du Colombier 		v = s;
37219b2ee8SDavid du Colombier 		break;
38219b2ee8SDavid du Colombier 	case 'f':
397dd7cddfSDavid du Colombier 	case 'X':
40*4de34a7eSDavid du Colombier 		ret = get4(map, rp->roffs, &w);
417dd7cddfSDavid du Colombier 		v = w;
427dd7cddfSDavid du Colombier 		break;
43219b2ee8SDavid du Colombier 	case 'F':
447dd7cddfSDavid du Colombier 	case 'W':
457dd7cddfSDavid du Colombier 	case 'Y':
467dd7cddfSDavid du Colombier 		ret = get8(map, rp->roffs, &v);
47219b2ee8SDavid du Colombier 		break;
48219b2ee8SDavid du Colombier 	default:
49219b2ee8SDavid du Colombier 		werrstr("can't retrieve register %s", rp->rname);
50219b2ee8SDavid du Colombier 		error("%r");
51219b2ee8SDavid du Colombier 	}
52219b2ee8SDavid du Colombier 	if (ret < 0) {
53219b2ee8SDavid du Colombier 		werrstr("Register %s: %r", rp->rname);
54219b2ee8SDavid du Colombier 		error("%r");
55219b2ee8SDavid du Colombier 	}
567dd7cddfSDavid du Colombier 	return v;
57219b2ee8SDavid du Colombier }
58219b2ee8SDavid du Colombier 
59*4de34a7eSDavid du Colombier uvlong
rget(Map * map,char * name)60219b2ee8SDavid du Colombier rget(Map *map, char *name)
61219b2ee8SDavid du Colombier {
62219b2ee8SDavid du Colombier 	Reglist *rp;
63219b2ee8SDavid du Colombier 
64219b2ee8SDavid du Colombier 	rp = rname(name);
65219b2ee8SDavid du Colombier 	if (!rp)
66219b2ee8SDavid du Colombier 		error("invalid register name");
67219b2ee8SDavid du Colombier 	return getreg(map, rp);
683e12c5d1SDavid du Colombier }
693e12c5d1SDavid du Colombier 
703e12c5d1SDavid du Colombier void
rput(Map * map,char * name,vlong v)717dd7cddfSDavid du Colombier rput(Map *map, char *name, vlong v)
72219b2ee8SDavid du Colombier {
73219b2ee8SDavid du Colombier 	Reglist *rp;
74219b2ee8SDavid du Colombier 	int ret;
75219b2ee8SDavid du Colombier 
76219b2ee8SDavid du Colombier 	rp = rname(name);
77219b2ee8SDavid du Colombier 	if (!rp)
78219b2ee8SDavid du Colombier 		error("invalid register name");
79219b2ee8SDavid du Colombier 	if (rp->rflags & RRDONLY)
80219b2ee8SDavid du Colombier 		error("register is read-only");
81219b2ee8SDavid du Colombier 	switch (rp->rformat)
82219b2ee8SDavid du Colombier 	{
83219b2ee8SDavid du Colombier 	case 'x':
847dd7cddfSDavid du Colombier 		ret = put2(map, rp->roffs, (ushort) v);
85219b2ee8SDavid du Colombier 		break;
86219b2ee8SDavid du Colombier 	case 'X':
87219b2ee8SDavid du Colombier 	case 'f':
88219b2ee8SDavid du Colombier 	case 'F':
897dd7cddfSDavid du Colombier 		ret = put4(map, rp->roffs, (long) v);
907dd7cddfSDavid du Colombier 		break;
917dd7cddfSDavid du Colombier 	case 'Y':
927dd7cddfSDavid du Colombier 		ret = put8(map, rp->roffs, v);
93219b2ee8SDavid du Colombier 		break;
94219b2ee8SDavid du Colombier 	default:
95219b2ee8SDavid du Colombier 		ret = -1;
96219b2ee8SDavid du Colombier 	}
97219b2ee8SDavid du Colombier 	if (ret < 0)
98219b2ee8SDavid du Colombier 		error("can't write register");
99219b2ee8SDavid du Colombier }
1003e12c5d1SDavid du Colombier /*
1013e12c5d1SDavid du Colombier  * print the registers
1023e12c5d1SDavid du Colombier  */
1033e12c5d1SDavid du Colombier void
printregs(int c)1043e12c5d1SDavid du Colombier printregs(int c)
1053e12c5d1SDavid du Colombier {
1063e12c5d1SDavid du Colombier 	Reglist *rp;
1073e12c5d1SDavid du Colombier 	int i;
108*4de34a7eSDavid du Colombier 	uvlong v;
1093e12c5d1SDavid du Colombier 
1103e12c5d1SDavid du Colombier 	for (i = 1, rp = mach->reglist; rp->rname; rp++, i++) {
111219b2ee8SDavid du Colombier 		if ((rp->rflags & RFLT)) {
112219b2ee8SDavid du Colombier 			if (c != 'R')
1133e12c5d1SDavid du Colombier 				continue;
114219b2ee8SDavid du Colombier 			if (rp->rformat == '8' || rp->rformat == '3')
115219b2ee8SDavid du Colombier 				continue;
116219b2ee8SDavid du Colombier 		}
117*4de34a7eSDavid du Colombier 		v = getreg(cormap, rp);
1187dd7cddfSDavid du Colombier 		if(rp->rformat == 'Y')
119*4de34a7eSDavid du Colombier 			dprint("%-8s %-20#llux", rp->rname, v);
1207dd7cddfSDavid du Colombier 		else
121*4de34a7eSDavid du Colombier 			dprint("%-8s %-12#lux", rp->rname, (ulong)v);
1223e12c5d1SDavid du Colombier 		if ((i % 3) == 0) {
1233e12c5d1SDavid du Colombier 			dprint("\n");
1243e12c5d1SDavid du Colombier 			i = 0;
1253e12c5d1SDavid du Colombier 		}
1263e12c5d1SDavid du Colombier 	}
1273e12c5d1SDavid du Colombier 	if (i != 1)
1283e12c5d1SDavid du Colombier 		dprint("\n");
129219b2ee8SDavid du Colombier 	dprint ("%s\n", machdata->excep(cormap, rget));
1303e12c5d1SDavid du Colombier 	printpc();
1313e12c5d1SDavid du Colombier }
132