]> Cypherpunks.ru repositories - gostls13.git/commit
runtime: restore r2 when restoring state from gobuf in gogo on ppc64x
authorLynn Boger <laboger@linux.vnet.ibm.com>
Fri, 8 Jun 2018 15:07:18 +0000 (11:07 -0400)
committerLynn Boger <laboger@linux.vnet.ibm.com>
Mon, 11 Jun 2018 12:13:11 +0000 (12:13 +0000)
commit30a63ecee351c029ea99dce388a5953a150b4e02
tree71d336ecbe8a2c31a7235e8358b0efddbe092c1b
parent7ba0c6235f9968eb453e759105366bcaa0903326
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.

This adds a testcase under testplugin which reproduces the problem if
the program is run multiple times. The team who reported this problem
has verified it fixes the issue on their larger, more complex
application.

Fixes #25756

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>
misc/cgo/testplugin/src/issue25756/main.go [new file with mode: 0644]
misc/cgo/testplugin/src/issue25756/plugin/c-life.c [new file with mode: 0644]
misc/cgo/testplugin/src/issue25756/plugin/life.go [new file with mode: 0644]
misc/cgo/testplugin/src/issue25756/plugin/life.h [new file with mode: 0644]
misc/cgo/testplugin/test.bash
src/runtime/asm_ppc64x.s