runtime: unify ppc64/ppc64le library entry point

Cq-Include-Trybots: luci.golang.try:gotip-linux-ppc64le_power10
Change-Id: Ifd7861488b1b47a5d30163552b51838f2bef7248
Reviewed-on: https://go-review.googlesource.com/c/go/+/706395
Reviewed-by: Carlos Amedee <carlos@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
Auto-Submit: Keith Randall <khr@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
qmuntal 2025-09-24 08:58:30 +02:00 committed by Gopher Robot
parent 4ff8a457db
commit c9257151e5
3 changed files with 60 additions and 197 deletions

View file

@ -9,6 +9,63 @@
#include "funcdata.h"
#include "textflag.h"
#include "asm_ppc64x.h"
#include "cgo/abi_ppc64x.h"
TEXT _rt0_ppc64x_lib(SB),NOSPLIT|NOFRAME,$0
// This is called with ELFv2 calling conventions. Convert to Go.
// Allocate argument storage for call to newosproc0.
STACK_AND_SAVE_HOST_TO_GO_ABI(16)
MOVD R3, _rt0_ppc64x_lib_argc<>(SB)
MOVD R4, _rt0_ppc64x_lib_argv<>(SB)
// Synchronous initialization.
MOVD $runtime·libpreinit(SB), R12
MOVD R12, CTR
BL (CTR)
// Create a new thread to do the runtime initialization and return.
MOVD _cgo_sys_thread_create(SB), R12
CMP $0, R12
BEQ nocgo
MOVD $_rt0_ppc64x_lib_go(SB), R3
MOVD $0, R4
MOVD R12, CTR
BL (CTR)
BR done
nocgo:
MOVD $0x800000, R12 // stacksize = 8192KB
MOVD R12, 8+FIXED_FRAME(R1)
MOVD $_rt0_ppc64x_lib_go(SB), R12
MOVD R12, 16+FIXED_FRAME(R1)
MOVD $runtime·newosproc0(SB),R12
MOVD R12, CTR
BL (CTR)
done:
// Restore and return to ELFv2 caller.
UNSTACK_AND_RESTORE_GO_TO_HOST_ABI(16)
RET
#ifdef GO_PPC64X_HAS_FUNCDESC
DEFINE_PPC64X_FUNCDESC(_rt0_ppc64x_lib_go, __rt0_ppc64x_lib_go)
TEXT __rt0_ppc64x_lib_go(SB),NOSPLIT,$0
#else
TEXT _rt0_ppc64x_lib_go(SB),NOSPLIT,$0
#endif
MOVD _rt0_ppc64x_lib_argc<>(SB), R3
MOVD _rt0_ppc64x_lib_argv<>(SB), R4
MOVD $runtime·rt0_go(SB), R12
MOVD R12, CTR
BR (CTR)
DATA _rt0_ppc64x_lib_argc<>(SB)/8, $0
GLOBL _rt0_ppc64x_lib_argc<>(SB),NOPTR, $8
DATA _rt0_ppc64x_lib_argv<>(SB)/8, $0
GLOBL _rt0_ppc64x_lib_argv<>(SB),NOPTR, $8
#ifdef GOOS_aix
#define cgoCalleeStackSize 48

View file

