From 48754592e02719437c46f6d1900a313141e14fa6 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 17 Oct 2017 15:38:13 -0700 Subject: [PATCH] runtime: align stack in 386 lib startup before calling C function Fixes Darwin 386 build. It turns out that the Darwin pthread_create function saves the SSE registers, and therefore requires an aligned stack. This worked before https://golang.org/cl/70530 because the stack sizes were chosen to leave the stack aligned. Change-Id: I911a9e8dcde4e41e595d5ef9b9a1ca733e154de6 Reviewed-on: https://go-review.googlesource.com/71432 Reviewed-by: Robert Griesemer Reviewed-by: Austin Clements --- src/runtime/asm_386.s | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/runtime/asm_386.s b/src/runtime/asm_386.s index 319b61579a..ef82756397 100644 --- a/src/runtime/asm_386.s +++ b/src/runtime/asm_386.s @@ -45,14 +45,20 @@ TEXT _rt0_386_lib(SB),NOSPLIT,$0 MOVL _cgo_sys_thread_create(SB), AX TESTL AX, AX JZ nocgo + + // Align stack to call C function. + // We moved SP to BP above, but BP was clobbered by the libpreinit call. + MOVL SP, BP + ANDL $~15, SP + MOVL $_rt0_386_lib_go(SB), BX MOVL BX, 0(SP) MOVL $0, 4(SP) - // TODO: We are calling a C function here so we should be - // aligning the stack. - CALL AX + + MOVL BP, SP + JMP restore nocgo: -- 2.48.1