github.com/megatontech/mynoteforgo@v0.0.0-20200507084910-5d0c6ea6e890/源码/runtime/sys_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 // +build aix 6 // +build ppc64 ppc64le 7 8 // 9 // System calls and other sys.stuff for ppc64, Aix 10 // 11 12 #include "go_asm.h" 13 #include "go_tls.h" 14 #include "textflag.h" 15 #include "asm_ppc64x.h" 16 17 // This function calls a C function with the function descriptor in R12 18 TEXT runtime·callCfunction(SB), NOSPLIT|NOFRAME,$0 19 MOVD 0(R12), R12 20 MOVD R2, 40(R1) 21 MOVD 0(R12), R0 22 MOVD 8(R12), R2 23 MOVD R0, CTR 24 BR (CTR) 25 26 27 // asmsyscall6 calls a library function with a function descriptor 28 // stored in libcall_fn and store the results in libcall struture 29 // Up to 6 arguments can be passed to this C function 30 // Called by runtime.asmcgocall 31 // It reserves a stack of 288 bytes for the C function. 32 // NOT USING GO CALLING CONVENTION 33 TEXT runtime·asmsyscall6(SB),NOSPLIT,$256 34 MOVD R3, 48(R1) // Save libcall for later 35 MOVD libcall_fn(R3), R12 36 MOVD libcall_args(R3), R9 37 MOVD 0(R9), R3 38 MOVD 8(R9), R4 39 MOVD 16(R9), R5 40 MOVD 24(R9), R6 41 MOVD 32(R9), R7 42 MOVD 40(R9), R8 43 BL runtime·callCfunction(SB) 44 45 // Restore R0 and TOC 46 XOR R0, R0 47 MOVD 40(R1), R2 48 49 // Store result in libcall 50 MOVD 48(R1), R5 51 MOVD R3, (libcall_r1)(R5) 52 MOVD $-1, R6 53 CMP R6, R3 54 BNE skiperrno 55 56 // Save errno in libcall 57 BL runtime·load_g(SB) 58 MOVD g_m(g), R4 59 MOVD (m_mOS + mOS_perrno)(R4), R9 60 MOVW 0(R9), R9 61 MOVD R9, (libcall_err)(R5) 62 RET 63 skiperrno: 64 // Reset errno if no error has been returned 65 MOVD R0, (libcall_err)(R5) 66 RET 67 68 69 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 70 MOVW sig+8(FP), R3 71 MOVD info+16(FP), R4 72 MOVD ctx+24(FP), R5 73 MOVD fn+0(FP), R12 74 MOVD R12, CTR 75 BL (CTR) 76 RET 77 78 79 // runtime.sigtramp is a function descriptor to the real sigtramp. 80 DATA runtime·sigtramp+0(SB)/8, $runtime·_sigtramp(SB) 81 DATA runtime·sigtramp+8(SB)/8, $TOC(SB) 82 DATA runtime·sigtramp+16(SB)/8, $0 83 GLOBL runtime·sigtramp(SB), NOPTR, $24 84 85 // This funcion must not have any frame as we want to control how 86 // every registers are used. 87 TEXT runtime·_sigtramp(SB),NOSPLIT|NOFRAME,$0 88 MOVD LR, R0 89 MOVD R0, 16(R1) 90 // initialize essential registers (just in case) 91 BL runtime·reginit(SB) 92 93 // Note that we are executing on altsigstack here, so we have 94 // more stack available than NOSPLIT would have us believe. 95 // To defeat the linker, we make our own stack frame with 96 // more space. 97 SUB $128+FIXED_FRAME, R1 98 99 // Save registers 100 MOVD R31, 56(R1) 101 MOVD g, 64(R1) 102 MOVD R29, 72(R1) 103 104 BL runtime·load_g(SB) 105 106 // Save m->libcall. We need to do this because we 107 // might get interrupted by a signal in runtime·asmcgocall. 108 109 // save m->libcall 110 MOVD g_m(g), R6 111 MOVD (m_libcall+libcall_fn)(R6), R7 112 MOVD R7, 80(R1) 113 MOVD (m_libcall+libcall_args)(R6), R7 114 MOVD R7, 88(R1) 115 MOVD (m_libcall+libcall_n)(R6), R7 116 MOVD R7, 96(R1) 117 MOVD (m_libcall+libcall_r1)(R6), R7 118 MOVD R7, 104(R1) 119 MOVD (m_libcall+libcall_r2)(R6), R7 120 MOVD R7, 112(R1) 121 122 // save errno, it might be EINTR; stuff we do here might reset it. 123 MOVD (m_mOS+mOS_perrno)(R6), R8 124 MOVD 0(R8), R8 125 MOVD R8, 120(R1) 126 127 MOVW R3, FIXED_FRAME+0(R1) 128 MOVD R4, FIXED_FRAME+8(R1) 129 MOVD R5, FIXED_FRAME+16(R1) 130 MOVD $runtime·sigtrampgo(SB), R12 131 MOVD R12, CTR 132 BL (CTR) 133 134 MOVD g_m(g), R6 135 // restore libcall 136 MOVD 80(R1), R7 137 MOVD R7, (m_libcall+libcall_fn)(R6) 138 MOVD 88(R1), R7 139 MOVD R7, (m_libcall+libcall_args)(R6) 140 MOVD 96(R1), R7 141 MOVD R7, (m_libcall+libcall_n)(R6) 142 MOVD 104(R1), R7 143 MOVD R7, (m_libcall+libcall_r1)(R6) 144 MOVD 112(R1), R7 145 MOVD R7, (m_libcall+libcall_r2)(R6) 146 147 // restore errno 148 MOVD (m_mOS+mOS_perrno)(R6), R7 149 MOVD 120(R1), R8 150 MOVD R8, 0(R7) 151 152 // restore registers 153 MOVD 56(R1),R31 154 MOVD 64(R1),g 155 MOVD 72(R1),R29 156 157 // Don't use RET because we need to restore R31 ! 158 ADD $128+FIXED_FRAME, R1 159 MOVD 16(R1), R0 160 MOVD R0, LR 161 BR (LR) 162 163 // runtime.tstart is a function descriptor to the real tstart. 164 DATA runtime·tstart+0(SB)/8, $runtime·_tstart(SB) 165 DATA runtime·tstart+8(SB)/8, $TOC(SB) 166 DATA runtime·tstart+16(SB)/8, $0 167 GLOBL runtime·tstart(SB), NOPTR, $24 168 169 TEXT runtime·_tstart(SB),NOSPLIT,$0 170 XOR R0, R0 // reset R0 171 172 // set g 173 MOVD m_g0(R3), g 174 BL runtime·save_g(SB) 175 MOVD R3, g_m(g) 176 177 // Layout new m scheduler stack on os stack. 178 MOVD R1, R3 179 MOVD R3, (g_stack+stack_hi)(g) 180 SUB $(const_threadStackSize), R3 // stack size 181 MOVD R3, (g_stack+stack_lo)(g) 182 ADD $const__StackGuard, R3 183 MOVD R3, g_stackguard0(g) 184 MOVD R3, g_stackguard1(g) 185 186 BL runtime·mstart(SB) 187 188 MOVD R0, R3 189 RET 190 191 // Runs on OS stack, called from runtime·osyield. 192 TEXT runtime·osyield1(SB),NOSPLIT,$0 193 MOVD $libc_sched_yield(SB), R12 194 MOVD 0(R12), R12 195 MOVD R2, 40(R1) 196 MOVD 0(R12), R0 197 MOVD 8(R12), R2 198 MOVD R0, CTR 199 BL (CTR) 200 MOVD 40(R1), R2 201 RET