1
0
mirror of https://github.com/golang/go synced 2024-11-18 14:14:46 -07:00

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>
This commit is contained in:
Ian Lance Taylor 2015-04-20 10:32:39 -07:00
parent 725aa3451a
commit 357a013060
2 changed files with 38 additions and 7 deletions

View File

@ -14,12 +14,20 @@ TEXT _rt0_386_linux(SB),NOSPLIT,$8
// When building with -buildmode=c-shared, this symbol is called when the shared // When building with -buildmode=c-shared, this symbol is called when the shared
// library is loaded. // library is loaded.
TEXT _rt0_386_linux_lib(SB),NOSPLIT,$12 TEXT _rt0_386_linux_lib(SB),NOSPLIT,$0
MOVL 16(SP), AX PUSHL BP
MOVL SP, BP
PUSHL BX
PUSHL SI
PUSHL DI
MOVL 8(BP), AX
MOVL AX, _rt0_386_linux_lib_argc<>(SB) MOVL AX, _rt0_386_linux_lib_argc<>(SB)
MOVL 20(SP), AX MOVL 12(BP), AX
MOVL AX, _rt0_386_linux_lib_argv<>(SB) MOVL AX, _rt0_386_linux_lib_argv<>(SB)
SUBL $8, SP
// Create a new thread to do the runtime initialization. // Create a new thread to do the runtime initialization.
MOVL _cgo_sys_thread_create(SB), AX MOVL _cgo_sys_thread_create(SB), AX
TESTL AX, AX TESTL AX, AX
@ -28,7 +36,7 @@ TEXT _rt0_386_linux_lib(SB),NOSPLIT,$12
MOVL BX, 0(SP) MOVL BX, 0(SP)
MOVL $0, 4(SP) MOVL $0, 4(SP)
CALL AX CALL AX
RET JMP restore
nocgo: nocgo:
MOVL $0x800000, 0(SP) // stacksize = 8192KB MOVL $0x800000, 0(SP) // stacksize = 8192KB
@ -37,6 +45,13 @@ nocgo:
MOVL $0, 8(SP) // fnarg MOVL $0, 8(SP) // fnarg
MOVL $runtime·newosproc0(SB), AX MOVL $runtime·newosproc0(SB), AX
CALL AX CALL AX
restore:
ADDL $8, SP
POPL DI
POPL SI
POPL BX
POPL BP
RET RET
TEXT _rt0_386_linux_lib_go(SB),NOSPLIT,$12 TEXT _rt0_386_linux_lib_go(SB),NOSPLIT,$12

View File

@ -12,7 +12,14 @@ TEXT _rt0_amd64_linux(SB),NOSPLIT,$-8
// When building with -buildmode=c-shared, this symbol is called when the shared // When building with -buildmode=c-shared, this symbol is called when the shared
// library is loaded. // library is loaded.
TEXT _rt0_amd64_linux_lib(SB),NOSPLIT,$40 TEXT _rt0_amd64_linux_lib(SB),NOSPLIT,$0x58
MOVQ BX, 0x18(SP)
MOVQ BP, 0x20(SP)
MOVQ R12, 0x28(SP)
MOVQ R13, 0x30(SP)
MOVQ R14, 0x38(SP)
MOVQ R15, 0x40(SP)
MOVQ DI, _rt0_amd64_linux_lib_argc<>(SB) MOVQ DI, _rt0_amd64_linux_lib_argc<>(SB)
MOVQ SI, _rt0_amd64_linux_lib_argv<>(SB) MOVQ SI, _rt0_amd64_linux_lib_argv<>(SB)
@ -23,14 +30,23 @@ TEXT _rt0_amd64_linux_lib(SB),NOSPLIT,$40
MOVQ $_rt0_amd64_linux_lib_go(SB), DI MOVQ $_rt0_amd64_linux_lib_go(SB), DI
MOVQ $0, SI MOVQ $0, SI
CALL AX CALL AX
RET JMP restore
nocgo: nocgo:
MOVQ $8388608, 0(SP) // stacksize MOVQ $8388608, 0(SP) // stacksize
MOVQ $_rt0_amd64_linux_lib_go(SB), AX MOVQ $_rt0_amd64_linux_lib_go(SB), AX
MOVQ AX, 8(SP) // fn MOVQ AX, 8(SP) // fn
MOVQ $0, 16(SP) // fnarg MOVQ $0, 0x10(SP) // fnarg
MOVQ $runtime·newosproc0(SB), AX MOVQ $runtime·newosproc0(SB), AX
CALL AX CALL AX
restore:
MOVQ 0x18(SP), BX
MOVQ 0x20(SP), BP
MOVQ 0x28(SP), R12
MOVQ 0x30(SP), R13
MOVQ 0x38(SP), R14
MOVQ 0x40(SP), R15
RET RET
TEXT _rt0_amd64_linux_lib_go(SB),NOSPLIT,$0 TEXT _rt0_amd64_linux_lib_go(SB),NOSPLIT,$0