diff options
author | Ian Lance Taylor <iant@golang.org> | 2016-09-25 13:38:54 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2016-09-26 04:07:31 +0000 |
commit | d15295c6790b70eba0e4a3aa7ddead251aa440da (patch) | |
tree | 6867463cd01a28a0566eadbf2cbda73fe1cf82ff /src/runtime/os_linux.go | |
parent | e6143e17d3e0c3ab8a7bd8357001217eb01dc6c6 (diff) | |
download | go-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_linux.go')
-rw-r--r-- | src/runtime/os_linux.go | 31 |
1 files changed, 5 insertions, 26 deletions
diff --git a/src/runtime/os_linux.go b/src/runtime/os_linux.go index 7b3ce71fea..88139ae2fc 100644 --- a/src/runtime/os_linux.go +++ b/src/runtime/os_linux.go @@ -260,21 +260,7 @@ func minit() { // Initialize signal handling. _g_ := getg() - var st sigaltstackt - 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() // for debuggers, in case cgo created the thread _g_.m.procid = uint64(gettid()) @@ -341,7 +327,7 @@ func cgoSigtramp() func rt_sigaction(sig uintptr, new, old *sigactiont, size uintptr) int32 //go:noescape -func sigaltstack(new, old *sigaltstackt) +func sigaltstack(new, old *stackt) //go:noescape func setitimer(mode int32, new, old *itimerval) @@ -419,15 +405,8 @@ func getsig(i int32) uintptr { return sa.sa_handler } +// setSignaltstackSP sets the ss_sp field of a stackt. //go:nosplit -func signalstack(s *stack) { - var st sigaltstackt - if s == nil { - st.ss_flags = _SS_DISABLE - } else { - st.ss_sp = (*byte)(unsafe.Pointer(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 = (*byte)(unsafe.Pointer(sp)) } |