ppc/lv1call: Fix PS3 LV1 clobbering SRR

René Rebe rene at exactco.de
Wed Nov 19 00:42:30 AEDT 2025


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 <rene at exactco.de>
---
 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.dehttps://t2linux.comhttps://patreon.com/renerebe


More information about the Linuxppc-dev mailing list