diff options
author | rsc <devnull@localhost> | 2004-04-19 19:29:25 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-04-19 19:29:25 +0000 |
commit | a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46 (patch) | |
tree | 59a0e921597e5aa53e83d487c16727a7bf01547a /src/libmach/regs.c | |
parent | 0e3cc9f456ea49919459bf1164d0c8309a6134fa (diff) | |
download | plan9port-a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46.tar.gz plan9port-a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46.tar.bz2 plan9port-a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46.zip |
libmach
Diffstat (limited to 'src/libmach/regs.c')
-rw-r--r-- | src/libmach/regs.c | 59 |
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; +} + |