162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#include <asm/ppc_asm.h>
362306a36Sopenharmony_ci#include <asm/asm-compat.h>
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci/* unsigned long xmon_mfspr(sprn, default_value) */
662306a36Sopenharmony_ci_GLOBAL(xmon_mfspr)
762306a36Sopenharmony_ci	LOAD_REG_ADDR(r5, .Lmfspr_table)
862306a36Sopenharmony_ci	b	xmon_mxspr
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci/* void xmon_mtspr(sprn, new_value) */
1162306a36Sopenharmony_ci_GLOBAL(xmon_mtspr)
1262306a36Sopenharmony_ci	LOAD_REG_ADDR(r5, .Lmtspr_table)
1362306a36Sopenharmony_ci	b	xmon_mxspr
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/*
1662306a36Sopenharmony_ci * r3 = sprn
1762306a36Sopenharmony_ci * r4 = default or new value
1862306a36Sopenharmony_ci * r5 = table base
1962306a36Sopenharmony_ci */
2062306a36Sopenharmony_cixmon_mxspr:
2162306a36Sopenharmony_ci	/*
2262306a36Sopenharmony_ci	 * To index into the table of mxsprs we need:
2362306a36Sopenharmony_ci	 *  i = (sprn & 0x3ff) * 8
2462306a36Sopenharmony_ci	 * or using rwlinm:
2562306a36Sopenharmony_ci	 *  i = (sprn << 3) & (0x3ff << 3)
2662306a36Sopenharmony_ci	 */
2762306a36Sopenharmony_ci	rlwinm	r3, r3, 3, 0x3ff << 3
2862306a36Sopenharmony_ci	add	r5, r5, r3
2962306a36Sopenharmony_ci	mtctr	r5
3062306a36Sopenharmony_ci	mr	r3, r4 /* put default_value in r3 for mfspr */
3162306a36Sopenharmony_ci	bctr
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci.Lmfspr_table:
3462306a36Sopenharmony_ci	spr = 0
3562306a36Sopenharmony_ci	.rept	1024
3662306a36Sopenharmony_ci	mfspr	r3, spr
3762306a36Sopenharmony_ci	blr
3862306a36Sopenharmony_ci	spr = spr + 1
3962306a36Sopenharmony_ci	.endr
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci.Lmtspr_table:
4262306a36Sopenharmony_ci	spr = 0
4362306a36Sopenharmony_ci	.rept	1024
4462306a36Sopenharmony_ci	mtspr	spr, r4
4562306a36Sopenharmony_ci	blr
4662306a36Sopenharmony_ci	spr = spr + 1
4762306a36Sopenharmony_ci	.endr
48