Skip to content

Commit 7ee7a21

Browse files
qmuntalcherrymui
authored andcommitted
[release-branch.go1.21] runtime: ensure stack is aligned in _rt0_amd64_windows_lib
The Windows DLL loader may call a DLL entry point, in our case _rt0_amd64_windows_lib, with a stack that is not 16-byte aligned. In theory, it shouldn't, but under some circumstances, it does (see below how to reproduce it). Having an unaligned stack can, and probably will, cause problems down the line, for example if a movaps instruction tries to store a value in an unaligned address it throws an Access Violation exception (code 0xc0000005). I managed to consistently reproduce this issue by loading a Go DLL into a C program that has the Page Heap Verification diagnostic enabled [1]. Updates #54187 (and potentially fixes) [1] https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/example-12---using-page-heap-verification-to-find-a-bug Change-Id: Id0fea7f407e024c9b8cdce10ce4802d7535e7542 Reviewed-on: https://go-review.googlesource.com/c/go/+/510755 TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Cherry Mui <[email protected]> Reviewed-by: Than McIntosh <[email protected]> Run-TryBot: Quim Muntal <[email protected]> (cherry picked from commit 5fe3f0a) Reviewed-on: https://go-review.googlesource.com/c/go/+/511135 Run-TryBot: Dmitri Shuralyov <[email protected]> Reviewed-by: Quim Muntal <[email protected]>
1 parent 06a9034 commit 7ee7a21

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

src/runtime/rt0_windows_amd64.s

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,17 @@ TEXT _rt0_amd64_windows(SB),NOSPLIT|NOFRAME,$-8
1616
// phase.
1717
// Leave space for four pointers on the stack as required
1818
// by the Windows amd64 calling convention.
19-
TEXT _rt0_amd64_windows_lib(SB),NOSPLIT|NOFRAME,$0x20
19+
TEXT _rt0_amd64_windows_lib(SB),NOSPLIT|NOFRAME,$40
2020
// Create a new thread to do the runtime initialization and return.
21+
MOVQ BX, 32(SP) // callee-saved, preserved across the CALL
22+
MOVQ SP, BX
23+
ANDQ $~15, SP // alignment as per Windows requirement
2124
MOVQ _cgo_sys_thread_create(SB), AX
2225
MOVQ $_rt0_amd64_windows_lib_go(SB), CX
2326
MOVQ $0, DX
2427
CALL AX
28+
MOVQ BX, SP
29+
MOVQ 32(SP), BX
2530
RET
2631

2732
TEXT _rt0_amd64_windows_lib_go(SB),NOSPLIT|NOFRAME,$0

0 commit comments

Comments
 (0)