@ -41,152 +41,5 @@ TEXT _main(SB),NOSPLIT,$-8
MOVD R12, CTR
BR (CTR)
// Paramater save space required to cross-call into _cgo_sys_thread_create
#define PARAM_SPACE 16
TEXT _rt0_ppc64_aix_lib(SB),NOSPLIT,$-8
// Start with standard C stack frame layout and linkage.
MOVD LR, R0
MOVD R0, 16(R1) // Save LR in caller's frame.
MOVW CR, R0 // Save CR in caller's frame
MOVD R0, 8(R1)
MOVDU R1, -344-PARAM_SPACE(R1) // Allocate frame.
// Preserve callee-save registers.
MOVD R14, 48+PARAM_SPACE(R1)
MOVD R15, 56+PARAM_SPACE(R1)
MOVD R16, 64+PARAM_SPACE(R1)
MOVD R17, 72+PARAM_SPACE(R1)
MOVD R18, 80+PARAM_SPACE(R1)
MOVD R19, 88+PARAM_SPACE(R1)
MOVD R20, 96+PARAM_SPACE(R1)
MOVD R21,104+PARAM_SPACE(R1)
MOVD R22, 112+PARAM_SPACE(R1)
MOVD R23, 120+PARAM_SPACE(R1)
MOVD R24, 128+PARAM_SPACE(R1)
MOVD R25, 136+PARAM_SPACE(R1)
MOVD R26, 144+PARAM_SPACE(R1)
MOVD R27, 152+PARAM_SPACE(R1)
MOVD R28, 160+PARAM_SPACE(R1)
MOVD R29, 168+PARAM_SPACE(R1)
MOVD g, 176+PARAM_SPACE(R1) // R30
MOVD R31, 184+PARAM_SPACE(R1)
FMOVD F14, 192+PARAM_SPACE(R1)
FMOVD F15, 200+PARAM_SPACE(R1)
FMOVD F16, 208+PARAM_SPACE(R1)
FMOVD F17, 216+PARAM_SPACE(R1)
FMOVD F18, 224+PARAM_SPACE(R1)
FMOVD F19, 232+PARAM_SPACE(R1)
FMOVD F20, 240+PARAM_SPACE(R1)
FMOVD F21, 248+PARAM_SPACE(R1)
FMOVD F22, 256+PARAM_SPACE(R1)
FMOVD F23, 264+PARAM_SPACE(R1)
FMOVD F24, 272+PARAM_SPACE(R1)
FMOVD F25, 280+PARAM_SPACE(R1)
FMOVD F26, 288+PARAM_SPACE(R1)
FMOVD F27, 296+PARAM_SPACE(R1)
FMOVD F28, 304+PARAM_SPACE(R1)
FMOVD F29, 312+PARAM_SPACE(R1)
FMOVD F30, 320+PARAM_SPACE(R1)
FMOVD F31, 328+PARAM_SPACE(R1)
// Synchronous initialization.
MOVD $runtime·reginit(SB), R12
MOVD R12, CTR
BL (CTR)
MOVBZ runtime·isarchive(SB), R3 // Check buildmode = c-archive
CMP $0, R3
BEQ done
MOVD R14, _rt0_ppc64_aix_lib_argc<>(SB)
MOVD R15, _rt0_ppc64_aix_lib_argv<>(SB)
MOVD $runtime·libpreinit(SB), R12
MOVD R12, CTR
BL (CTR)
// Create a new thread to do the runtime initialization and return.
MOVD _cgo_sys_thread_create(SB), R12
CMP $0, R12
BEQ nocgo
MOVD $_rt0_ppc64_aix_lib_go(SB), R3
MOVD $0, R4
MOVD R2, 40(R1)
MOVD 8(R12), R2
MOVD (R12), R12
MOVD R12, CTR
BL (CTR)
MOVD 40(R1), R2
BR done
nocgo:
MOVD $0x800000, R12 // stacksize = 8192KB
MOVD R12, 8(R1)
MOVD $_rt0_ppc64_aix_lib_go(SB), R12
MOVD R12, 16(R1)
MOVD $runtime·newosproc0(SB),R12
MOVD R12, CTR
BL (CTR)
done:
// Restore saved registers.
MOVD 48+PARAM_SPACE(R1), R14
MOVD 56+PARAM_SPACE(R1), R15
MOVD 64+PARAM_SPACE(R1), R16
MOVD 72+PARAM_SPACE(R1), R17
MOVD 80+PARAM_SPACE(R1), R18
MOVD 88+PARAM_SPACE(R1), R19
MOVD 96+PARAM_SPACE(R1), R20
MOVD 104+PARAM_SPACE(R1), R21
MOVD 112+PARAM_SPACE(R1), R22
MOVD 120+PARAM_SPACE(R1), R23
MOVD 128+PARAM_SPACE(R1), R24
MOVD 136+PARAM_SPACE(R1), R25
MOVD 144+PARAM_SPACE(R1), R26
MOVD 152+PARAM_SPACE(R1), R27
MOVD 160+PARAM_SPACE(R1), R28
MOVD 168+PARAM_SPACE(R1), R29
MOVD 176+PARAM_SPACE(R1), g // R30
MOVD 184+PARAM_SPACE(R1), R31
FMOVD 196+PARAM_SPACE(R1), F14
FMOVD 200+PARAM_SPACE(R1), F15
FMOVD 208+PARAM_SPACE(R1), F16
FMOVD 216+PARAM_SPACE(R1), F17
FMOVD 224+PARAM_SPACE(R1), F18
FMOVD 232+PARAM_SPACE(R1), F19
FMOVD 240+PARAM_SPACE(R1), F20
FMOVD 248+PARAM_SPACE(R1), F21
FMOVD 256+PARAM_SPACE(R1), F22
FMOVD 264+PARAM_SPACE(R1), F23
FMOVD 272+PARAM_SPACE(R1), F24
FMOVD 280+PARAM_SPACE(R1), F25
FMOVD 288+PARAM_SPACE(R1), F26
FMOVD 296+PARAM_SPACE(R1), F27
FMOVD 304+PARAM_SPACE(R1), F28
FMOVD 312+PARAM_SPACE(R1), F29
FMOVD 320+PARAM_SPACE(R1), F30
FMOVD 328+PARAM_SPACE(R1), F31
ADD $344+PARAM_SPACE, R1
MOVD 8(R1), R0
MOVFL R0, $0xff
MOVD 16(R1), R0
MOVD R0, LR
RET
DEFINE_PPC64X_FUNCDESC(_rt0_ppc64_aix_lib_go, __rt0_ppc64_aix_lib_go)
TEXT __rt0_ppc64_aix_lib_go(SB),NOSPLIT,$0
MOVD _rt0_ppc64_aix_lib_argc<>(SB), R3
MOVD _rt0_ppc64_aix_lib_argv<>(SB), R4
MOVD $runtime·rt0_go(SB), R12
MOVD R12, CTR
BR (CTR)
DATA _rt0_ppc64_aix_lib_argc<>(SB)/8, $0
GLOBL _rt0_ppc64_aix_lib_argc<>(SB),NOPTR, $8
DATA _rt0_ppc64_aix_lib_argv<>(SB)/8, $0
GLOBL _rt0_ppc64_aix_lib_argv<>(SB),NOPTR, $8
TEXT _rt0_ppc64_aix_lib(SB),NOSPLIT,$0
JMP _rt0_ppc64x_lib(SB)

