]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix 386 signal handler bug
authorRuss Cox <rsc@golang.org>
Sat, 12 Jun 2010 17:48:04 +0000 (10:48 -0700)
committerRuss Cox <rsc@golang.org>
Sat, 12 Jun 2010 17:48:04 +0000 (10:48 -0700)
Cannot assume that g == m->curg at time of signal.
Must save actual g and restore.

Fixes flaky crashes with messages like

throw: malloc mlookup
throw: malloc/free - deadlock
throw: unwindstack on self
throw: free mlookup

(and probably others) when running cgo.

R=iant
CC=golang-dev
https://golang.org/cl/1648043

src/pkg/runtime/darwin/386/sys.s
src/pkg/runtime/linux/386/sys.s

index f88f6b2468a8a1a0091f1fee90ef276261bdcb0c..4e0a0b3fd608a1162c445245899640b0d37bd7c5 100644 (file)
@@ -74,8 +74,13 @@ TEXT sigaction(SB),7,$0
 //     16(FP)  siginfo
 //     20(FP)  context
 TEXT sigtramp(SB),7,$40
-       // g = m->gsignal
        get_tls(CX)
+
+       // save g
+       MOVL    g(CX), BP
+       MOVL    BP, 20(SP)
+       
+       // g = m->gsignal
        MOVL    m(CX), BP
        MOVL    m_gsignal(BP), BP
        MOVL    BP, g(CX)
@@ -91,10 +96,9 @@ TEXT sigtramp(SB),7,$40
        MOVL    CX, 8(SP)
        CALL    DI
 
-       // g = m->curg
+       // restore g
        get_tls(CX)
-       MOVL    m(CX), BP
-       MOVL    m_curg(BP), BP
+       MOVL    20(SP), BP
        MOVL    BP, g(CX)
 
        MOVL    context+16(FP), CX
index ed7c155f1f507b14c4baa50cfe60fac3879ea617..57ffc4aa4faff337b3ed51d9a9738b1bcee8940d 100644 (file)
@@ -56,22 +56,39 @@ TEXT rt_sigaction(SB),7,$0
        INT     $0x80
        RET
 
-TEXT sigtramp(SB),7,$0
+TEXT sigtramp(SB),7,$40
        get_tls(CX)
-       MOVL    m(CX), BP
-       MOVL    m_gsignal(BP), AX
-       MOVL    AX, g(CX)
-       JMP     sighandler(SB)
+       
+       // save g
+       MOVL    g(CX), BX
+       MOVL    BX, 20(SP)
+       
+       // g = m->gsignal
+       MOVL    m(CX), BX
+       MOVL    m_gsignal(BX), BX
+       MOVL    BX, g(CX)
+       
+       // copy arguments for call to sighandler
+       MOVL    sig+0(FP), BX
+       MOVL    BX, 0(SP)
+       MOVL    info+4(FP), BX
+       MOVL    BX, 4(SP)
+       MOVL    context+8(FP), BX
+       MOVL    BX, 8(SP)
+
+       CALL    sighandler(SB)
+       
+       // restore g
+       get_tls(CX)
+       MOVL    20(SP), BX
+       MOVL    BX, g(CX)
+       
+       RET
 
 TEXT sigignore(SB),7,$0
        RET
 
 TEXT sigreturn(SB),7,$0
-       // g = m->curg
-       get_tls(CX)
-       MOVL    m(CX), BP
-       MOVL    m_curg(BP), BP
-       MOVL    BP, g(CX)
        MOVL    $173, AX        // rt_sigreturn
        INT $0x80
        INT $3  // not reached
@@ -259,4 +276,3 @@ TEXT setldt(SB),7,$32
        MOVW    AX, GS
 
        RET
-