diff options
author | Lynn Boger <laboger@linux.vnet.ibm.com> | 2021-03-31 12:28:47 -0500 |
---|---|---|
committer | Lynn Boger <laboger@linux.vnet.ibm.com> | 2021-05-10 17:21:32 +0000 |
commit | d9e068d2894ff2fce48a171212171bc3f394b023 (patch) | |
tree | 221295eb11211819f9d623f684763f7cc3a132dd /src/runtime/cgo | |
parent | deb3403ff52b8833df6c4e2f82cbdddeb13573dd (diff) | |
download | go-d9e068d2894ff2fce48a171212171bc3f394b023.tar.gz go-d9e068d2894ff2fce48a171212171bc3f394b023.zip |
runtime/cgo,cmd/internal/obj/ppc64: fix signals with cgo
Recently some tsan tests were enabled on ppc64le which had not
been enabled before. This resulted in failures on systems with
tsan available, and while debugging it was determined that
there were other issues related to the use of signals with cgo.
Signals were not being forwarded within programs linked against
libtsan because the nocgo sigaction was being called for ppc64le
with or without cgo. Adding callCgoSigaction and calling that
allows signals to be registered so that signal forwarding works.
For linux-ppc64 and aix-ppc64, this won't change. On linux-ppc64
there is no cgo. I can't test aix-ppc64 so those owners can enable
it if they want.
In reviewing comments about sigtramp in sys_linux_arm64 it was
noted that a previous issue in arm64 due to missing callee save
registers could also be a problem on ppc64x, so code was added
to save and restore those.
Also, the use of R31 as a temp register in some cases caused an
issue since it is a nonvolatile register in C and was being clobbered
in cases where the C code expected it to be valid. The code sequences to
load these addresses were changed to avoid the use of R31 when loading
such an address.
To get around a vet error, the stubs_ppc64x.go file in runtime
was split into stubs_ppc64.go and stubs_ppc64le.go.
Updates #45040
Change-Id: Ia4ecff950613cbe1b89471790b1d3819d5b5cfb9
Reviewed-on: https://go-review.googlesource.com/c/go/+/306369
Trust: Lynn Boger <laboger@linux.vnet.ibm.com>
Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Carlos Eduardo Seo <carlos.seo@linaro.org>
Diffstat (limited to 'src/runtime/cgo')
-rw-r--r-- | src/runtime/cgo/gcc_mmap.c | 2 | ||||
-rw-r--r-- | src/runtime/cgo/gcc_sigaction.c | 2 | ||||
-rw-r--r-- | src/runtime/cgo/sigaction.go | 8 |
3 files changed, 6 insertions, 6 deletions
diff --git a/src/runtime/cgo/gcc_mmap.c b/src/runtime/cgo/gcc_mmap.c index e6a621d5a3..698a7e3cd2 100644 --- a/src/runtime/cgo/gcc_mmap.c +++ b/src/runtime/cgo/gcc_mmap.c @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build linux,amd64 linux,arm64 +// +build linux,amd64 linux,arm64 linux,ppc64le #include <errno.h> #include <stdint.h> diff --git a/src/runtime/cgo/gcc_sigaction.c b/src/runtime/cgo/gcc_sigaction.c index 890008e327..dd283151f1 100644 --- a/src/runtime/cgo/gcc_sigaction.c +++ b/src/runtime/cgo/gcc_sigaction.c @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build linux,amd64 linux,arm64 +// +build linux,amd64 linux,arm64 linux,ppc64le #include <errno.h> #include <stddef.h> diff --git a/src/runtime/cgo/sigaction.go b/src/runtime/cgo/sigaction.go index ee63ea4c09..692fd2675f 100644 --- a/src/runtime/cgo/sigaction.go +++ b/src/runtime/cgo/sigaction.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build (linux && amd64) || (freebsd && amd64) || (linux && arm64) -// +build linux,amd64 freebsd,amd64 linux,arm64 +//go:build (linux && amd64) || (freebsd && amd64) || (linux && arm64) || (linux && ppc64le) +// +build linux,amd64 freebsd,amd64 linux,arm64 linux,ppc64le package cgo @@ -11,8 +11,8 @@ package cgo import _ "unsafe" // When using cgo, call the C library for sigaction, so that we call into -// any sanitizer interceptors. This supports using the memory -// sanitizer with Go programs. The memory sanitizer only applies to +// any sanitizer interceptors. This supports using the sanitizers +// with Go programs. The thread and memory sanitizers only apply to // C/C++ code; this permits that code to see the Go runtime's existing signal // handlers when registering new signal handlers for the process. |