mirror of
https://github.com/golang/go
synced 2024-11-19 15:14:45 -07:00
9aea0e89b6
_main has an early check to verify if a binary is statically or dynamically linked that depends on R0 being zero. R0 is not guaranteed to be zero at that point and this was breaking Go on Alpine for ppc64le. Change-Id: I4a1059ff7fd3db6fc489e7dcfe631c1814dd965b Reviewed-on: https://go-review.googlesource.com/54730 Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com> Reviewed-by: Lynn Boger <laboger@linux.vnet.ibm.com>
171 lines
3.7 KiB
ArmAsm
171 lines
3.7 KiB
ArmAsm
#include "go_asm.h"
|
|
#include "textflag.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,$-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, -320(R1) // Allocate frame.
|
|
|
|
// Preserve callee-save registers.
|
|
MOVD R14, 24(R1)
|
|
MOVD R15, 32(R1)
|
|
MOVD R16, 40(R1)
|
|
MOVD R17, 48(R1)
|
|
MOVD R18, 56(R1)
|
|
MOVD R19, 64(R1)
|
|
MOVD R20, 72(R1)
|
|
MOVD R21, 80(R1)
|
|
MOVD R22, 88(R1)
|
|
MOVD R23, 96(R1)
|
|
MOVD R24, 104(R1)
|
|
MOVD R25, 112(R1)
|
|
MOVD R26, 120(R1)
|
|
MOVD R27, 128(R1)
|
|
MOVD R28, 136(R1)
|
|
MOVD R29, 144(R1)
|
|
MOVD g, 152(R1) // R30
|
|
MOVD R31, 160(R1)
|
|
FMOVD F14, 168(R1)
|
|
FMOVD F15, 176(R1)
|
|
FMOVD F16, 184(R1)
|
|
FMOVD F17, 192(R1)
|
|
FMOVD F18, 200(R1)
|
|
FMOVD F19, 208(R1)
|
|
FMOVD F20, 216(R1)
|
|
FMOVD F21, 224(R1)
|
|
FMOVD F22, 232(R1)
|
|
FMOVD F23, 240(R1)
|
|
FMOVD F24, 248(R1)
|
|
FMOVD F25, 256(R1)
|
|
FMOVD F26, 264(R1)
|
|
FMOVD F27, 272(R1)
|
|
FMOVD F28, 280(R1)
|
|
FMOVD F29, 288(R1)
|
|
FMOVD F30, 296(R1)
|
|
FMOVD F31, 304(R1)
|
|
|
|
MOVD R3, _rt0_ppc64le_linux_lib_argc<>(SB)
|
|
MOVD R4, _rt0_ppc64le_linux_lib_argv<>(SB)
|
|
|
|
// Synchronous initialization.
|
|
MOVD $runtime·reginit(SB), R12
|
|
MOVD R12, CTR
|
|
BL (CTR)
|
|
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(R1)
|
|
MOVD $_rt0_ppc64le_linux_lib_go(SB), R12
|
|
MOVD R12, 16(R1)
|
|
MOVD $runtime·newosproc0(SB),R12
|
|
MOVD R12, CTR
|
|
BL (CTR)
|
|
|
|
done:
|
|
// Restore saved registers.
|
|
MOVD 24(R1), R14
|
|
MOVD 32(R1), R15
|
|
MOVD 40(R1), R16
|
|
MOVD 48(R1), R17
|
|
MOVD 56(R1), R18
|
|
MOVD 64(R1), R19
|
|
MOVD 72(R1), R20
|
|
MOVD 80(R1), R21
|
|
MOVD 88(R1), R22
|
|
MOVD 96(R1), R23
|
|
MOVD 104(R1), R24
|
|
MOVD 112(R1), R25
|
|
MOVD 120(R1), R26
|
|
MOVD 128(R1), R27
|
|
MOVD 136(R1), R28
|
|
MOVD 144(R1), R29
|
|
MOVD 152(R1), g // R30
|
|
MOVD 160(R1), R31
|
|
FMOVD 168(R1), F14
|
|
FMOVD 176(R1), F15
|
|
FMOVD 184(R1), F16
|
|
FMOVD 192(R1), F17
|
|
FMOVD 200(R1), F18
|
|
FMOVD 208(R1), F19
|
|
FMOVD 216(R1), F20
|
|
FMOVD 224(R1), F21
|
|
FMOVD 232(R1), F22
|
|
FMOVD 240(R1), F23
|
|
FMOVD 248(R1), F24
|
|
FMOVD 256(R1), F25
|
|
FMOVD 264(R1), F26
|
|
FMOVD 272(R1), F27
|
|
FMOVD 280(R1), F28
|
|
FMOVD 288(R1), F29
|
|
FMOVD 296(R1), F30
|
|
FMOVD 304(R1), F31
|
|
|
|
ADD $320, R1
|
|
MOVD 8(R1), R0
|
|
MOVFL R0, $0xff
|
|
MOVD 16(R1), R0
|
|
MOVD R0, LR
|
|
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
|
|
// In a statically linked binary, the stack contains argc,
|
|
// argv as argc string pointers followed by a NULL, envv as a
|
|
// sequence of string pointers followed by a NULL, and auxv.
|
|
// There is no TLS base pointer.
|
|
//
|
|
// In a dynamically linked binary, r3 contains argc, r4
|
|
// contains argv, r5 contains envp, r6 contains auxv, and r13
|
|
// contains the TLS pointer.
|
|
//
|
|
// Figure out which case this is by looking at r4: if it's 0,
|
|
// we're statically linked; otherwise we're dynamically
|
|
// linked.
|
|
CMP R0, R4
|
|
BNE dlink
|
|
|
|
// Statically linked
|
|
MOVD 0(R1), R3 // argc
|
|
ADD $8, R1, R4 // argv
|
|
MOVD $runtime·m0+m_tls(SB), R13 // TLS
|
|
ADD $0x7000, R13
|
|
|
|
dlink:
|
|
BR main(SB)
|
|
|
|
TEXT main(SB),NOSPLIT,$-8
|
|
MOVD $runtime·rt0_go(SB), R12
|
|
MOVD R12, CTR
|
|
BR (CTR)
|