Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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*
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
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
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
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
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
}