Text file src/runtime/rt0_linux_ppc64le.s

     1  // Copyright 2016 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  #include "go_asm.h"
     6  #include "textflag.h"
     7  #include "asm_ppc64x.h"
     8  #include "cgo/abi_ppc64x.h"
     9  
    10  TEXT _rt0_ppc64le_linux(SB),NOSPLIT,$0
    11  	XOR R0, R0	  // Make sure R0 is zero before _main
    12  	BR _main<>(SB)
    13  
    14  TEXT _rt0_ppc64le_linux_lib(SB),NOSPLIT|NOFRAME,$0
    15  	// This is called with ELFv2 calling conventions. Convert to Go.
    16  	// Allocate argument storage for call to newosproc0.
    17  	STACK_AND_SAVE_HOST_TO_GO_ABI(16)
    18  
    19  	MOVD	R3, _rt0_ppc64le_linux_lib_argc<>(SB)
    20  	MOVD	R4, _rt0_ppc64le_linux_lib_argv<>(SB)
    21  
    22  	// Synchronous initialization.
    23  	MOVD	$runtime·libpreinit(SB), R12
    24  	MOVD	R12, CTR
    25  	BL	(CTR)
    26  
    27  	// Create a new thread to do the runtime initialization and return.
    28  	MOVD	_cgo_sys_thread_create(SB), R12
    29  	CMP	$0, R12
    30  	BEQ	nocgo
    31  	MOVD	$_rt0_ppc64le_linux_lib_go(SB), R3
    32  	MOVD	$0, R4
    33  	MOVD	R12, CTR
    34  	BL	(CTR)
    35  	BR	done
    36  
    37  nocgo:
    38  	MOVD	$0x800000, R12                     // stacksize = 8192KB
    39  	MOVD	R12, 8+FIXED_FRAME(R1)
    40  	MOVD	$_rt0_ppc64le_linux_lib_go(SB), R12
    41  	MOVD	R12, 16+FIXED_FRAME(R1)
    42  	MOVD	$runtime·newosproc0(SB),R12
    43  	MOVD	R12, CTR
    44  	BL	(CTR)
    45  
    46  done:
    47  	// Restore and return to ELFv2 caller.
    48  	UNSTACK_AND_RESTORE_GO_TO_HOST_ABI(16)
    49  	RET
    50  
    51  TEXT _rt0_ppc64le_linux_lib_go(SB),NOSPLIT,$0
    52  	MOVD	_rt0_ppc64le_linux_lib_argc<>(SB), R3
    53  	MOVD	_rt0_ppc64le_linux_lib_argv<>(SB), R4
    54  	MOVD	$runtime·rt0_go(SB), R12
    55  	MOVD	R12, CTR
    56  	BR	(CTR)
    57  
    58  DATA _rt0_ppc64le_linux_lib_argc<>(SB)/8, $0
    59  GLOBL _rt0_ppc64le_linux_lib_argc<>(SB),NOPTR, $8
    60  DATA _rt0_ppc64le_linux_lib_argv<>(SB)/8, $0
    61  GLOBL _rt0_ppc64le_linux_lib_argv<>(SB),NOPTR, $8
    62  
    63  TEXT _main<>(SB),NOSPLIT,$-8
    64  	// In a statically linked binary, the stack contains argc,
    65  	// argv as argc string pointers followed by a NULL, envv as a
    66  	// sequence of string pointers followed by a NULL, and auxv.
    67  	// The TLS pointer should be initialized to 0.
    68  	//
    69  	// In an ELFv2 compliant dynamically linked binary, R3 contains argc,
    70  	// R4 contains argv, R5 contains envp, R6 contains auxv, and R13
    71  	// contains the TLS pointer.
    72  	//
    73  	// When loading via glibc, the first doubleword on the stack points
    74  	// to NULL a value. (that is *(uintptr)(R1) == 0). This is used to
    75  	// differentiate static vs dynamically linked binaries.
    76  	//
    77  	// If loading with the musl loader, it doesn't follow the ELFv2 ABI. It
    78  	// passes argc/argv similar to the linux kernel, R13 (TLS) is
    79  	// initialized, and R3/R4 are undefined.
    80  	MOVD	(R1), R12
    81  	CMP	R0, R12
    82  	BEQ	tls_and_argcv_in_reg
    83  
    84  	// Arguments are passed via the stack (musl loader or a static binary)
    85  	MOVD	0(R1), R3 // argc
    86  	ADD	$8, R1, R4 // argv
    87  
    88  	// Did the TLS pointer get set? If so, don't change it (e.g musl).
    89  	CMP	R0, R13
    90  	BNE	tls_and_argcv_in_reg
    91  
    92  	MOVD	$runtime·m0+m_tls(SB), R13 // TLS
    93  	ADD	$0x7000, R13
    94  
    95  tls_and_argcv_in_reg:
    96  	BR	main(SB)
    97  
    98  TEXT main(SB),NOSPLIT,$-8
    99  	MOVD	$runtime·rt0_go(SB), R12
   100  	MOVD	R12, CTR
   101  	BR	(CTR)
   102  

View as plain text