]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix mcall unwinding on Windows
authorqmuntal <quimmuntal@gmail.com>
Wed, 24 Apr 2024 07:36:22 +0000 (09:36 +0200)
committerQuim Muntal <quimmuntal@gmail.com>
Thu, 25 Apr 2024 18:50:21 +0000 (18:50 +0000)
The Windows native stack unwinder incorrectly classifies the next
instruction after the mcall callback call as being part of the function
epilogue, producing a wrong call stack.

Add a NOP after the callback call to work around this issue.

Fixes #67007.

Change-Id: I6017635da895b272b1852391db9a255ca69e335d
Reviewed-on: https://go-review.googlesource.com/c/go/+/581335
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Run-TryBot: Quim Muntal <quimmuntal@gmail.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/runtime/asm_amd64.s

index 1071d270c1b85cf66c833b6b63ec8ebe21cbc656..cb21629a84b628ebe4c7684a7a06e3f386263ad5 100644 (file)
@@ -456,6 +456,10 @@ goodm:
        PUSHQ   AX      // open up space for fn's arg spill slot
        MOVQ    0(DX), R12
        CALL    R12             // fn(g)
+       // The Windows native stack unwinder incorrectly classifies the next instruction
+       // as part of the function epilogue, producing a wrong call stack.
+       // Add a NOP to work around this issue. See go.dev/issue/67007.
+       BYTE    $0x90
        POPQ    AX
        JMP     runtime·badmcall2(SB)
        RET