From 15d2bd740e3e61c9753b3e1b574fdb5da538459c Mon Sep 17 00:00:00 2001 From: Youfu Zhang Date: Tue, 23 Feb 2021 11:25:47 +0800 Subject: [PATCH] runtime: fix stack alignment for Windows amd64 lib entry 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 --- src/runtime/rt0_windows_amd64.s | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/runtime/rt0_windows_amd64.s b/src/runtime/rt0_windows_amd64.s index 345e141802..e60bf4c86d 100644 --- a/src/runtime/rt0_windows_amd64.s +++ b/src/runtime/rt0_windows_amd64.s @@ -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