aboutsummaryrefslogtreecommitdiff
path: root/src/libmach/regs.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-04-19 19:29:25 +0000
committerrsc <devnull@localhost>2004-04-19 19:29:25 +0000
commita84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46 (patch)
tree59a0e921597e5aa53e83d487c16727a7bf01547a /src/libmach/regs.c
parent0e3cc9f456ea49919459bf1164d0c8309a6134fa (diff)
downloadplan9port-a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46.tar.gz
plan9port-a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46.tar.bz2
plan9port-a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46.zip
libmach
Diffstat (limited to 'src/libmach/regs.c')
-rw-r--r--src/libmach/regs.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/libmach/regs.c b/src/libmach/regs.c
new file mode 100644
index 00000000..43c04786
--- /dev/null
+++ b/src/libmach/regs.c
@@ -0,0 +1,59 @@
+#include <u.h>
+#include <libc.h>
+#include <mach.h>
+
+int
+rput(Regs *regs, char *name, ulong u)
+{
+ if(regs == nil){
+ werrstr("registers not mapped");
+ return -1;
+ }
+ return regs->rw(regs, name, &u, 0);
+}
+
+int
+rget(Regs *regs, char *name, ulong *u)
+{
+ if(regs == nil){
+ *u = ~(ulong)0;
+ werrstr("registers not mapped");
+ return -1;
+ }
+ return regs->rw(regs, name, u, 1);
+}
+
+int
+_uregrw(Regs *regs, char *name, ulong *u, int isr)
+{
+ Regdesc *r;
+ uchar *ureg;
+
+ if(!isr){
+ werrstr("cannot write registers");
+ return -1;
+ }
+
+ if((r = regdesc(name)) == nil)
+ return -1;
+ ureg = ((UregRegs*)regs)->ureg + r->offset;
+
+ switch(r->format){
+ default:
+ case 'X':
+ *u = mach->swap4(*(u32int*)ureg);
+ return 0;
+ }
+}
+
+Regdesc*
+regdesc(char *name)
+{
+ Regdesc *r;
+
+ for(r=mach->reglist; r->name; r++)
+ if(strcmp(r->name, name) == 0)
+ return r;
+ return nil;
+}
+