summaryrefslogtreecommitdiff
path: root/src/runtime/rt0_linux_386.s
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2015-04-20 10:32:39 -0700
committerIan Lance Taylor <iant@golang.org>2015-04-20 18:09:41 +0000
commit357a013060686aa90432dba93faa01196452eabe (patch)
tree6d23e73e5d6abed37dcf4ed0bd8b15a028363ea1 /src/runtime/rt0_linux_386.s
parent725aa3451a73498ed43cf2279f1609a4dffbe04a (diff)
downloadgo-git-357a013060686aa90432dba93faa01196452eabe.tar.gz
runtime: save registers in linux/{386,amd64} lib entry point
The callee-saved registers must be saved because for the c-shared case this code is invoked from C code in the system library, and that code expects the registers to be saved. The tests were passing because in the normal case the code calls a cgo function that naturally saves callee-saved registers anyhow. However, it fails when the code takes the non-cgo path. Change-Id: I9c1f5e884f5a72db9614478049b1863641c8b2b9 Reviewed-on: https://go-review.googlesource.com/9114 Reviewed-by: David Crawshaw <crawshaw@golang.org>
Diffstat (limited to 'src/runtime/rt0_linux_386.s')
-rw-r--r--src/runtime/rt0_linux_386.s23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/runtime/rt0_linux_386.s b/src/runtime/rt0_linux_386.s
index 14d9f54826..f98642bc03 100644
--- a/src/runtime/rt0_linux_386.s
+++ b/src/runtime/rt0_linux_386.s
@@ -14,12 +14,20 @@ TEXT _rt0_386_linux(SB),NOSPLIT,$8
// When building with -buildmode=c-shared, this symbol is called when the shared
// library is loaded.
-TEXT _rt0_386_linux_lib(SB),NOSPLIT,$12
- MOVL 16(SP), AX
+TEXT _rt0_386_linux_lib(SB),NOSPLIT,$0
+ PUSHL BP
+ MOVL SP, BP
+ PUSHL BX
+ PUSHL SI
+ PUSHL DI
+
+ MOVL 8(BP), AX
MOVL AX, _rt0_386_linux_lib_argc<>(SB)
- MOVL 20(SP), AX
+ MOVL 12(BP), AX
MOVL AX, _rt0_386_linux_lib_argv<>(SB)
+ SUBL $8, SP
+
// Create a new thread to do the runtime initialization.
MOVL _cgo_sys_thread_create(SB), AX
TESTL AX, AX
@@ -28,7 +36,7 @@ TEXT _rt0_386_linux_lib(SB),NOSPLIT,$12
MOVL BX, 0(SP)
MOVL $0, 4(SP)
CALL AX
- RET
+ JMP restore
nocgo:
MOVL $0x800000, 0(SP) // stacksize = 8192KB
@@ -37,6 +45,13 @@ nocgo:
MOVL $0, 8(SP) // fnarg
MOVL $runtime·newosproc0(SB), AX
CALL AX
+
+restore:
+ ADDL $8, SP
+ POPL DI
+ POPL SI
+ POPL BX
+ POPL BP
RET
TEXT _rt0_386_linux_lib_go(SB),NOSPLIT,$12