From 7ecd2212e102c7f92a4a6f8da6f0b9595f888f3f Mon Sep 17 00:00:00 2001 From: David Chase Date: Wed, 31 May 2023 15:33:58 -0400 Subject: [PATCH] runtime: preserve R29 in the write barrier flush path on ppc64 Surprisingly, it usually survived the call to flush a write barrier. Usually. Fixes #60368 Change-Id: I4792a57738e5829c79baebae4d13b62abe9526b6 Reviewed-on: https://go-review.googlesource.com/c/go/+/499679 Run-TryBot: Cherry Mui Reviewed-by: Cherry Mui Reviewed-by: Keith Randall TryBot-Result: Gopher Robot Reviewed-by: Keith Randall --- src/runtime/asm_ppc64x.s | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/runtime/asm_ppc64x.s b/src/runtime/asm_ppc64x.s index d5be18e853..c7e32b7723 100644 --- a/src/runtime/asm_ppc64x.s +++ b/src/runtime/asm_ppc64x.s @@ -946,7 +946,7 @@ TEXT ·checkASM(SB),NOSPLIT,$0-1 // It clobbers condition codes. // It does not clobber R0 through R17 (except special registers), // but may clobber any other register, *including* R31. -TEXT gcWriteBarrier<>(SB),NOSPLIT,$112 +TEXT gcWriteBarrier<>(SB),NOSPLIT,$120 // The standard prologue clobbers R31. // We use R18, R19, and R31 as scratch registers. retry: @@ -987,6 +987,7 @@ flush: MOVD R15, (FIXED_FRAME+88)(R1) MOVD R16, (FIXED_FRAME+96)(R1) MOVD R17, (FIXED_FRAME+104)(R1) + MOVD R29, (FIXED_FRAME+112)(R1) CALL runtime·wbBufFlush(SB) @@ -1004,6 +1005,7 @@ flush: MOVD (FIXED_FRAME+88)(R1), R15 MOVD (FIXED_FRAME+96)(R1), R16 MOVD (FIXED_FRAME+104)(R1), R17 + MOVD (FIXED_FRAME+112)(R1), R29 JMP retry TEXT runtime·gcWriteBarrier1(SB),NOSPLIT,$0 -- 2.50.0