]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: preserve R29 in the write barrier flush path on ppc64
authorDavid Chase <drchase@google.com>
Wed, 31 May 2023 19:33:58 +0000 (15:33 -0400)
committerDavid Chase <drchase@google.com>
Wed, 31 May 2023 20:23:35 +0000 (20:23 +0000)
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 <cherryyz@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Keith Randall <khr@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/runtime/asm_ppc64x.s

index d5be18e8530a7e3b9b4c6ad5a0ec94cbdb8dcdd5..c7e32b7723461af79d7607c1ea2fc6e7b3e86edc 100644 (file)
@@ -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<ABIInternal>(SB),NOSPLIT,$0