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