Text file src/runtime/rt0_aix_ppc64.s

     1  // Copyright 2018 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 "textflag.h"
     6  #include "asm_ppc64x.h"
     7  
     8  // _rt0_ppc64_aix is a function descriptor of the entrypoint function
     9  // __start. This name is needed by cmd/link.
    10  DEFINE_PPC64X_FUNCDESC(_rt0_ppc64_aix, __start<>)
    11  
    12  // The starting function must return in the loader to
    13  // initialise some libraries, especially libthread which
    14  // creates the main thread and adds the TLS in R13
    15  // R19 contains a function descriptor to the loader function
    16  // which needs to be called.
    17  // This code is similar to the __start function in C
    18  TEXT __start<>(SB),NOSPLIT,$-8
    19  	XOR R0, R0
    20  	MOVD $libc___n_pthreads(SB), R4
    21  	MOVD 0(R4), R4
    22  	MOVD $libc___mod_init(SB), R5
    23  	MOVD 0(R5), R5
    24  	MOVD 0(R19), R0
    25  	MOVD R2, 40(R1)
    26  	MOVD 8(R19), R2
    27  	MOVD R18, R3
    28  	MOVD R0, CTR
    29  	BL (CTR) // Return to AIX loader
    30  
    31  	// Launch rt0_go
    32  	MOVD 40(R1), R2
    33  	MOVD R14, R3 // argc
    34  	MOVD R15, R4 // argv
    35  	BL _main(SB)
    36  
    37  
    38  DEFINE_PPC64X_FUNCDESC(main, _main)
    39  TEXT _main(SB),NOSPLIT,$-8
    40  	MOVD $runtime·rt0_go(SB), R12
    41  	MOVD R12, CTR
    42  	BR (CTR)
    43  
    44  // Paramater save space required to cross-call into _cgo_sys_thread_create
    45  #define PARAM_SPACE 16
    46  
    47  TEXT _rt0_ppc64_aix_lib(SB),NOSPLIT,$-8
    48  	// Start with standard C stack frame layout and linkage.
    49  	MOVD	LR, R0
    50  	MOVD	R0, 16(R1) // Save LR in caller's frame.
    51  	MOVW	CR, R0	   // Save CR in caller's frame
    52  	MOVD	R0, 8(R1)
    53  
    54  	MOVDU	R1, -344-PARAM_SPACE(R1) // Allocate frame.
    55  
    56  	// Preserve callee-save registers.
    57  	MOVD	R14, 48+PARAM_SPACE(R1)
    58  	MOVD	R15, 56+PARAM_SPACE(R1)
    59  	MOVD	R16, 64+PARAM_SPACE(R1)
    60  	MOVD	R17, 72+PARAM_SPACE(R1)
    61  	MOVD	R18, 80+PARAM_SPACE(R1)
    62  	MOVD	R19, 88+PARAM_SPACE(R1)
    63  	MOVD	R20, 96+PARAM_SPACE(R1)
    64  	MOVD	R21,104+PARAM_SPACE(R1)
    65  	MOVD	R22, 112+PARAM_SPACE(R1)
    66  	MOVD	R23, 120+PARAM_SPACE(R1)
    67  	MOVD	R24, 128+PARAM_SPACE(R1)
    68  	MOVD	R25, 136+PARAM_SPACE(R1)
    69  	MOVD	R26, 144+PARAM_SPACE(R1)
    70  	MOVD	R27, 152+PARAM_SPACE(R1)
    71  	MOVD	R28, 160+PARAM_SPACE(R1)
    72  	MOVD	R29, 168+PARAM_SPACE(R1)
    73  	MOVD	g, 176+PARAM_SPACE(R1) // R30
    74  	MOVD	R31, 184+PARAM_SPACE(R1)
    75  	FMOVD	F14, 192+PARAM_SPACE(R1)
    76  	FMOVD	F15, 200+PARAM_SPACE(R1)
    77  	FMOVD	F16, 208+PARAM_SPACE(R1)
    78  	FMOVD	F17, 216+PARAM_SPACE(R1)
    79  	FMOVD	F18, 224+PARAM_SPACE(R1)
    80  	FMOVD	F19, 232+PARAM_SPACE(R1)
    81  	FMOVD	F20, 240+PARAM_SPACE(R1)
    82  	FMOVD	F21, 248+PARAM_SPACE(R1)
    83  	FMOVD	F22, 256+PARAM_SPACE(R1)
    84  	FMOVD	F23, 264+PARAM_SPACE(R1)
    85  	FMOVD	F24, 272+PARAM_SPACE(R1)
    86  	FMOVD	F25, 280+PARAM_SPACE(R1)
    87  	FMOVD	F26, 288+PARAM_SPACE(R1)
    88  	FMOVD	F27, 296+PARAM_SPACE(R1)
    89  	FMOVD	F28, 304+PARAM_SPACE(R1)
    90  	FMOVD	F29, 312+PARAM_SPACE(R1)
    91  	FMOVD	F30, 320+PARAM_SPACE(R1)
    92  	FMOVD	F31, 328+PARAM_SPACE(R1)
    93  
    94  	// Synchronous initialization.
    95  	MOVD	$runtime·reginit(SB), R12
    96  	MOVD	R12, CTR
    97  	BL	(CTR)
    98  
    99  	MOVBZ	runtime·isarchive(SB), R3	// Check buildmode = c-archive
   100  	CMP		$0, R3
   101  	BEQ		done
   102  
   103  	MOVD	R14, _rt0_ppc64_aix_lib_argc<>(SB)
   104  	MOVD	R15, _rt0_ppc64_aix_lib_argv<>(SB)
   105  
   106  	MOVD	$runtime·libpreinit(SB), R12
   107  	MOVD	R12, CTR
   108  	BL	(CTR)
   109  
   110  	// Create a new thread to do the runtime initialization and return.
   111  	MOVD	_cgo_sys_thread_create(SB), R12
   112  	CMP	$0, R12
   113  	BEQ	nocgo
   114  	MOVD	$_rt0_ppc64_aix_lib_go(SB), R3
   115  	MOVD	$0, R4
   116  	MOVD	R2, 40(R1)
   117  	MOVD	8(R12), R2
   118  	MOVD	(R12), R12
   119  	MOVD	R12, CTR
   120  	BL	(CTR)
   121  	MOVD	40(R1), R2
   122  	BR	done
   123  
   124  nocgo:
   125  	MOVD	$0x800000, R12					   // stacksize = 8192KB
   126  	MOVD	R12, 8(R1)
   127  	MOVD	$_rt0_ppc64_aix_lib_go(SB), R12
   128  	MOVD	R12, 16(R1)
   129  	MOVD	$runtime·newosproc0(SB),R12
   130  	MOVD	R12, CTR
   131  	BL	(CTR)
   132  
   133  done:
   134  	// Restore saved registers.
   135  	MOVD	48+PARAM_SPACE(R1), R14
   136  	MOVD	56+PARAM_SPACE(R1), R15
   137  	MOVD	64+PARAM_SPACE(R1), R16
   138  	MOVD	72+PARAM_SPACE(R1), R17
   139  	MOVD	80+PARAM_SPACE(R1), R18
   140  	MOVD	88+PARAM_SPACE(R1), R19
   141  	MOVD	96+PARAM_SPACE(R1), R20
   142  	MOVD	104+PARAM_SPACE(R1), R21
   143  	MOVD	112+PARAM_SPACE(R1), R22
   144  	MOVD	120+PARAM_SPACE(R1), R23
   145  	MOVD	128+PARAM_SPACE(R1), R24
   146  	MOVD	136+PARAM_SPACE(R1), R25
   147  	MOVD	144+PARAM_SPACE(R1), R26
   148  	MOVD	152+PARAM_SPACE(R1), R27
   149  	MOVD	160+PARAM_SPACE(R1), R28
   150  	MOVD	168+PARAM_SPACE(R1), R29
   151  	MOVD	176+PARAM_SPACE(R1), g // R30
   152  	MOVD	184+PARAM_SPACE(R1), R31
   153  	FMOVD	196+PARAM_SPACE(R1), F14
   154  	FMOVD	200+PARAM_SPACE(R1), F15
   155  	FMOVD	208+PARAM_SPACE(R1), F16
   156  	FMOVD	216+PARAM_SPACE(R1), F17
   157  	FMOVD	224+PARAM_SPACE(R1), F18
   158  	FMOVD	232+PARAM_SPACE(R1), F19
   159  	FMOVD	240+PARAM_SPACE(R1), F20
   160  	FMOVD	248+PARAM_SPACE(R1), F21
   161  	FMOVD	256+PARAM_SPACE(R1), F22
   162  	FMOVD	264+PARAM_SPACE(R1), F23
   163  	FMOVD	272+PARAM_SPACE(R1), F24
   164  	FMOVD	280+PARAM_SPACE(R1), F25
   165  	FMOVD	288+PARAM_SPACE(R1), F26
   166  	FMOVD	296+PARAM_SPACE(R1), F27
   167  	FMOVD	304+PARAM_SPACE(R1), F28
   168  	FMOVD	312+PARAM_SPACE(R1), F29
   169  	FMOVD	320+PARAM_SPACE(R1), F30
   170  	FMOVD	328+PARAM_SPACE(R1), F31
   171  
   172  	ADD	$344+PARAM_SPACE, R1
   173  
   174  	MOVD	8(R1), R0
   175  	MOVFL	R0, $0xff
   176  	MOVD	16(R1), R0
   177  	MOVD	R0, LR
   178  	RET
   179  
   180  DEFINE_PPC64X_FUNCDESC(_rt0_ppc64_aix_lib_go, __rt0_ppc64_aix_lib_go)
   181  
   182  TEXT __rt0_ppc64_aix_lib_go(SB),NOSPLIT,$0
   183  	MOVD	_rt0_ppc64_aix_lib_argc<>(SB), R3
   184  	MOVD	_rt0_ppc64_aix_lib_argv<>(SB), R4
   185  	MOVD	$runtime·rt0_go(SB), R12
   186  	MOVD	R12, CTR
   187  	BR	(CTR)
   188  
   189  DATA _rt0_ppc64_aix_lib_argc<>(SB)/8, $0
   190  GLOBL _rt0_ppc64_aix_lib_argc<>(SB),NOPTR, $8
   191  DATA _rt0_ppc64_aix_lib_argv<>(SB)/8, $0
   192  GLOBL _rt0_ppc64_aix_lib_argv<>(SB),NOPTR, $8
   193  

View as plain text