github.com/ice-blockchain/go/src@v0.0.0-20240403114104-1564d284e521/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 #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 45 TEXT _rt0_ppc64_aix_lib(SB),NOSPLIT,$-8 46 // Start with standard C stack frame layout and linkage. 47 MOVD LR, R0 48 MOVD R0, 16(R1) // Save LR in caller's frame. 49 MOVW CR, R0 // Save CR in caller's frame 50 MOVD R0, 8(R1) 51 52 MOVDU R1, -344(R1) // Allocate frame. 53 54 // Preserve callee-save registers. 55 MOVD R14, 48(R1) 56 MOVD R15, 56(R1) 57 MOVD R16, 64(R1) 58 MOVD R17, 72(R1) 59 MOVD R18, 80(R1) 60 MOVD R19, 88(R1) 61 MOVD R20, 96(R1) 62 MOVD R21,104(R1) 63 MOVD R22, 112(R1) 64 MOVD R23, 120(R1) 65 MOVD R24, 128(R1) 66 MOVD R25, 136(R1) 67 MOVD R26, 144(R1) 68 MOVD R27, 152(R1) 69 MOVD R28, 160(R1) 70 MOVD R29, 168(R1) 71 MOVD g, 176(R1) // R30 72 MOVD R31, 184(R1) 73 FMOVD F14, 192(R1) 74 FMOVD F15, 200(R1) 75 FMOVD F16, 208(R1) 76 FMOVD F17, 216(R1) 77 FMOVD F18, 224(R1) 78 FMOVD F19, 232(R1) 79 FMOVD F20, 240(R1) 80 FMOVD F21, 248(R1) 81 FMOVD F22, 256(R1) 82 FMOVD F23, 264(R1) 83 FMOVD F24, 272(R1) 84 FMOVD F25, 280(R1) 85 FMOVD F26, 288(R1) 86 FMOVD F27, 296(R1) 87 FMOVD F28, 304(R1) 88 FMOVD F29, 312(R1) 89 FMOVD F30, 320(R1) 90 FMOVD F31, 328(R1) 91 92 // Synchronous initialization. 93 MOVD $runtime·reginit(SB), R12 94 MOVD R12, CTR 95 BL (CTR) 96 97 MOVBZ runtime·isarchive(SB), R3 // Check buildmode = c-archive 98 CMP $0, R3 99 BEQ done 100 101 MOVD R14, _rt0_ppc64_aix_lib_argc<>(SB) 102 MOVD R15, _rt0_ppc64_aix_lib_argv<>(SB) 103 104 MOVD $runtime·libpreinit(SB), R12 105 MOVD R12, CTR 106 BL (CTR) 107 108 // Create a new thread to do the runtime initialization and return. 109 MOVD _cgo_sys_thread_create(SB), R12 110 CMP $0, R12 111 BEQ nocgo 112 MOVD $_rt0_ppc64_aix_lib_go(SB), R3 113 MOVD $0, R4 114 MOVD R2, 40(R1) 115 MOVD 8(R12), R2 116 MOVD (R12), R12 117 MOVD R12, CTR 118 BL (CTR) 119 MOVD 40(R1), R2 120 BR done 121 122 nocgo: 123 MOVD $0x800000, R12 // stacksize = 8192KB 124 MOVD R12, 8(R1) 125 MOVD $_rt0_ppc64_aix_lib_go(SB), R12 126 MOVD R12, 16(R1) 127 MOVD $runtime·newosproc0(SB),R12 128 MOVD R12, CTR 129 BL (CTR) 130 131 done: 132 // Restore saved registers. 133 MOVD 48(R1), R14 134 MOVD 56(R1), R15 135 MOVD 64(R1), R16 136 MOVD 72(R1), R17 137 MOVD 80(R1), R18 138 MOVD 88(R1), R19 139 MOVD 96(R1), R20 140 MOVD 104(R1), R21 141 MOVD 112(R1), R22 142 MOVD 120(R1), R23 143 MOVD 128(R1), R24 144 MOVD 136(R1), R25 145 MOVD 144(R1), R26 146 MOVD 152(R1), R27 147 MOVD 160(R1), R28 148 MOVD 168(R1), R29 149 MOVD 176(R1), g // R30 150 MOVD 184(R1), R31 151 FMOVD 196(R1), F14 152 FMOVD 200(R1), F15 153 FMOVD 208(R1), F16 154 FMOVD 216(R1), F17 155 FMOVD 224(R1), F18 156 FMOVD 232(R1), F19 157 FMOVD 240(R1), F20 158 FMOVD 248(R1), F21 159 FMOVD 256(R1), F22 160 FMOVD 264(R1), F23 161 FMOVD 272(R1), F24 162 FMOVD 280(R1), F25 163 FMOVD 288(R1), F26 164 FMOVD 296(R1), F27 165 FMOVD 304(R1), F28 166 FMOVD 312(R1), F29 167 FMOVD 320(R1), F30 168 FMOVD 328(R1), F31 169 170 ADD $344, R1 171 172 MOVD 8(R1), R0 173 MOVFL R0, $0xff 174 MOVD 16(R1), R0 175 MOVD R0, LR 176 RET 177 178 DEFINE_PPC64X_FUNCDESC(_rt0_ppc64_aix_lib_go, __rt0_ppc64_aix_lib_go) 179 180 TEXT __rt0_ppc64_aix_lib_go(SB),NOSPLIT,$0 181 MOVD _rt0_ppc64_aix_lib_argc<>(SB), R3 182 MOVD _rt0_ppc64_aix_lib_argv<>(SB), R4 183 MOVD $runtime·rt0_go(SB), R12 184 MOVD R12, CTR 185 BR (CTR) 186 187 DATA _rt0_ppc64_aix_lib_argc<>(SB)/8, $0 188 GLOBL _rt0_ppc64_aix_lib_argc<>(SB),NOPTR, $8 189 DATA _rt0_ppc64_aix_lib_argv<>(SB)/8, $0 190 GLOBL _rt0_ppc64_aix_lib_argv<>(SB),NOPTR, $8