]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: print error on receipt of signal on non-Go thread
authorRuss Cox <rsc@golang.org>
Mon, 12 Mar 2012 19:55:18 +0000 (15:55 -0400)
committerRuss Cox <rsc@golang.org>
Mon, 12 Mar 2012 19:55:18 +0000 (15:55 -0400)
It's the best we can do before Go 1.

For issue 3250; not a fix but at least less mysterious.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5797068

19 files changed:
src/pkg/runtime/sys_darwin_386.s
src/pkg/runtime/sys_darwin_amd64.s
src/pkg/runtime/sys_freebsd_386.s
src/pkg/runtime/sys_freebsd_amd64.s
src/pkg/runtime/sys_linux_386.s
src/pkg/runtime/sys_linux_amd64.s
src/pkg/runtime/sys_netbsd_386.s
src/pkg/runtime/sys_netbsd_amd64.s
src/pkg/runtime/sys_openbsd_386.s
src/pkg/runtime/sys_openbsd_amd64.s
src/pkg/runtime/sys_windows_386.s
src/pkg/runtime/sys_windows_amd64.s
src/pkg/runtime/thread_darwin.c
src/pkg/runtime/thread_freebsd.c
src/pkg/runtime/thread_linux.c
src/pkg/runtime/thread_netbsd.c
src/pkg/runtime/thread_openbsd.c
src/pkg/runtime/thread_plan9.c
src/pkg/runtime/thread_windows.c

index da610634660bf909603421b3d813a9121da45860..3cf3506adffa864f68263cb80d4d0ac91e8ac557 100644 (file)
@@ -126,13 +126,18 @@ TEXT runtime·sigaction(SB),7,$0
 //     20(FP)  context
 TEXT runtime·sigtramp(SB),7,$40
        get_tls(CX)
+       
+       // check that m exists
+       MOVL    m(CX), BP
+       CMPL    BP, $0
+       JNE     2(PC)
+       CALL    runtime·badsignal(SB)
 
        // save g
        MOVL    g(CX), DI
        MOVL    DI, 20(SP)
 
        // g = m->gsignal
-       MOVL    m(CX), BP
        MOVL    m_gsignal(BP), BP
        MOVL    BP, g(CX)
 
index 5f784c44a933e1fc1774f5bef2b6f314fd9ce0ff..90571baae46d04e73a431b962d8dcb86f0474c31 100644 (file)
@@ -117,12 +117,17 @@ TEXT runtime·sigaction(SB),7,$0
 TEXT runtime·sigtramp(SB),7,$64
        get_tls(BX)
 
+       // check that m exists
+       MOVQ    m(BX), BP
+       CMPQ    BP, $0
+       JNE     2(PC)
+       CALL    runtime·badsignal(SB)
+
        // save g
        MOVQ    g(BX), R10
        MOVQ    R10, 48(SP)
 
        // g = m->gsignal
-       MOVQ    m(BX), BP
        MOVQ    m_gsignal(BP), BP
        MOVQ    BP, g(BX)
 
index 683a56489ef3b1cffa54ba6bf19bd29d21ca5443..a72d8972b15cdc546e531c1098e7dedb8553663c 100644 (file)
@@ -159,12 +159,17 @@ TEXT runtime·sigaction(SB),7,$-4
 TEXT runtime·sigtramp(SB),7,$44
        get_tls(CX)
 
+       // check that m exists
+       MOVL    m(CX), BX
+       CMPL    BX, $0
+       JNE     2(PC)
+       CALL    runtime·badsignal(SB)
+
        // save g
        MOVL    g(CX), DI
        MOVL    DI, 20(SP)
        
        // g = m->gsignal
-       MOVL    m(CX), BX
        MOVL    m_gsignal(BX), BX
        MOVL    BX, g(CX)
 
index e1d8c1ce2c7ab1cbdaf3d55bfe15295c03a82a33..36e034a802298738bc475687dfc022ecd196b9da 100644 (file)
@@ -135,12 +135,17 @@ TEXT runtime·sigaction(SB),7,$-8
 TEXT runtime·sigtramp(SB),7,$64
        get_tls(BX)
        
