]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: c-shared entrypoint for linux/arm64
authorDavid Crawshaw <crawshaw@golang.org>
Tue, 27 Oct 2015 23:47:54 +0000 (19:47 -0400)
committerDavid Crawshaw <crawshaw@golang.org>
Wed, 28 Oct 2015 21:21:33 +0000 (21:21 +0000)
Change-Id: I7dab124842f5209097a8d5a802fcbdde650654fa
Reviewed-on: https://go-review.googlesource.com/16395
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/rt0_linux_arm64.s

index 1eb03526096910daed50193805d4832a33f292a4..4027527168b38e4461234866b3d7f5808d20f415 100644 (file)
@@ -9,6 +9,50 @@ TEXT _rt0_arm64_linux(SB),NOSPLIT,$-8
        ADD     $8, RSP, R1     // argv
        BL      main(SB)
 
+// When building with -buildmode=c-shared, this symbol is called when the shared
+// library is loaded.
+TEXT _rt0_arm64_linux_lib(SB),NOSPLIT,$40
+       // R27 is REGTMP, reserved for liblink. It is used below to
+       // move R0/R1 into globals. However in the standard ARM64 calling
+       // convention, it is a callee-saved register.
+       MOVD    R27, 24(RSP)
+
+       MOVD    R0, _rt0_arm64_linux_lib_argc<>(SB)
+       MOVD    R1, _rt0_arm64_linux_lib_argv<>(SB)
+
+       // Create a new thread to do the runtime initialization and return.
+       MOVD    _cgo_sys_thread_create(SB), R4
+       CMP     $0, R4
+       BEQ     nocgo
+       MOVD    $_rt0_arm64_linux_lib_go(SB), R0
+       MOVD    $0, R1
+       BL      (R4)
+       B       restore
+
+nocgo:
+       MOVD    $0x800000, R0                     // stacksize = 8192KB
+       MOVD    $_rt0_arm64_linux_lib_go(SB), R1
+       MOVD    R0, 8(RSP)
+       MOVD    R1, 16(RSP)
+       MOVD    $runtime·newosproc0(SB),R4
+       BL      (R4)
+
+restore:
+       MOVD    24(RSP), R27
+       RET
+
+TEXT _rt0_arm64_linux_lib_go(SB),NOSPLIT,$0
+       MOVD    _rt0_arm64_linux_lib_argc<>(SB), R0
+       MOVD    _rt0_arm64_linux_lib_argv<>(SB), R1
+       MOVD    $runtime·rt0_go(SB),R4
+       B       (R4)
+
+DATA _rt0_arm64_linux_lib_argc<>(SB)/8, $0
+GLOBL _rt0_arm64_linux_lib_argc<>(SB),NOPTR, $8
+DATA _rt0_arm64_linux_lib_argv<>(SB)/8, $0
+GLOBL _rt0_arm64_linux_lib_argv<>(SB),NOPTR, $8
+
+
 TEXT main(SB),NOSPLIT,$-8
        MOVD    $runtime·rt0_go(SB), R2
        BL      (R2)