diff options
author | Ian Lance Taylor <iant@golang.org> | 2015-04-20 10:32:39 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2015-04-20 18:09:41 +0000 |
commit | 357a013060686aa90432dba93faa01196452eabe (patch) | |
tree | 6d23e73e5d6abed37dcf4ed0bd8b15a028363ea1 /src/runtime/rt0_linux_386.s | |
parent | 725aa3451a73498ed43cf2279f1609a4dffbe04a (diff) | |
download | go-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.s | 23 |
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 |