mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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:
parent
4ff8a457db
commit
c9257151e5
3 changed files with 60 additions and 197 deletions
|
|
@ -9,6 +9,63 @@
|
||||||
#include "funcdata.h"
|
#include "funcdata.h"
|
||||||
#include "textflag.h"
|
#include "textflag.h"
|
||||||
#include "asm_ppc64x.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
|
#ifdef GOOS_aix
|
||||||
#define cgoCalleeStackSize 48
|
#define cgoCalleeStackSize 48
|
||||||
|
|
|
||||||
|
|
@ -41,152 +41,5 @@ TEXT _main(SB),NOSPLIT,$-8
|
||||||
MOVD R12, CTR
|
MOVD R12, CTR
|
||||||
BR (CTR)
|
BR (CTR)
|
||||||
|
|
||||||
// Paramater save space required to cross-call into _cgo_sys_thread_create
|
TEXT _rt0_ppc64_aix_lib(SB),NOSPLIT,$0
|
||||||
#define PARAM_SPACE 16
|
JMP _rt0_ppc64x_lib(SB)
|
||||||
|
|
||||||
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
|
|
||||||
|
|
|
||||||
|
|
@ -5,60 +5,13 @@
|
||||||
#include "go_asm.h"
|
#include "go_asm.h"
|
||||||
#include "textflag.h"
|
#include "textflag.h"
|
||||||
#include "asm_ppc64x.h"
|
#include "asm_ppc64x.h"
|
||||||
#include "cgo/abi_ppc64x.h"
|
|
||||||
|
|
||||||
TEXT _rt0_ppc64le_linux(SB),NOSPLIT,$0
|
TEXT _rt0_ppc64le_linux(SB),NOSPLIT,$0
|
||||||
XOR R0, R0 // Make sure R0 is zero before _main
|
XOR R0, R0 // Make sure R0 is zero before _main
|
||||||
BR _main<>(SB)
|
BR _main<>(SB)
|
||||||
|
|
||||||
TEXT _rt0_ppc64le_linux_lib(SB),NOSPLIT|NOFRAME,$0
|
TEXT _rt0_ppc64le_linux_lib(SB),NOSPLIT|NOFRAME,$0
|
||||||
// This is called with ELFv2 calling conventions. Convert to Go.
|
JMP _rt0_ppc64x_lib(SB)
|
||||||
// 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
|
|
||||||
|
|
||||||
TEXT _main<>(SB),NOSPLIT,$-8
|
TEXT _main<>(SB),NOSPLIT,$-8
|
||||||
// In a statically linked binary, the stack contains argc,
|
// In a statically linked binary, the stack contains argc,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue