mirror of
https://github.com/golang/go
synced 2024-11-26 12:58:06 -07:00
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
Change-Id: I01c0a22b4bf3b4cfdebf4df587445aa46c667973
GitHub-Last-Rev: 15d2bd740e
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>
This commit is contained in:
parent
6ae3b70ef2
commit
e0fae78e1d
@ -16,24 +16,12 @@ TEXT _rt0_amd64_windows(SB),NOSPLIT,$-8
|
|||||||
// phase.
|
// phase.
|
||||||
// Leave space for four pointers on the stack as required
|
// Leave space for four pointers on the stack as required
|
||||||
// by the Windows amd64 calling convention.
|
// by the Windows amd64 calling convention.
|
||||||
TEXT _rt0_amd64_windows_lib(SB),NOSPLIT,$0x48
|
TEXT _rt0_amd64_windows_lib(SB),NOSPLIT,$0x20
|
||||||
MOVQ BP, 0x20(SP)
|
|
||||||
MOVQ BX, 0x28(SP)
|
|
||||||
MOVQ AX, 0x30(SP)
|
|
||||||
MOVQ CX, 0x38(SP)
|
|
||||||
MOVQ DX, 0x40(SP)
|
|
||||||
|
|
||||||
// Create a new thread to do the runtime initialization and return.
|
// Create a new thread to do the runtime initialization and return.
|
||||||
MOVQ _cgo_sys_thread_create(SB), AX
|
MOVQ _cgo_sys_thread_create(SB), AX
|
||||||
MOVQ $_rt0_amd64_windows_lib_go(SB), CX
|
MOVQ $_rt0_amd64_windows_lib_go(SB), CX
|
||||||
MOVQ $0, DX
|
MOVQ $0, DX
|
||||||
CALL AX
|
CALL AX
|
||||||
|
|
||||||
MOVQ 0x20(SP), BP
|
|
||||||
MOVQ 0x28(SP), BX
|
|
||||||
MOVQ 0x30(SP), AX
|
|
||||||
MOVQ 0x38(SP), CX
|
|
||||||
MOVQ 0x40(SP), DX
|
|
||||||
RET
|
RET
|
||||||
|
|
||||||
TEXT _rt0_amd64_windows_lib_go(SB),NOSPLIT,$0
|
TEXT _rt0_amd64_windows_lib_go(SB),NOSPLIT,$0
|
||||||
|
Loading…
Reference in New Issue
Block a user