+       // check that m exists
+       MOVQ    m(BX), BP
+       CMPQ    BP, $0
+       JNE     2(PC)
+       CALL    runtime·badsignal(SB)
+
        // save g
        MOVQ    g(BX), R10
        MOVQ    R10, 40(SP)
        
        // g = m->signal
-       MOVQ    m(BX), BP
        MOVQ    m_gsignal(BP), BP
        MOVQ    BP, g(BX)
        
index b4cefc53fd7ac895a9eda611db68890b4496b8ec..602d9ddac1cdad3a25cde88745e2d8e2b5b042ff 100644 (file)
@@ -167,6 +167,12 @@ TEXT runtime·rt_sigaction(SB),7,$0
 TEXT runtime·sigtramp(SB),7,$44
        get_tls(CX)
 
+       // check that m exists
+       MOVL    m(CX), BX
+       CMPL    BX, $0
+       JNE     2(PC)
+       CALL    runtime·badsignal(SB)
+
        // save g
        MOVL    g(CX), DI
        MOVL    DI, 20(SP)
index d95d4fde5b7545da5d05dee319c3e8e786e2e442..657ab7e0bbf3859ebd947fe1f70eaf33f63a3837 100644 (file)
@@ -154,12 +154,17 @@ TEXT runtime·rt_sigaction(SB),7,$0-32
 TEXT runtime·sigtramp(SB),7,$64
        get_tls(BX)
 
+       // check that m exists
+       MOVQ    m(BX), BP
+       CMPQ    BP, $0
+       JNE     2(PC)
+       CALL    runtime·badsignal(SB)
+
        // save g
        MOVQ    g(BX), R10
        MOVQ    R10, 40(SP)
 
        // g = m->gsignal
-       MOVQ    m(BX), BP
        MOVQ    m_gsignal(BP), BP
        MOVQ    BP, g(BX)
 
index 8276e2ce91518002e726df32e4b9de0164c424bf..11f8c7aaa203133edc51ee99274fc65a5cb9f20f 100644 (file)
@@ -138,12 +138,17 @@ TEXT runtime·sigaction(SB),7,$-4
 TEXT runtime·sigtramp(SB),7,$44
        get_tls(CX)
 
+       // check that m exists
+       MOVL    m(CX), BX
+       CMPL    BX, $0
+       JNE     2(PC)
+       CALL    runtime·badsignal(SB)
+
        // save g
        MOVL    g(CX), DI
        MOVL    DI, 20(SP)
        
        // g = m->gsignal
-       MOVL    m(CX), BX
        MOVL    m_gsignal(BX), BX
        MOVL    BX, g(CX)
 
index 9741d85a57484356f5a1d4adfed7436ce5399151..0b83cd4d8aa02118b6018a86bc10d1a95d359f2a 100644 (file)
@@ -176,12 +176,17 @@ TEXT runtime·sigaction(SB),7,$-8
 TEXT runtime·sigtramp(SB),7,$64
        get_tls(BX)
        
+       // check that m exists
+       MOVQ    m(BX), BP
+       CMPQ    BP, $0
+       JNE     2(PC)
+       CALL    runtime·badsignal(SB)
+
        // save g
        MOVQ    g(BX), R10
        MOVQ    R10, 40(SP)
        
        // g = m->signal
-       MOVQ    m(BX), BP
        MOVQ    m_gsignal(BP), BP
        MOVQ    BP, g(BX)
        
index 0821745561f2f85b423a0160098adeb7660672b7..593b4a9df29e139c141147c5adac04a50be4ef99 100644 (file)
@@ -138,12 +138,17 @@ TEXT runtime·sigaction(SB),7,$-4
 TEXT runtime·sigtramp(SB),7,$44
        get_tls(CX)
 
+       // check that m exists
+       MOVL    m(CX), BX
+       CMPL    BX, $0
+       JNE     2(PC)
+       CALL    runtime·badsignal(SB)
+
        // save g
        MOVL    g(CX), DI
        MOVL    DI, 20(SP)
        
        // g = m->gsignal
-       MOVL    m(CX), BX
        MOVL    m_gsignal(BX), BX
        MOVL    BX, g(CX)
 
index 501c846a4f4dd457856797cdd2d31e348ce7f5c3..d2d48e6b568de8a58652bfe778dbcbbe266898a5 100644 (file)
@@ -176,12 +176,17 @@ TEXT runtime·sigaction(SB),7,$-8
 TEXT runtime·sigtramp(SB),7,$64
        get_tls(BX)
        
