summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLynn Boger <laboger@linux.vnet.ibm.com>2018-06-08 11:07:18 -0400
committerBrad Fitzpatrick <bradfitz@golang.org>2018-10-30 15:40:52 +0000
commite97b7d68f107ff60152f5bd5701e0286f221ee93 (patch)
tree2557bcd54f1eff85e72dedab07854cf6caad8fd4
parent1f8a5b8cc8f5dca6aaa09cf2a6604a2edd84cb14 (diff)
downloadgo-git-e97b7d68f107ff60152f5bd5701e0286f221ee93.tar.gz
[release-branch.go1.10] runtime: restore r2 when restoring state from gobuf in gogo on ppc64x
When using plugins with goroutines calling cgo, we hit a case where an intermittent SIGSEGV occurs when referencing an address that is based on r2 (TOC address). When the failure can be generated in gdb, the contents of r2 is wrong even though the value in the current stack's slot for r2 is correct. So that means it somehow switched to start running the code in this function without passing through the beginning of the function which had the correct value of r2 and stored it there. It was noted that in runtime.gogo when the state is restored from gobuf, r2 is not restored from its slot on the stack. Adding the instruction to restore r2 prevents the SIGSEGV. Fixes #25800 Change-Id: I6028b6f1f8775d5c23f4ebb57ae273330a28eb8f Reviewed-on: https://go-review.googlesource.com/117515 Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com> Reviewed-by: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> (cherry picked from commit 30a63ecee351c029ea99dce388a5953a150b4e02) Reviewed-on: https://go-review.googlesource.com/c/117915 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-rw-r--r--src/runtime/asm_ppc64x.s1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/runtime/asm_ppc64x.s b/src/runtime/asm_ppc64x.s
index e02ca16907..bb0609bf63 100644
--- a/src/runtime/asm_ppc64x.s
+++ b/src/runtime/asm_ppc64x.s
@@ -139,6 +139,7 @@ TEXT runtimeĀ·gogo(SB), NOSPLIT, $16-8
MOVD 0(g), R4
MOVD gobuf_sp(R5), R1
MOVD gobuf_lr(R5), R31
+ MOVD 24(R1), R2 // restore R2
MOVD R31, LR
MOVD gobuf_ret(R5), R3
MOVD gobuf_ctxt(R5), R11