From: qmuntal Date: Wed, 24 Sep 2025 08:13:44 +0000 (+0200) Subject: runtime: unify riscv64 library entry point X-Git-Tag: go1.26rc1~595 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=36863d6194;p=gostls13.git runtime: unify riscv64 library entry point Cq-Include-Trybots: luci.golang.try:gotip-linux-riscv64 Change-Id: I6470dfc5c9e03dfe5fc535605fdd7d861b9ba2f3 Reviewed-on: https://go-review.googlesource.com/c/go/+/706415 Reviewed-by: Cherry Mui Reviewed-by: Keith Randall Reviewed-by: Joel Sing LUCI-TryBot-Result: Go LUCI --- diff --git a/src/runtime/asm_riscv64.s b/src/runtime/asm_riscv64.s index 6b16d03c9a..efe6047419 100644 --- a/src/runtime/asm_riscv64.s +++ b/src/runtime/asm_riscv64.s @@ -6,6 +6,104 @@ #include "funcdata.h" #include "textflag.h" + +// When building with -buildmode=c-shared, this symbol is called when the shared +// library is loaded. +TEXT _rt0_riscv64_lib(SB),NOSPLIT,$224 + // Preserve callee-save registers, along with X1 (LR). + MOV X1, (8*3)(X2) + MOV X8, (8*4)(X2) + MOV X9, (8*5)(X2) + MOV X18, (8*6)(X2) + MOV X19, (8*7)(X2) + MOV X20, (8*8)(X2) + MOV X21, (8*9)(X2) + MOV X22, (8*10)(X2) + MOV X23, (8*11)(X2) + MOV X24, (8*12)(X2) + MOV X25, (8*13)(X2) + MOV X26, (8*14)(X2) + MOV g, (8*15)(X2) + MOVD F8, (8*16)(X2) + MOVD F9, (8*17)(X2) + MOVD F18, (8*18)(X2) + MOVD F19, (8*19)(X2) + MOVD F20, (8*20)(X2) + MOVD F21, (8*21)(X2) + MOVD F22, (8*22)(X2) + MOVD F23, (8*23)(X2) + MOVD F24, (8*24)(X2) + MOVD F25, (8*25)(X2) + MOVD F26, (8*26)(X2) + MOVD F27, (8*27)(X2) + + // Initialize g as nil in case of using g later e.g. sigaction in cgo_sigaction.go + MOV X0, g + + MOV A0, _rt0_riscv64_lib_argc<>(SB) + MOV A1, _rt0_riscv64_lib_argv<>(SB) + + // Synchronous initialization. + MOV $runtime·libpreinit(SB), T0 + JALR RA, T0 + + // Create a new thread to do the runtime initialization and return. + MOV _cgo_sys_thread_create(SB), T0 + BEQZ T0, nocgo + MOV $_rt0_riscv64_lib_go(SB), A0 + MOV $0, A1 + JALR RA, T0 + JMP restore + +nocgo: + MOV $0x800000, A0 // stacksize = 8192KB + MOV $_rt0_riscv64_lib_go(SB), A1 + MOV A0, 8(X2) + MOV A1, 16(X2) + MOV $runtime·newosproc0(SB), T0 + JALR RA, T0 + +restore: + // Restore callee-save registers, along with X1 (LR). + MOV (8*3)(X2), X1 + MOV (8*4)(X2), X8 + MOV (8*5)(X2), X9 + MOV (8*6)(X2), X18 + MOV (8*7)(X2), X19 + MOV (8*8)(X2), X20 + MOV (8*9)(X2), X21 + MOV (8*10)(X2), X22 + MOV (8*11)(X2), X23 + MOV (8*12)(X2), X24 + MOV (8*13)(X2), X25 + MOV (8*14)(X2), X26 + MOV (8*15)(X2), g + MOVD (8*16)(X2), F8 + MOVD (8*17)(X2), F9 + MOVD (8*18)(X2), F18 + MOVD (8*19)(X2), F19 + MOVD (8*20)(X2), F20 + MOVD (8*21)(X2), F21 + MOVD (8*22)(X2), F22 + MOVD (8*23)(X2), F23 + MOVD (8*24)(X2), F24 + MOVD (8*25)(X2), F25 + MOVD (8*26)(X2), F26 + MOVD (8*27)(X2), F27 + + RET + +TEXT _rt0_riscv64_lib_go(SB),NOSPLIT,$0 + MOV _rt0_riscv64_lib_argc<>(SB), A0 + MOV _rt0_riscv64_lib_argv<>(SB), A1 + MOV $runtime·rt0_go(SB), T0 + JALR ZERO, T0 + +DATA _rt0_riscv64_lib_argc<>(SB)/8, $0 +GLOBL _rt0_riscv64_lib_argc<>(SB),NOPTR, $8 +DATA _rt0_riscv64_lib_argv<>(SB)/8, $0 +GLOBL _rt0_riscv64_lib_argv<>(SB),NOPTR, $8 + // func rt0_go() TEXT runtime·rt0_go(SB),NOSPLIT|TOPFRAME,$0 // X2 = stack; A0 = argc; A1 = argv diff --git a/src/runtime/rt0_freebsd_riscv64.s b/src/runtime/rt0_freebsd_riscv64.s index dc46b70476..f3fb4ffbe7 100644 --- a/src/runtime/rt0_freebsd_riscv64.s +++ b/src/runtime/rt0_freebsd_riscv64.s @@ -12,100 +12,8 @@ TEXT _rt0_riscv64_freebsd(SB),NOSPLIT|NOFRAME,$0 // When building with -buildmode=c-shared, this symbol is called when the shared // library is loaded. -TEXT _rt0_riscv64_freebsd_lib(SB),NOSPLIT,$224 - // Preserve callee-save registers, along with X1 (LR). - MOV X1, (8*3)(X2) - MOV X8, (8*4)(X2) - MOV X9, (8*5)(X2) - MOV X18, (8*6)(X2) - MOV X19, (8*7)(X2) - MOV X20, (8*8)(X2) - MOV X21, (8*9)(X2) - MOV X22, (8*10)(X2) - MOV X23, (8*11)(X2) - MOV X24, (8*12)(X2) - MOV X25, (8*13)(X2) - MOV X26, (8*14)(X2) - MOV g, (8*15)(X2) - MOVD F8, (8*16)(X2) - MOVD F9, (8*17)(X2) - MOVD F18, (8*18)(X2) - MOVD F19, (8*19)(X2) - MOVD F20, (8*20)(X2) - MOVD F21, (8*21)(X2) - MOVD F22, (8*22)(X2) - MOVD F23, (8*23)(X2) - MOVD F24, (8*24)(X2) - MOVD F25, (8*25)(X2) - MOVD F26, (8*26)(X2) - MOVD F27, (8*27)(X2) - - // Initialize g as nil in case of using g later e.g. sigaction in cgo_sigaction.go - MOV X0, g - - MOV A0, _rt0_riscv64_freebsd_lib_argc<>(SB) - MOV A1, _rt0_riscv64_freebsd_lib_argv<>(SB) - - // Synchronous initialization. - MOV $runtime·libpreinit(SB), T0 - JALR RA, T0 - - // Create a new thread to do the runtime initialization and return. - MOV _cgo_sys_thread_create(SB), T0 - BEQZ T0, nocgo - MOV $_rt0_riscv64_freebsd_lib_go(SB), A0 - MOV $0, A1 - JALR RA, T0 - JMP restore - -nocgo: - MOV $0x800000, A0 // stacksize = 8192KB - MOV $_rt0_riscv64_freebsd_lib_go(SB), A1 - MOV A0, 8(X2) - MOV A1, 16(X2) - MOV $runtime·newosproc0(SB), T0 - JALR RA, T0 - -restore: - // Restore callee-save registers, along with X1 (LR). - MOV (8*3)(X2), X1 - MOV (8*4)(X2), X8 - MOV (8*5)(X2), X9 - MOV (8*6)(X2), X18 - MOV (8*7)(X2), X19 - MOV (8*8)(X2), X20 - MOV (8*9)(X2), X21 - MOV (8*10)(X2), X22 - MOV (8*11)(X2), X23 - MOV (8*12)(X2), X24 - MOV (8*13)(X2), X25 - MOV (8*14)(X2), X26 - MOV (8*15)(X2), g - MOVD (8*16)(X2), F8 - MOVD (8*17)(X2), F9 - MOVD (8*18)(X2), F18 - MOVD (8*19)(X2), F19 - MOVD (8*20)(X2), F20 - MOVD (8*21)(X2), F21 - MOVD (8*22)(X2), F22 - MOVD (8*23)(X2), F23 - MOVD (8*24)(X2), F24 - MOVD (8*25)(X2), F25 - MOVD (8*26)(X2), F26 - MOVD (8*27)(X2), F27 - - RET - -TEXT _rt0_riscv64_freebsd_lib_go(SB),NOSPLIT,$0 - MOV _rt0_riscv64_freebsd_lib_argc<>(SB), A0 - MOV _rt0_riscv64_freebsd_lib_argv<>(SB), A1 - MOV $runtime·rt0_go(SB), T0 - JALR ZERO, T0 - -DATA _rt0_riscv64_freebsd_lib_argc<>(SB)/8, $0 -GLOBL _rt0_riscv64_freebsd_lib_argc<>(SB),NOPTR, $8 -DATA _rt0_riscv64_freebsd_lib_argv<>(SB)/8, $0 -GLOBL _rt0_riscv64_freebsd_lib_argv<>(SB),NOPTR, $8 +TEXT _rt0_riscv64_freebsd_lib(SB),NOSPLIT,$0 + JMP _rt0_riscv64_lib(SB) TEXT main(SB),NOSPLIT|NOFRAME,$0 MOV $runtime·rt0_go(SB), T0 diff --git a/src/runtime/rt0_linux_riscv64.s b/src/runtime/rt0_linux_riscv64.s index d6b8ac85dc..4139c9bcec 100644 --- a/src/runtime/rt0_linux_riscv64.s +++ b/src/runtime/rt0_linux_riscv64.s @@ -11,100 +11,8 @@ TEXT _rt0_riscv64_linux(SB),NOSPLIT|NOFRAME,$0 // When building with -buildmode=c-shared, this symbol is called when the shared // library is loaded. -TEXT _rt0_riscv64_linux_lib(SB),NOSPLIT,$224 - // Preserve callee-save registers, along with X1 (LR). - MOV X1, (8*3)(X2) - MOV X8, (8*4)(X2) - MOV X9, (8*5)(X2) - MOV X18, (8*6)(X2) - MOV X19, (8*7)(X2) - MOV X20, (8*8)(X2) - MOV X21, (8*9)(X2) - MOV X22, (8*10)(X2) - MOV X23, (8*11)(X2) - MOV X24, (8*12)(X2) - MOV X25, (8*13)(X2) - MOV X26, (8*14)(X2) - MOV g, (8*15)(X2) - MOVD F8, (8*16)(X2) - MOVD F9, (8*17)(X2) - MOVD F18, (8*18)(X2) - MOVD F19, (8*19)(X2) - MOVD F20, (8*20)(X2) - MOVD F21, (8*21)(X2) - MOVD F22, (8*22)(X2) - MOVD F23, (8*23)(X2) - MOVD F24, (8*24)(X2) - MOVD F25, (8*25)(X2) - MOVD F26, (8*26)(X2) - MOVD F27, (8*27)(X2) - - // Initialize g as nil in case of using g later e.g. sigaction in cgo_sigaction.go - MOV X0, g - - MOV A0, _rt0_riscv64_linux_lib_argc<>(SB) - MOV A1, _rt0_riscv64_linux_lib_argv<>(SB) - - // Synchronous initialization. - MOV $runtime·libpreinit(SB), T0 - JALR RA, T0 - - // Create a new thread to do the runtime initialization and return. - MOV _cgo_sys_thread_create(SB), T0 - BEQZ T0, nocgo - MOV $_rt0_riscv64_linux_lib_go(SB), A0 - MOV $0, A1 - JALR RA, T0 - JMP restore - -nocgo: - MOV $0x800000, A0 // stacksize = 8192KB - MOV $_rt0_riscv64_linux_lib_go(SB), A1 - MOV A0, 8(X2) - MOV A1, 16(X2) - MOV $runtime·newosproc0(SB), T0 - JALR RA, T0 - -restore: - // Restore callee-save registers, along with X1 (LR). - MOV (8*3)(X2), X1 - MOV (8*4)(X2), X8 - MOV (8*5)(X2), X9 - MOV (8*6)(X2), X18 - MOV (8*7)(X2), X19 - MOV (8*8)(X2), X20 - MOV (8*9)(X2), X21 - MOV (8*10)(X2), X22 - MOV (8*11)(X2), X23 - MOV (8*12)(X2), X24 - MOV (8*13)(X2), X25 - MOV (8*14)(X2), X26 - MOV (8*15)(X2), g - MOVD (8*16)(X2), F8 - MOVD (8*17)(X2), F9 - MOVD (8*18)(X2), F18 - MOVD (8*19)(X2), F19 - MOVD (8*20)(X2), F20 - MOVD (8*21)(X2), F21 - MOVD (8*22)(X2), F22 - MOVD (8*23)(X2), F23 - MOVD (8*24)(X2), F24 - MOVD (8*25)(X2), F25 - MOVD (8*26)(X2), F26 - MOVD (8*27)(X2), F27 - - RET - -TEXT _rt0_riscv64_linux_lib_go(SB),NOSPLIT,$0 - MOV _rt0_riscv64_linux_lib_argc<>(SB), A0 - MOV _rt0_riscv64_linux_lib_argv<>(SB), A1 - MOV $runtime·rt0_go(SB), T0 - JALR ZERO, T0 - -DATA _rt0_riscv64_linux_lib_argc<>(SB)/8, $0 -GLOBL _rt0_riscv64_linux_lib_argc<>(SB),NOPTR, $8 -DATA _rt0_riscv64_linux_lib_argv<>(SB)/8, $0 -GLOBL _rt0_riscv64_linux_lib_argv<>(SB),NOPTR, $8 +TEXT _rt0_riscv64_linux_lib(SB),NOSPLIT,$0 + JMP _rt0_riscv64_lib(SB) TEXT main(SB),NOSPLIT|NOFRAME,$0