]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: don't check sigaltstack on darwin/{arm,arm64}
authorIan Lance Taylor <iant@golang.org>
Mon, 25 Jan 2016 23:22:03 +0000 (15:22 -0800)
committerIan Lance Taylor <iant@golang.org>
Tue, 26 Jan 2016 04:42:31 +0000 (04:42 +0000)
Use of the alternate signal stack on darwin/{arm,arm64} is reportedly
buggy, and the runtime function sigaltstack does nothing.  So don't
check the sigaltstack result to decide how to handle the signal stack.

Fixes #14070.

Change-Id: Ie97ede8895fad721e3acc79225f2cafcbe1f3a81
Reviewed-on: https://go-review.googlesource.com/18940
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Minux Ma <minux@golang.org>
src/runtime/os1_darwin.go

index e9e0b6aa1cebb67e3015807161a7a4233a4f72fa..5c00407b2fcbb774a1cfd8df4e1ec802a03dcc95 100644 (file)
@@ -162,20 +162,25 @@ func minit() {
        // Initialize signal handling.
        _g_ := getg()
 
-       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
+       // The alternate signal stack is buggy on arm and arm64.
+       // The signal handler handles it directly.
+       // The sigaltstack assembly function does nothing.
+       if GOARCH != "arm" && GOARCH != "arm64" {
+               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
+               }
        }
 
        // restore signal mask from m.sigmask and unblock essential signals