Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <mach.h>
5 Regdesc*
6 regdesc(char *name)
7 {
8 Regdesc *r;
10 for(r=mach->reglist; r->name; r++)
11 if(strcmp(r->name, name) == 0)
12 return r;
13 return nil;
14 }
16 int
17 rput(Regs *regs, char *name, u64int u)
18 {
19 if(regs == nil){
20 werrstr("registers not mapped");
21 return -1;
22 }
23 return regs->rw(regs, name, &u, 0);
24 }
26 int
27 rget(Regs *regs, char *name, u64int *u)
28 {
29 if(regs == nil){
30 *u = ~(u64int)0;
31 werrstr("registers not mapped");
32 return -1;
33 }
34 return regs->rw(regs, name, u, 1);
35 }
37 int
38 _uregrw(Regs *regs, char *name, u64int *u, int isr)
39 {
40 Regdesc *r;
41 uchar *ureg;
43 if(!isr){
44 werrstr("cannot write registers");
45 return -1;
46 }
48 if((r = regdesc(name)) == nil)
49 return -1;
50 ureg = ((UregRegs*)regs)->ureg + r->offset;
52 switch(r->format){
53 default:
54 case 'X':
55 *u = mach->swap4(*(u32int*)ureg);
56 return 0;
57 case 'Y':
58 *u = mach->swap8(*(u64int*)ureg);
59 return 0;
60 }
61 }