aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/os_openbsd.go
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2016-09-25 13:38:54 -0700
committerIan Lance Taylor <iant@golang.org>2016-09-26 04:07:31 +0000
commitd15295c6790b70eba0e4a3aa7ddead251aa440da (patch)
tree6867463cd01a28a0566eadbf2cbda73fe1cf82ff /src/runtime/os_openbsd.go
parente6143e17d3e0c3ab8a7bd8357001217eb01dc6c6 (diff)
downloadgo-d15295c6790b70eba0e4a3aa7ddead251aa440da.tar.gz
go-d15295c6790b70eba0e4a3aa7ddead251aa440da.zip
runtime: unify handling of alternate signal stack
Change all Unix systems to use stackt for the alternate signal stack (some were using sigaltstackt). Add OS-specific setSignalstackSP function to handle different types for ss_sp field, and unify all OS-specific signalstack functions into one. Unify handling of alternate signal stack in OS-specific minit and sigtrampgo functions via new functions minitSignalstack and setGsignalStack. Change-Id: Idc316dc69b1dd725717acdf61a1cd8b9f33ed174 Reviewed-on: https://go-review.googlesource.com/29757 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/runtime/os_openbsd.go')
-rw-r--r--src/runtime/os_openbsd.go30
1 files changed, 4 insertions, 26 deletions
diff --git a/src/runtime/os_openbsd.go b/src/runtime/os_openbsd.go
index 375c100aec..714416fa5b 100644
--- a/src/runtime/os_openbsd.go
+++ b/src/runtime/os_openbsd.go
@@ -218,22 +218,7 @@ func minit() {
// m.procid is a uint64, but tfork writes an int32. Fix it up.
_g_.m.procid = uint64(*(*int32)(unsafe.Pointer(&_g_.m.procid)))
- // Initialize signal handling
- var st stackt
- sigaltstack(nil, &st)
- if st.ss_flags&_SS_DISABLE != 0 {
- signalstack(&_g_.m.gsignal.stack)
- _g_.m.newSigstack = true
- } else {
- // Use existing signal stack.
- stsp := uintptr(unsafe.Pointer(st.ss_sp))
- _g_.m.gsignal.stack.lo = stsp
- _g_.m.gsignal.stack.hi = stsp + st.ss_size
- _g_.m.gsignal.stackguard0 = stsp + _StackGuard
- _g_.m.gsignal.stackguard1 = stsp + _StackGuard
- _g_.m.gsignal.stackAlloc = st.ss_size
- _g_.m.newSigstack = false
- }
+ minitSignalStack()
// restore signal mask from m.sigmask and unblock essential signals
nmask := _g_.m.sigmask
@@ -298,17 +283,10 @@ func getsig(i int32) uintptr {
return sa.sa_sigaction
}
+// setSignaltstackSP sets the ss_sp field of a stackt.
//go:nosplit
-func signalstack(s *stack) {
- var st stackt
- if s == nil {
- st.ss_flags = _SS_DISABLE
- } else {
- st.ss_sp = s.lo
- st.ss_size = s.hi - s.lo
- st.ss_flags = 0
- }
- sigaltstack(&st, nil)
+func setSignalstackSP(s *stackt, sp uintptr) {
+ s.ss_sp = sp
}
//go:nosplit