xref: /linux/arch/powerpc/xmon/spr_access.S (revision 31cdd0c39c7544ced79da53aa0b7e989f3a39582)
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