1*31cdd0c3SPaul Mackerras#include <asm/ppc_asm.h> 2*31cdd0c3SPaul Mackerras 3*31cdd0c3SPaul Mackerras/* unsigned long xmon_mfspr(sprn, default_value) */ 4*31cdd0c3SPaul Mackerras_GLOBAL(xmon_mfspr) 5*31cdd0c3SPaul Mackerras ld r5, .Lmfspr_table@got(r2) 6*31cdd0c3SPaul Mackerras b xmon_mxspr 7*31cdd0c3SPaul Mackerras 8*31cdd0c3SPaul Mackerras/* void xmon_mtspr(sprn, new_value) */ 9*31cdd0c3SPaul Mackerras_GLOBAL(xmon_mtspr) 10*31cdd0c3SPaul Mackerras ld r5, .Lmtspr_table@got(r2) 11*31cdd0c3SPaul Mackerras b xmon_mxspr 12*31cdd0c3SPaul Mackerras 13*31cdd0c3SPaul Mackerras/* 14*31cdd0c3SPaul Mackerras * r3 = sprn 15*31cdd0c3SPaul Mackerras * r4 = default or new value 16*31cdd0c3SPaul Mackerras * r5 = table base 17*31cdd0c3SPaul Mackerras */ 18*31cdd0c3SPaul Mackerrasxmon_mxspr: 19*31cdd0c3SPaul Mackerras /* 20*31cdd0c3SPaul Mackerras * To index into the table of mxsprs we need: 21*31cdd0c3SPaul Mackerras * i = (sprn & 0x3ff) * 8 22*31cdd0c3SPaul Mackerras * or using rwlinm: 23*31cdd0c3SPaul Mackerras * i = (sprn << 3) & (0x3ff << 3) 24*31cdd0c3SPaul Mackerras */ 25*31cdd0c3SPaul Mackerras rlwinm r3, r3, 3, 0x3ff << 3 26*31cdd0c3SPaul Mackerras add r5, r5, r3 27*31cdd0c3SPaul Mackerras mtctr r5 28*31cdd0c3SPaul Mackerras mr r3, r4 /* put default_value in r3 for mfspr */ 29*31cdd0c3SPaul Mackerras bctr 30*31cdd0c3SPaul Mackerras 31*31cdd0c3SPaul Mackerras.Lmfspr_table: 32*31cdd0c3SPaul Mackerras spr = 0 33*31cdd0c3SPaul Mackerras .rept 1024 34*31cdd0c3SPaul Mackerras mfspr r3, spr 35*31cdd0c3SPaul Mackerras blr 36*31cdd0c3SPaul Mackerras spr = spr + 1 37*31cdd0c3SPaul Mackerras .endr 38*31cdd0c3SPaul Mackerras 39*31cdd0c3SPaul Mackerras.Lmtspr_table: 40*31cdd0c3SPaul Mackerras spr = 0 41*31cdd0c3SPaul Mackerras .rept 1024 42*31cdd0c3SPaul Mackerras mtspr spr, r4 43*31cdd0c3SPaul Mackerras blr 44*31cdd0c3SPaul Mackerras spr = spr + 1 45*31cdd0c3SPaul Mackerras .endr 46