]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.10] runtime: restore r2 when restoring state from gobuf in gogo...
authorLynn Boger <laboger@linux.vnet.ibm.com>
Fri, 8 Jun 2018 15:07:18 +0000 (11:07 -0400)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 30 Oct 2018 15:40:52 +0000 (15:40 +0000)
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>
src/runtime/asm_ppc64x.s

index e02ca169071d4495fc127f87d2b98f40dcf5c71e..bb0609bf636bdf64e1206eb1169b70c957a37a4e 100644 (file)
@@ -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