View file

@ -5,60 +5,13 @@
#include "go_asm.h"
#include "textflag.h"
#include "asm_ppc64x.h"
#include "cgo/abi_ppc64x.h"
TEXT _rt0_ppc64le_linux(SB),NOSPLIT,$0
XOR R0, R0 // Make sure R0 is zero before _main
BR _main<>(SB)
TEXT _rt0_ppc64le_linux_lib(SB),NOSPLIT|NOFRAME,$0
// This is called with ELFv2 calling conventions. Convert to Go.
// Allocate argument storage for call to newosproc0.
STACK_AND_SAVE_HOST_TO_GO_ABI(16)
MOVD R3, _rt0_ppc64le_linux_lib_argc<>(SB)
MOVD R4, _rt0_ppc64le_linux_lib_argv<>(SB)
// Synchronous initialization.
MOVD $runtime·libpreinit(SB), R12
MOVD R12, CTR
BL (CTR)
// Create a new thread to do the runtime initialization and return.
MOVD _cgo_sys_thread_create(SB), R12
CMP $0, R12
BEQ nocgo
MOVD $_rt0_ppc64le_linux_lib_go(SB), R3
MOVD $0, R4
MOVD R12, CTR
BL (CTR)
BR done
nocgo:
MOVD $0x800000, R12 // stacksize = 8192KB
MOVD R12, 8+FIXED_FRAME(R1)
MOVD $_rt0_ppc64le_linux_lib_go(SB), R12
MOVD R12, 16+FIXED_FRAME(R1)
MOVD $runtime·newosproc0(SB),R12
MOVD R12, CTR
BL (CTR)
done:
// Restore and return to ELFv2 caller.
UNSTACK_AND_RESTORE_GO_TO_HOST_ABI(16)
RET
TEXT _rt0_ppc64le_linux_lib_go(SB),NOSPLIT,$0
MOVD _rt0_ppc64le_linux_lib_argc<>(SB), R3
MOVD _rt0_ppc64le_linux_lib_argv<>(SB), R4
MOVD $runtime·rt0_go(SB), R12
MOVD R12, CTR
BR (CTR)
DATA _rt0_ppc64le_linux_lib_argc<>(SB)/8, $0
GLOBL _rt0_ppc64le_linux_lib_argc<>(SB),NOPTR, $8
DATA _rt0_ppc64le_linux_lib_argv<>(SB)/8, $0
GLOBL _rt0_ppc64le_linux_lib_argv<>(SB),NOPTR, $8
JMP _rt0_ppc64x_lib(SB)
TEXT _main<>(SB),NOSPLIT,$-8
// In a statically linked binary, the stack contains argc,