Since a while booting a PS3 instantly yields: <4>SRR0 was: c0000000000971b4 should be: c0000000002d55c4 <4>SRR1 was: 8000000000008032 should be: 8000000000008032
Fix LV1 clobbering SRR by srr_regs_clobbered() each lv1 call. Attribute srr_regs_clobbered always_inline for use by modules. Signed-off-by: René Rebe <[email protected]> --- arch/powerpc/include/asm/interrupt.h | 1 + arch/powerpc/include/asm/lv1call.h | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/include/asm/interrupt.h b/arch/powerpc/include/asm/interrupt.h index eb0e4a20b818..783c6f32a395 100644 --- a/arch/powerpc/include/asm/interrupt.h +++ b/arch/powerpc/include/asm/interrupt.h @@ -106,6 +106,7 @@ static inline bool is_implicit_soft_masked(struct pt_regs *regs) return search_kernel_soft_mask_table(regs->nip); } +__attribute__((always_inline)) static inline void srr_regs_clobbered(void) { local_paca->srr_valid = 0; diff --git a/arch/powerpc/include/asm/lv1call.h b/arch/powerpc/include/asm/lv1call.h index ae70120953a8..48dd55a2b72e 100644 --- a/arch/powerpc/include/asm/lv1call.h +++ b/arch/powerpc/include/asm/lv1call.h @@ -14,6 +14,7 @@ #include <linux/types.h> #include <linux/export.h> +#include <asm/interrupt.h> /* lv1 call declaration macros */ @@ -208,7 +209,7 @@ #define LV1_CALL(name, in, out, num) \ extern s64 _lv1_##name(LV1_##in##_IN_##out##_OUT_ARG_DECL); \ static inline int lv1_##name(LV1_##in##_IN_##out##_OUT_ARG_DECL) \ - {return _lv1_##name(LV1_##in##_IN_##out##_OUT_ARGS);} + {srr_regs_clobbered(); return _lv1_##name(LV1_##in##_IN_##out##_OUT_ARGS);} #endif #endif /* !defined(__ASSEMBLER__) */ -- 2.46.0 -- René Rebe, ExactCODE GmbH, Berlin, Germany https://exactco.de • https://t2linux.com • https://patreon.com/renerebe
