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