18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#include <asm/ppc_asm.h>
38c2ecf20Sopenharmony_ci#include <asm/asm-compat.h>
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci/* unsigned long xmon_mfspr(sprn, default_value) */
68c2ecf20Sopenharmony_ci_GLOBAL(xmon_mfspr)
78c2ecf20Sopenharmony_ci	PPC_LL	r5, .Lmfspr_table@got(r2)
88c2ecf20Sopenharmony_ci	b	xmon_mxspr
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci/* void xmon_mtspr(sprn, new_value) */
118c2ecf20Sopenharmony_ci_GLOBAL(xmon_mtspr)
128c2ecf20Sopenharmony_ci	PPC_LL	r5, .Lmtspr_table@got(r2)
138c2ecf20Sopenharmony_ci	b	xmon_mxspr
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci/*
168c2ecf20Sopenharmony_ci * r3 = sprn
178c2ecf20Sopenharmony_ci * r4 = default or new value
188c2ecf20Sopenharmony_ci * r5 = table base
198c2ecf20Sopenharmony_ci */
208c2ecf20Sopenharmony_cixmon_mxspr:
218c2ecf20Sopenharmony_ci	/*
228c2ecf20Sopenharmony_ci	 * To index into the table of mxsprs we need:
238c2ecf20Sopenharmony_ci	 *  i = (sprn & 0x3ff) * 8
248c2ecf20Sopenharmony_ci	 * or using rwlinm:
258c2ecf20Sopenharmony_ci	 *  i = (sprn << 3) & (0x3ff << 3)
268c2ecf20Sopenharmony_ci	 */
278c2ecf20Sopenharmony_ci	rlwinm	r3, r3, 3, 0x3ff << 3
288c2ecf20Sopenharmony_ci	add	r5, r5, r3
298c2ecf20Sopenharmony_ci	mtctr	r5
308c2ecf20Sopenharmony_ci	mr	r3, r4 /* put default_value in r3 for mfspr */
318c2ecf20Sopenharmony_ci	bctr
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci.Lmfspr_table:
348c2ecf20Sopenharmony_ci	spr = 0
358c2ecf20Sopenharmony_ci	.rept	1024
368c2ecf20Sopenharmony_ci	mfspr	r3, spr
378c2ecf20Sopenharmony_ci	blr
388c2ecf20Sopenharmony_ci	spr = spr + 1
398c2ecf20Sopenharmony_ci	.endr
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci.Lmtspr_table:
428c2ecf20Sopenharmony_ci	spr = 0
438c2ecf20Sopenharmony_ci	.rept	1024
448c2ecf20Sopenharmony_ci	mtspr	spr, r4
458c2ecf20Sopenharmony_ci	blr
468c2ecf20Sopenharmony_ci	spr = spr + 1
478c2ecf20Sopenharmony_ci	.endr
48