]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix stack alignment for Windows amd64 lib entry
authorYoufu Zhang <zhangyoufu@gmail.com>
Tue, 23 Feb 2021 03:52:43 +0000 (03:52 +0000)
committerJason A. Donenfeld <Jason@zx2c4.com>
Sat, 20 Mar 2021 17:08:03 +0000 (17:08 +0000)
Windows amd64 calling convention requires 16-bytes aligned
stack pointer. Before this patch, the real frame size is
0x48 (frame size) + 0x10 (frame pointer & return address),
which does not satisfy the alignment requirement.

_cgo_sys_thread_create eventually calls NtCreateThread,
which receives a pointer to a ThreadContext structure
allocated from (mis-aligned) stack, and may fail with
STATUS_DATATYPE_MISALIGNMENT on some implementations.

BP is saved/restored by prolog/epilog.
AX, CX, DX are volatile, no need to save and restore.

Fixes #41075

Change-Id: I01c0a22b4bf3b4cfdebf4df587445aa46c667973
GitHub-Last-Rev: 15d2bd740e3e61c9753b3e1b574fdb5da538459c
GitHub-Pull-Request: golang/go#44524
Reviewed-on: https://go-review.googlesource.com/c/go/+/295329
Trust: Alex Brainman <alex.brainman@gmail.com>
Trust: Jason A. Donenfeld <Jason@zx2c4.com>
Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Jason A. Donenfeld <Jason@zx2c4.com>
Reviewed-by: Christopher Nelson <nadiasvertex@gmail.com>
src/runtime/rt0_windows_amd64.s

index 345e1418023221ce49d2b5c0b1359cd632b8542a..e60bf4c86d0549ea34696bcbd0ca94c010a30841 100644 (file)
@@ -16,24 +16,12 @@ TEXT _rt0_amd64_windows(SB),NOSPLIT,$-8
 // phase.
 // Leave space for four pointers on the stack as required
 // by the Windows amd64 calling convention.
-TEXT _rt0_amd64_windows_lib(SB),NOSPLIT,$0x48
-       MOVQ    BP, 0x20(SP)
-       MOVQ    BX, 0x28(SP)
-       MOVQ    AX, 0x30(SP)
-       MOVQ  CX, 0x38(SP)
-       MOVQ  DX, 0x40(SP)
-
+TEXT _rt0_amd64_windows_lib(SB),NOSPLIT,$0x20
        // Create a new thread to do the runtime initialization and return.
        MOVQ    _cgo_sys_thread_create(SB), AX
        MOVQ    $_rt0_amd64_windows_lib_go(SB), CX
        MOVQ    $0, DX
        CALL    AX
-
-       MOVQ    0x20(SP), BP
-       MOVQ    0x28(SP), BX
-       MOVQ    0x30(SP), AX
-       MOVQ    0x38(SP), CX
-       MOVQ    0x40(SP), DX
        RET
 
 TEXT _rt0_amd64_windows_lib_go(SB),NOSPLIT,$0