+       // check that m exists
+       MOVQ    m(BX), BP
+       CMPQ    BP, $0
+       JNE     2(PC)
+       CALL    runtime·badsignal(SB)
+
        // save g
        MOVQ    g(BX), R10
        MOVQ    R10, 40(SP)
        
        // g = m->signal
-       MOVQ    m(BX), BP
        MOVQ    m_gsignal(BP), BP
        MOVQ    BP, g(BX)
        
index 0c5ede4b72078c11fe25f4d23331c43e73eebc97..d5646bfea1a67a8172129b25db097d88bc46d37c 100644 (file)
@@ -58,6 +58,26 @@ TEXT runtime·badcallback(SB),7,$24
        MOVL    BP, SI
        RET
 
+TEXT   runtime·badsignal(SB),7,$24
+       // stderr
+       MOVL    $-12, 0(SP)
+       MOVL    SP, BP
+       CALL    *runtime·GetStdHandle(SB)
+       MOVL    BP, SP
+
+       MOVL    AX, 0(SP)       // handle
+       MOVL    $runtime·badsignalmsg(SB), DX // pointer
+       MOVL    DX, 4(SP)
+       MOVL    runtime·badsignallen(SB), DX // count
+       MOVL    DX, 8(SP)
+       LEAL    20(SP), DX  // written count
+       MOVL    $0, 0(DX)
+       MOVL    DX, 12(SP)
+       MOVL    $0, 16(SP) // overlapped
+       CALL    *runtime·WriteFile(SB)
+       MOVL    BP, SI
+       RET
+
 // faster get/set last error
 TEXT runtime·getlasterror(SB),7,$0
        MOVL    0x34(FS), AX
@@ -79,7 +99,15 @@ TEXT runtime·sigtramp(SB),7,$28
        MOVL    CX, 0(SP)
        MOVL    context+8(FP), CX
        MOVL    CX, 4(SP)
+
        get_tls(CX)
+
+       // check that m exists
+       MOVL    m(CX), AX
+       CMPL    AX, $0
+       JNE     2(PC)
+       CALL    runtime·badsignal(SB)
+
        MOVL    g(CX), CX
        MOVL    CX, 8(SP)
 
index c6a37c3453693cb6302099abb83929273862daca..2ddc1c82f37973feb8c52cb555c3a5ba485912ee 100644 (file)
@@ -82,6 +82,28 @@ TEXT runtime·badcallback(SB),7,$48
        
        RET
 
+TEXT runtime·badsignal(SB),7,$48
+       // stderr
+       MOVQ    $-12, CX // stderr
+       MOVQ    CX, 0(SP)
+       MOVQ    runtime·GetStdHandle(SB), AX
+       CALL    AX
+
+       MOVQ    AX, CX  // handle
+       MOVQ    CX, 0(SP)
+       MOVQ    $runtime·badsignalmsg(SB), DX // pointer
+       MOVQ    DX, 8(SP)
+       MOVL    $runtime·badsignallen(SB), R8 // count
+       MOVQ    R8, 16(SP)
+       LEAQ    40(SP), R9  // written count
+       MOVQ    $0, 0(R9)
+       MOVQ    R9, 24(SP)
+       MOVQ    $0, 32(SP)      // overlapped
+       MOVQ    runtime·WriteFile(SB), AX
+       CALL    AX
+       
+       RET
+
 // faster get/set last error
 TEXT runtime·getlasterror(SB),7,$0
        MOVQ    0x30(GS), AX
@@ -106,7 +128,15 @@ TEXT runtime·sigtramp(SB),7,$56
        // copy arguments for call to sighandler
        MOVQ    CX, 0(SP)
        MOVQ    R8, 8(SP)
+
        get_tls(CX)
+
+       // check that m exists
+       MOVQ    m(BX), AX
+       CMPQ    AX, $0
+       JNE     2(PC)
+       CALL    runtime·badsignal(SB)
+
        MOVQ    g(CX), CX
        MOVQ    CX, 16(SP)
 
index bbcdf05ef0140d6604f20f668e3b8e9096ebffec..6a83e48a330e846e771df56ae5559a15e3450c86 100644 (file)
@@ -487,3 +487,13 @@ runtime·badcallback(void)
 {
        runtime·write(2, badcallback, sizeof badcallback - 1);
 }
+
+static int8 badsignal[] = "runtime: signal received on thread not created by Go.\n";
+
+// This runs on a foreign stack, without an m or a g.  No stack split.
+#pragma textflag 7
+void
+runtime·badsignal(void)
+{
+       runtime·write(2, badsignal, sizeof badsignal - 1);
+}
index b848cbadd4475d0533002412161dc08d2b1d16ec..4c546178f45b3c89573110bcc16d895aae7e6277 100644 (file)
@@ -205,3 +205,13 @@ runtime·badcallback(void)
 {
        runtime·write(2, badcallback, sizeof badcallback - 1);
 }
+
+static int8 badsignal[] = "runtime: signal received on thread not created by Go.\n";
+
+// This runs on a foreign stack, without an m or a g.  No stack split.
+#pragma textflag 7
+void
+runtime·badsignal(void)
+{
+       runtime·write(2, badsignal, sizeof badsignal - 1);
+}
index af765d53b93e5c7bb72e08fd904454481de48ae6..858be70360a8d232080eaff3422aaa74f9e8567b 100644 (file)
@@ -265,3 +265,13 @@ runtime·badcallback(void)
 {
        runtime·write(2, badcallback, sizeof badcallback - 1);
 }
+
+static int8 badsignal[] = "runtime: signal received on thread not created by Go.\n";
+
+// This runs on a foreign stack, without an m or a g.  No stack split.
+#pragma textflag 7
+void
+runtime·badsignal(void)
+{
+       runtime·write(2, badsignal, sizeof badsignal - 1);
+}
index 40e4f6ce1c6e3a5c1d7245fb0d9dc53870816ab1..1b2df85cd157e205f219639bf7231d8b8b914ebd 100644 (file)
@@ -223,3 +223,13 @@ runtime·badcallback(void)
 {
        runtime·write(2, badcallback, sizeof badcallback - 1);
 }
+
+static int8 badsignal[] = "runtime: signal received on thread not created by Go.\n";
+
+// This runs on a foreign stack, without an m or a g.  No stack split.
+#pragma textflag 7
+void
+runtime·badsignal(void)
+{
+       runtime·write(2, badsignal, sizeof badsignal - 1);
+}
index e4f95988b0a555b236a0a8177cf5e3e05ee12685..d0f9472106c80f3d10b9d7364115e603fbd5370f 100644 (file)
@@ -223,3 +223,13 @@ runtime·badcallback(void)
 {
        runtime·write(2, badcallback, sizeof badcallback - 1);
 }
+
+static int8 badsignal[] = "runtime: signal received on thread not created by Go.\n";
+
+// This runs on a foreign stack, without an m or a g.  No stack split.
+#pragma textflag 7
+void
+runtime·badsignal(void)
+{
+       runtime·write(2, badsignal, sizeof badsignal - 1);
+}
index 4ca01b0e668fb9a3ccb4a064ebf8bf413b5dbbff..3b0dca69f05e9d7d0a49758af25beb3094842e5d 100644 (file)
@@ -257,3 +257,13 @@ runtime·badcallback(void)
 {
        runtime·pwrite(2, badcallback, sizeof badcallback - 1, -1LL);
 }
+
+static int8 badsignal[] = "runtime: signal received on thread not created by Go.\n";
+
+// This runs on a foreign stack, without an m or a g.  No stack split.
+#pragma textflag 7
+void
+runtime·badsignal(void)
+{
+       runtime·pwrite(2, badsignal, sizeof badsignal - 1, -1LL);
+}
index 83d1edc32d4a52e88eecd0e2efde6861a415101f..f684d373351ab25f4a943422614c8b8a781576d4 100644 (file)
@@ -425,3 +425,6 @@ runtime·setprof(bool on)
 
 int8 runtime·badcallbackmsg[] = "runtime: cgo callback on thread not created by Go.\n";
 int32 runtime·badcallbacklen = sizeof runtime·badcallbackmsg - 1;
+
+int8 runtime·badsignalmsg[] = "runtime: signal received on thread not created by Go.\n";
+int32 runtime·badsignallen = sizeof runtime·badsignalmsg - 1;