| // Copyright 2018 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| #include "textflag.h" | |
| #include "asm_ppc64x.h" | |
| // _rt0_ppc64_aix is a function descriptor of the entrypoint function | |
| // __start. This name is needed by cmd/link. | |
| DEFINE_PPC64X_FUNCDESC(_rt0_ppc64_aix, __start<>) | |
| // The starting function must return in the loader to | |
| // initialise some libraries, especially libthread which | |
| // creates the main thread and adds the TLS in R13 | |
| // R19 contains a function descriptor to the loader function | |
| // which needs to be called. | |
| // This code is similar to the __start function in C | |
| TEXT __start<>(SB),NOSPLIT,$-8 | |
| XOR R0, R0 | |
| MOVD $libc___n_pthreads(SB), R4 | |
| MOVD 0(R4), R4 | |
| MOVD $libc___mod_init(SB), R5 | |
| MOVD 0(R5), R5 | |
| MOVD 0(R19), R0 | |
| MOVD R2, 40(R1) | |
| MOVD 8(R19), R2 | |
| MOVD R18, R3 | |
| MOVD R0, CTR | |
| BL (CTR) // Return to AIX loader | |
| // Launch rt0_go | |
| MOVD 40(R1), R2 | |
| MOVD R14, R3 // argc | |
| MOVD R15, R4 // argv | |
| BL _main(SB) | |
| DEFINE_PPC64X_FUNCDESC(main, _main) | |
| TEXT _main(SB),NOSPLIT,$-8 | |
| MOVD $runtime·rt0_go(SB), R12 | |
| MOVD R12, CTR | |
| BR (CTR) | |
| TEXT _rt0_ppc64_aix_lib(SB),NOSPLIT,$0 | |
| MOVD R14, R3 // argc | |
| MOVD R15, R4 // argv | |
| JMP _rt0_ppc64x_lib(SB) |