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. 10DEFINE_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 18TEXT __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 38DEFINE_PPC64X_FUNCDESC(main, _main) 39TEXT _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 47TEXT _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 124nocgo: 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 133done: 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 180DEFINE_PPC64X_FUNCDESC(_rt0_ppc64_aix_lib_go, __rt0_ppc64_aix_lib_go) 181 182TEXT __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 189DATA _rt0_ppc64_aix_lib_argc<>(SB)/8, $0 190GLOBL _rt0_ppc64_aix_lib_argc<>(SB),NOPTR, $8 191DATA _rt0_ppc64_aix_lib_argv<>(SB)/8, $0 192GLOBL _rt0_ppc64_aix_lib_argv<>(SB),NOPTR, $8 193