From: Ian Lance Taylor Date: Tue, 17 Oct 2017 22:38:13 +0000 (-0700) Subject: runtime: align stack in 386 lib startup before calling C function X-Git-Tag: go1.10beta1~672 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=48754592e02719437c46f6d1900a313141e14fa6;p=gostls13.git 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 --- 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: