1
0
mirror of https://github.com/golang/go synced 2024-09-28 19:14:29 -06:00

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 <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>
This commit is contained in:
David Chase 2023-05-31 15:33:58 -04:00
parent 9552a1122f
commit 7ecd2212e1

View 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