From 80eeec69790b55861a1e30d16d3663763989ae15 Mon Sep 17 00:00:00 2001 From: limeidan Date: Thu, 25 Aug 2022 11:07:25 +0800 Subject: [PATCH] runtime: add support for --buildmode=c-shared on loong64 These c-shared related CLs are follow up of CLs 455016, 455017, 455018. Here we follow the LoongArch ELF psABI v2 standard, which requires the support of the PCALAU12I instruction. Updates #53301 Updates #58784 Change-Id: I7f1ddbf3b2470d610f12069d147aa9b3a6a96f32 Reviewed-on: https://go-review.googlesource.com/c/go/+/425474 Reviewed-by: abner chenc Reviewed-by: WANG Xuerui Reviewed-by: Ian Lance Taylor Reviewed-by: Michael Knyszek Run-TryBot: Ian Lance Taylor Auto-Submit: Ian Lance Taylor TryBot-Result: Gopher Robot --- src/runtime/rt0_linux_loong64.s | 51 +++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/runtime/rt0_linux_loong64.s b/src/runtime/rt0_linux_loong64.s index b9aaa510e1..b52f7d530a 100644 --- a/src/runtime/rt0_linux_loong64.s +++ b/src/runtime/rt0_linux_loong64.s @@ -3,6 +3,7 @@ // license that can be found in the LICENSE file. #include "textflag.h" +#include "cgo/abi_loong64.h" TEXT _rt0_loong64_linux(SB),NOSPLIT|NOFRAME,$0 // In a statically linked binary, the stack contains argc, @@ -13,6 +14,56 @@ TEXT _rt0_loong64_linux(SB),NOSPLIT|NOFRAME,$0 ADDV $8, R3, R5 // argv JMP main(SB) +// When building with -buildmode=c-shared, this symbol is called when the shared +// library is loaded. +TEXT _rt0_loong64_linux_lib(SB),NOSPLIT,$168 + // Preserve callee-save registers. + SAVE_R22_TO_R31(3*8) + SAVE_F24_TO_F31(13*8) + + // Initialize g as nil in case of using g later e.g. sigaction in cgo_sigaction.go + MOVV R0, g + + MOVV R4, _rt0_loong64_linux_lib_argc<>(SB) + MOVV R5, _rt0_loong64_linux_lib_argv<>(SB) + + // Synchronous initialization. + MOVV $runtime·libpreinit(SB), R19 + JAL (R19) + + // Create a new thread to do the runtime initialization and return. + MOVV _cgo_sys_thread_create(SB), R19 + BEQ R19, nocgo + MOVV $_rt0_loong64_linux_lib_go(SB), R4 + MOVV $0, R5 + JAL (R19) + JMP restore + +nocgo: + MOVV $0x800000, R4 // stacksize = 8192KB + MOVV $_rt0_loong64_linux_lib_go(SB), R5 + MOVV R4, 8(R3) + MOVV R5, 16(R3) + MOVV $runtime·newosproc0(SB), R19 + JAL (R19) + +restore: + // Restore callee-save registers. + RESTORE_R22_TO_R31(3*8) + RESTORE_F24_TO_F31(13*8) + RET + +TEXT _rt0_loong64_linux_lib_go(SB),NOSPLIT,$0 + MOVV _rt0_loong64_linux_lib_argc<>(SB), R4 + MOVV _rt0_loong64_linux_lib_argv<>(SB), R5 + MOVV $runtime·rt0_go(SB),R19 + JMP (R19) + +DATA _rt0_loong64_linux_lib_argc<>(SB)/8, $0 +GLOBL _rt0_loong64_linux_lib_argc<>(SB),NOPTR, $8 +DATA _rt0_loong64_linux_lib_argv<>(SB)/8, $0 +GLOBL _rt0_loong64_linux_lib_argv<>(SB),NOPTR, $8 + TEXT main(SB),NOSPLIT|NOFRAME,$0 // in external linking, glibc jumps to main with argc in R4 // and argv in R5 -- 2.48.1