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