]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: use compileCallback for ctrlhandler
authorAustin Clements <austin@google.com>
Tue, 13 Apr 2021 12:20:08 +0000 (08:20 -0400)
committerAustin Clements <austin@google.com>
Tue, 13 Apr 2021 21:13:09 +0000 (21:13 +0000)
This replaces the externalthreadhandler-based implementation of
ctrlhandler with one based on compileCallback. This is a step toward
eliminating externalthreadhandler.

For #45530.

Change-Id: I2de2f2f37777af292db67ccf8057b7566aab81f8
Reviewed-on: https://go-review.googlesource.com/c/go/+/309632
Trust: Austin Clements <austin@google.com>
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
src/cmd/link/internal/ld/pe.go
src/runtime/os_windows.go
src/runtime/sys_windows_386.s
src/runtime/sys_windows_amd64.s
src/runtime/sys_windows_arm.s
src/runtime/sys_windows_arm64.s

index b590d5082d408fae62a1ef8f091b9fc112d5ed2b..dc1b53010a98291b3f6d639d7cee426547cfade0 100644 (file)
@@ -947,8 +947,8 @@ func (f *peFile) writeOptionalHeader(ctxt *Link) {
        // calls that may need more stack than we think.
        //
        // The default stack reserve size directly affects only the main
-       // thread, ctrlhandler thread, and profileloop thread. For
-       // these, it must be greater than the stack size assumed by
+       // thread and threads that enter in externalthreadhandler.
+       // For this, it must be greater than the stack size assumed by
        // externalthreadhandler.
        //
        // For other threads, the runtime explicitly asks the kernel
index 705b42c61c6d23b02192e0a2c2413a142b164ade..77ad075be10c2ad448000ea171e5ee2479e19c00 100644 (file)
@@ -149,9 +149,6 @@ var (
 // to start new os thread.
 func tstart_stdcall(newm *m)
 
-// Called by OS using stdcall ABI.
-func ctrlhandler()
-
 // Init-time helper
 func wintls()
 
@@ -557,8 +554,6 @@ func osinit() {
 
        initExceptionHandler()
 
-       stdcall2(_SetConsoleCtrlHandler, funcPC(ctrlhandler), 1)
-
        initHighResTimer()
        timeBeginPeriodRetValue = osRelax(false)
 
@@ -685,8 +680,12 @@ func goenvs() {
 
        stdcall1(_FreeEnvironmentStringsW, uintptr(strings))
 
-       // We call this all the way here, late in init, so that malloc works
-       // for the callback function this generates.
+       // We call these all the way here, late in init, so that malloc works
+       // for the callback functions these generate.
+       var fn interface{} = ctrlHandler
+       ctrlHandlerPC := compileCallback(*efaceOf(&fn), true)
+       stdcall2(_SetConsoleCtrlHandler, ctrlHandlerPC, 1)
+
        monitorSuspendResume()
 }
 
@@ -1176,7 +1175,7 @@ func usleep(us uint32) {
        })
 }
 
-func ctrlhandler1(_type uint32) uint32 {
+func ctrlHandler(_type uint32) uintptr {
        var s uint32
 
        switch _type {
index be4268a9c07723c54796fa7bf1a892ac7eef53c3..b1c27c40d96b8a9f2e4e1f1f866182f3f5d4202f 100644 (file)
@@ -156,15 +156,6 @@ TEXT runtime·lastcontinuetramp<ABIInternal>(SB),NOSPLIT,$0-0
        MOVL    $runtime·lastcontinuehandler(SB), AX
        JMP     sigtramp<>(SB)
 
-// Called by OS using stdcall ABI: bool ctrlhandler(uint32).
-TEXT runtime·ctrlhandler<ABIInternal>(SB),NOSPLIT,$0
-       PUSHL   $runtime·ctrlhandler1(SB)
-       NOP     SP      // tell vet SP changed - stop checking offsets
-       CALL    runtime·externalthreadhandler<ABIInternal>(SB)
-       MOVL    4(SP), CX
-       ADDL    $12, SP
-       JMP     CX
-
 // Called by OS using stdcall ABI: uint32 profileloop(void*).
 TEXT runtime·profileloop<ABIInternal>(SB),NOSPLIT,$0
        PUSHL   $runtime·profileloop1(SB)
index 1fd8bf5c5cd11646ce8f8c0b968b33dba64a3900..e9428c36db9c33dfab44904c790fa17fc067c7e1 100644 (file)
@@ -202,13 +202,6 @@ TEXT runtime·lastcontinuetramp<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-0
        MOVQ    $runtime·lastcontinuehandler(SB), AX
        JMP     sigtramp<>(SB)
 
-TEXT runtime·ctrlhandler<ABIInternal>(SB),NOSPLIT|NOFRAME,$8
-       MOVQ    CX, 16(SP)              // spill
-       MOVQ    $runtime·ctrlhandler1(SB), CX
-       MOVQ    CX, 0(SP)
-       CALL    runtime·externalthreadhandler<ABIInternal>(SB)
-       RET
-
 TEXT runtime·profileloop<ABIInternal>(SB),NOSPLIT|NOFRAME,$8
        MOVQ    $runtime·profileloop1(SB), CX
        MOVQ    CX, 0(SP)
index 72de89dc84b309ad8088a2aac0a21bac91134893..304bba22e04d87936b950b2687118453ec318684 100644 (file)
@@ -233,10 +233,6 @@ TEXT runtime·lastcontinuetramp<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
        MOVW    $runtime·lastcontinuehandler(SB), R1
        B       sigtramp<>(SB)
 
-TEXT runtime·ctrlhandler<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
-       MOVW    $runtime·ctrlhandler1(SB), R1
-       B       runtime·externalthreadhandler<ABIInternal>(SB)
-
 TEXT runtime·profileloop<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
        MOVW    $runtime·profileloop1(SB), R1
        B       runtime·externalthreadhandler<ABIInternal>(SB)
index f54c868b267cac94a3619a54a256d14ca5a8e060..4512fbc8b09e9e7e2d0195940dfc33856a93a178 100644 (file)
@@ -299,10 +299,6 @@ TEXT runtime·lastcontinuetramp(SB),NOSPLIT|NOFRAME,$0
        MOVD    $runtime·lastcontinuehandler<ABIInternal>(SB), R1
        B       sigtramp<>(SB)
 
-TEXT runtime·ctrlhandler<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
-       MOVD    $runtime·ctrlhandler1(SB), R1
-       B       runtime·externalthreadhandler<ABIInternal>(SB)
-
 TEXT runtime·profileloop<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
        MOVD    $runtime·profileloop1(SB), R1
        B       runtime·externalthreadhandler<ABIInternal>(SB)