plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }