]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: correct seh installation during callbacks
authorAlex Brainman <alex.brainman@gmail.com>
Wed, 10 Aug 2011 07:17:28 +0000 (17:17 +1000)
committerAlex Brainman <alex.brainman@gmail.com>
Wed, 10 Aug 2011 07:17:28 +0000 (17:17 +1000)
Every time we enter callback from Windows, it is
possible that go exception handler is not at the top
of per-thread exception handlers chain. So it needs
to be installed again. At this moment this is done
by replacing top SEH frame with SEH frame as at time
of syscall for the time of callback. This is incorrect,
because, if exception strike, we won't be able to call
any exception handlers installed inside syscall,
because they are not in the chain. This changes
procedure to add new SEH frame on top of existing
chain instead.

I also removed m sehframe field, because I don't
think it is needed. We use single global exception
handler everywhere.

R=golang-dev, r
CC=golang-dev, hectorchu
https://golang.org/cl/4832060

src/pkg/runtime/runtime.h
src/pkg/runtime/windows/386/sys.s

index 8c5403f444c54903a4b8097fc7c1c2c71af7972b..00be565ce02e61512b86d56a03e747dbf589e029 100644 (file)
@@ -248,12 +248,9 @@ struct     M
        uint32  freghi[16];     // D[i] msb and F[i+16]
        uint32  fflag;          // floating point compare flags
 #ifdef __WINDOWS__
-       void*   sehframe;
-
 #ifdef _64BIT  
        void*   gostack;
 #endif
-
 #endif
 };
 
index d38405075b2ae9ff05bbbe2ccb425513002f77c4..703f77d55be748413140985c8f42c3e200b4c73a 100644 (file)
@@ -14,8 +14,6 @@ TEXT runtime·stdcall_raw(SB),7,$0
        // Switch to m->g0 if needed.
        get_tls(DI)
        MOVL    m(DI), DX
-       MOVL    0(FS), SI
-       MOVL    SI, m_sehframe(DX)
        MOVL    m_g0(DX), SI
        CMPL    g(DI), SI
        MOVL    SP, BX
@@ -116,7 +114,7 @@ TEXT runtime·ctrlhandler(SB),7,$0
        MOVL    SP, BX
 
        // setup dummy m, g
-       SUBL    $(m_sehframe+4), SP     // at least space for m_sehframe
+       SUBL    $(m_fflag+4), SP        // at least space for m_fflag
        LEAL    m_tls(SP), CX
        MOVL    CX, 0x2c(FS)
        MOVL    SP, m(CX)
@@ -159,33 +157,39 @@ TEXT runtime·callbackasm+0(SB),7,$0
        ADDL    $4, DX                  // extend argsize by size of return value
 
        // save registers as required for windows callback
-       PUSHL   0(FS)
        PUSHL   DI
        PUSHL   SI
        PUSHL   BP
        PUSHL   BX
+
+       // set up SEH frame again
+       PUSHL   $runtime·sigtramp(SB)
+       PUSHL   0(FS)
+       MOVL    SP, 0(FS)
+
+       // callback parameters
        PUSHL   DX
        PUSHL   CX
        PUSHL   AX
 
-       // reinstall our SEH handler
-       get_tls(CX)
-       MOVL    m(CX), CX
-       MOVL    m_sehframe(CX), CX
-       MOVL    CX, 0(FS)
        CLD
 
        CALL    runtime·cgocallback(SB)
 
-       // restore registers as required for windows callback
        POPL    AX
        POPL    CX
        POPL    DX
+
+       // pop SEH frame
+       POPL    0(FS)
+       POPL    BX
+
+       // restore registers as required for windows callback
        POPL    BX
        POPL    BP
        POPL    SI
        POPL    DI
-       POPL    0(FS)
+
        CLD
 
        MOVL    -4(CX)(DX*1), AX