]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix windows/arm externalthreadhandler
authorRuss Cox <rsc@golang.org>
Wed, 27 Jan 2021 16:27:25 +0000 (11:27 -0500)
committerRuss Cox <rsc@golang.org>
Fri, 19 Feb 2021 00:04:07 +0000 (00:04 +0000)
Externalthreadhandler was not handling its own stack correctly.
It incorrectly referred to the saved LR slot (uninitialized, it turned out)
as holding the return value from the called function.

Externalthreadhandler is used to call two different functions:
profileloop1 and ctrlhandler1.
Profileloop1 does not return, so no harm done.
Ctrlhandler1 returns a boolean indicating whether the handler
took care of the control event (if true, no other handlers run).

It's hard to say exactly what uninitialized values are likely to
have been returned instead of ctrlhandler1's result, but it
probably wasn't helping matters.

Change-Id: Ia02f1c033df618cb82c2193b3a8241ed048a8b18
Reviewed-on: https://go-review.googlesource.com/c/go/+/288812
Trust: Russ Cox <rsc@golang.org>
Trust: Jason A. Donenfeld <Jason@zx2c4.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Jason A. Donenfeld <Jason@zx2c4.com>
src/runtime/sys_windows_arm.s

index 42278dcbe705250b740bf6b9009e660cfa6ffdec..3f01714c66eafe90b044ec42e57eff187f1dec48 100644 (file)
@@ -250,16 +250,17 @@ TEXT runtime·profileloop(SB),NOSPLIT|NOFRAME,$0
 //   +----------------+
 // 12| argument (r0)  |
 //---+----------------+
-// 8 | param1         |
+// 8 | param1         | (also return value for called Go function)
 //   +----------------+
 // 4 | param0         |
 //   +----------------+
-// 0 | retval         |
+// 0 | slot for LR    |
 //   +----------------+
 //
 TEXT runtime·externalthreadhandler(SB),NOSPLIT|NOFRAME|TOPFRAME,$0
        MOVM.DB.W [R4-R11, R14], (R13)          // push {r4-r11, lr}
        SUB     $(m__size + g__size + 20), R13  // space for locals
+       MOVW    R14, 0(R13)                     // push LR again for anything unwinding the stack
        MOVW    R0, 12(R13)
        MOVW    R1, 16(R13)
 
@@ -298,7 +299,7 @@ TEXT runtime·externalthreadhandler(SB),NOSPLIT|NOFRAME|TOPFRAME,$0
        MOVW    $0, g
        BL      runtime·save_g(SB)
 
-       MOVW    0(R13), R0                      // load return value
+       MOVW    8(R13), R0                      // load return value
        ADD     $(m__size + g__size + 20), R13  // free locals
        MOVM.IA.W (R13), [R4-R11, R15]          // pop {r4-r11, pc}