regs.c (917B)
1 #include <u.h> 2 #include <libc.h> 3 #include <mach.h> 4 5 Regdesc* 6 regdesc(char *name) 7 { 8 Regdesc *r; 9 10 for(r=mach->reglist; r->name; r++) 11 if(strcmp(r->name, name) == 0) 12 return r; 13 return nil; 14 } 15 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 } 25 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 } 36 37 int 38 _uregrw(Regs *regs, char *name, u64int *u, int isr) 39 { 40 Regdesc *r; 41 uchar *ureg; 42 43 if(!isr){ 44 werrstr("cannot write registers"); 45 return -1; 46 } 47 48 if((r = regdesc(name)) == nil) 49 return -1; 50 ureg = ((UregRegs*)regs)->ureg + r->offset; 51 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 }