github.com/comwrg/go/src@v0.0.0-20220319063731-c238d0440370/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 // 6 // System calls and other sys.stuff for ppc64, Aix 7 // 8 9 #include "go_asm.h" 10 #include "go_tls.h" 11 #include "textflag.h" 12 #include "asm_ppc64x.h" 13 14 // This function calls a C function with the function descriptor in R12 15 TEXT callCfunction<>(SB), NOSPLIT|NOFRAME,$0 16 MOVD 0(R12), R12 17 MOVD R2, 40(R1) 18 MOVD 0(R12), R0 19 MOVD 8(R12), R2 20 MOVD R0, CTR 21 BR (CTR) 22 23 24 // asmsyscall6 calls a library function with a function descriptor 25 // stored in libcall_fn and store the results in libcall struture 26 // Up to 6 arguments can be passed to this C function 27 // Called by runtime.asmcgocall 28 // It reserves a stack of 288 bytes for the C function. 29 // NOT USING GO CALLING CONVENTION 30 // runtime.asmsyscall6 is a function descriptor to the real asmsyscall6. 31 DATA runtime·asmsyscall6+0(SB)/8, $asmsyscall6<>(SB) 32 DATA runtime·asmsyscall6+8(SB)/8, $TOC(SB) 33 DATA runtime·asmsyscall6+16(SB)/8, $0 34 GLOBL runtime·asmsyscall6(SB), NOPTR, $24 35 36 TEXT asmsyscall6<>(SB),NOSPLIT,$256 37 MOVD R3, 48(R1) // Save libcall for later 38 MOVD libcall_fn(R3), R12 39 MOVD libcall_args(R3), R9 40 MOVD 0(R9), R3 41 MOVD 8(R9), R4 42 MOVD 16(R9), R5 43 MOVD 24(R9), R6 44 MOVD 32(R9), R7 45 MOVD 40(R9), R8 46 BL callCfunction<>(SB) 47 48 // Restore R0 and TOC 49 XOR R0, R0 50 MOVD 40(R1), R2 51 52 // Store result in libcall 53 MOVD 48(R1), R5 54 MOVD R3, (libcall_r1)(R5) 55 MOVD $-1, R6 56 CMP R6, R3 57 BNE skiperrno 58 59 // Save errno in libcall 60 BL runtime·load_g(SB) 61 MOVD g_m(g), R4 62 MOVD (m_mOS + mOS_perrno)(R4), R9 63 MOVW 0(R9), R9 64 MOVD R9, (libcall_err)(R5) 65 RET 66 skiperrno: 67 // Reset errno if no error has been returned 68 MOVD R0, (libcall_err)(R5) 69 RET 70 71 72 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 73 MOVW sig+8(FP), R3 74 MOVD info+16(FP), R4 75 MOVD ctx+24(FP), R5 76 MOVD fn+0(FP), R12 77 // fn is a function descriptor 78 // R2 must be saved on restore 79 MOVD 0(R12), R0 80 MOVD R2, 40(R1) 81 MOVD 8(R12), R2 82 MOVD R0, CTR 83 BL (CTR) 84 MOVD 40(R1), R2 85 BL runtime·reginit(SB) 86 RET 87 88 89 // runtime.sigtramp is a function descriptor to the real sigtramp. 90 DATA runtime·sigtramp+0(SB)/8, $sigtramp<>(SB) 91 DATA runtime·sigtramp+8(SB)/8, $TOC(SB) 92 DATA runtime·sigtramp+16(SB)/8, $0 93 GLOBL runtime·sigtramp(SB), NOPTR, $24 94 95 // This function must not have any frame as we want to control how 96 // every registers are used. 97 // TODO(aix): Implement SetCgoTraceback handler. 98 TEXT sigtramp<>(SB),NOSPLIT|NOFRAME,$0 99 MOVD LR, R0 100 MOVD R0, 16(R1) 101 // initialize essential registers (just in case) 102 BL runtime·reginit(SB) 103 104 // Note that we are executing on altsigstack here, so we have 105 // more stack available than NOSPLIT would have us believe. 106 // To defeat the linker, we make our own stack frame with 107 // more space. 108 SUB $144+FIXED_FRAME, R1 109 110 // Save registers 111 MOVD R31, 56(R1) 112 MOVD g, 64(R1) 113 MOVD R29, 72(R1) 114 MOVD R14, 80(R1) 115 MOVD R15, 88(R1) 116 117 BL runtime·load_g(SB) 118 119 CMP $0, g 120 BEQ sigtramp // g == nil 121 MOVD g_m(g), R6 122 CMP $0, R6 123 BEQ sigtramp // g.m == nil 124 125 // Save m->libcall. We need to do this because we 126 // might get interrupted by a signal in runtime·asmcgocall. 127 MOVD (m_libcall+libcall_fn)(R6), R7 128 MOVD R7, 96(R1) 129 MOVD (m_libcall+libcall_args)(R6), R7 130 MOVD R7, 104(R1) 131 MOVD (m_libcall+libcall_n)(R6), R7 132 MOVD R7, 112(R1) 133 MOVD (m_libcall+libcall_r1)(R6), R7 134 MOVD R7, 120(R1) 135 MOVD (m_libcall+libcall_r2)(R6), R7 136 MOVD R7, 128(R1) 137 138 // save errno, it might be EINTR; stuff we do here might reset it. 139 MOVD (m_mOS+mOS_perrno)(R6), R8 140 MOVD 0(R8), R8 141 MOVD R8, 136(R1) 142 143 sigtramp: 144 MOVW R3, FIXED_FRAME+0(R1) 145 MOVD R4, FIXED_FRAME+8(R1) 146 MOVD R5, FIXED_FRAME+16(R1) 147 MOVD $runtime·sigtrampgo(SB), R12 148 MOVD R12, CTR 149 BL (CTR) 150 151 CMP $0, g 152 BEQ exit // g == nil 153 MOVD g_m(g), R6 154 CMP $0, R6 155 BEQ exit // g.m == nil 156 157 // restore libcall 158 MOVD 96(R1), R7 159 MOVD R7, (m_libcall+libcall_fn)(R6) 160 MOVD 104(R1), R7 161 MOVD R7, (m_libcall+libcall_args)(R6) 162 MOVD 112(R1), R7 163 MOVD R7, (m_libcall+libcall_n)(R6) 164 MOVD 120(R1), R7 165 MOVD R7, (m_libcall+libcall_r1)(R6) 166 MOVD 128(R1), R7 167 MOVD R7, (m_libcall+libcall_r2)(R6) 168 169 // restore errno 170 MOVD (m_mOS+mOS_perrno)(R6), R7 171 MOVD 136(R1), R8 172 MOVD R8, 0(R7) 173 174 exit: 175 // restore registers 176 MOVD 56(R1),R31 177 MOVD 64(R1),g 178 MOVD 72(R1),R29 179 MOVD 80(R1), R14 180 MOVD 88(R1), R15 181 182 // Don't use RET because we need to restore R31 ! 183 ADD $144+FIXED_FRAME, R1 184 MOVD 16(R1), R0 185 MOVD R0, LR 186 BR (LR) 187 188 // runtime.tstart is a function descriptor to the real tstart. 189 DATA runtime·tstart+0(SB)/8, $tstart<>(SB) 190 DATA runtime·tstart+8(SB)/8, $TOC(SB) 191 DATA runtime·tstart+16(SB)/8, $0 192 GLOBL runtime·tstart(SB), NOPTR, $24 193 194 TEXT tstart<>(SB),NOSPLIT,$0 195 XOR R0, R0 // reset R0 196 197 // set g 198 MOVD m_g0(R3), g 199 BL runtime·save_g(SB) 200 MOVD R3, g_m(g) 201 202 // Layout new m scheduler stack on os stack. 203 MOVD R1, R3 204 MOVD R3, (g_stack+stack_hi)(g) 205 SUB $(const_threadStackSize), R3 // stack size 206 MOVD R3, (g_stack+stack_lo)(g) 207 ADD $const__StackGuard, R3 208 MOVD R3, g_stackguard0(g) 209 MOVD R3, g_stackguard1(g) 210 211 BL runtime·mstart(SB) 212 213 MOVD R0, R3 214 RET 215 216 217 #define CSYSCALL() \ 218 MOVD 0(R12), R12 \ 219 MOVD R2, 40(R1) \ 220 MOVD 0(R12), R0 \ 221 MOVD 8(R12), R2 \ 222 MOVD R0, CTR \ 223 BL (CTR) \ 224 MOVD 40(R1), R2 \ 225 BL runtime·reginit(SB) 226 227 228 // Runs on OS stack, called from runtime·osyield. 229 TEXT runtime·osyield1(SB),NOSPLIT,$0 230 MOVD $libc_sched_yield(SB), R12 231 CSYSCALL() 232 RET 233 234 235 // Runs on OS stack, called from runtime·sigprocmask. 236 TEXT runtime·sigprocmask1(SB),NOSPLIT,$0-24 237 MOVD how+0(FP), R3 238 MOVD new+8(FP), R4 239 MOVD old+16(FP), R5 240 MOVD $libpthread_sigthreadmask(SB), R12 241 CSYSCALL() 242 RET 243 244 // Runs on OS stack, called from runtime·usleep. 245 TEXT runtime·usleep1(SB),NOSPLIT,$0-4 246 MOVW us+0(FP), R3 247 MOVD $libc_usleep(SB), R12 248 CSYSCALL() 249 RET 250 251 // Runs on OS stack, called from runtime·exit. 252 TEXT runtime·exit1(SB),NOSPLIT,$0-4 253 MOVW code+0(FP), R3 254 MOVD $libc_exit(SB), R12 255 CSYSCALL() 256 RET 257 258 // Runs on OS stack, called from runtime·write1. 259 TEXT runtime·write2(SB),NOSPLIT,$0-28 260 MOVD fd+0(FP), R3 261 MOVD p+8(FP), R4 262 MOVW n+16(FP), R5 263 MOVD $libc_write(SB), R12 264 CSYSCALL() 265 MOVW R3, ret+24(FP) 266 RET 267 268 // Runs on OS stack, called from runtime·pthread_attr_init. 269 TEXT runtime·pthread_attr_init1(SB),NOSPLIT,$0-12 270 MOVD attr+0(FP), R3 271 MOVD $libpthread_attr_init(SB), R12 272 CSYSCALL() 273 MOVW R3, ret+8(FP) 274 RET 275 276 // Runs on OS stack, called from runtime·pthread_attr_setstacksize. 277 TEXT runtime·pthread_attr_setstacksize1(SB),NOSPLIT,$0-20 278 MOVD attr+0(FP), R3 279 MOVD size+8(FP), R4 280 MOVD $libpthread_attr_setstacksize(SB), R12 281 CSYSCALL() 282 MOVW R3, ret+16(FP) 283 RET 284 285 // Runs on OS stack, called from runtime·pthread_setdetachstate. 286 TEXT runtime·pthread_attr_setdetachstate1(SB),NOSPLIT,$0-20 287 MOVD attr+0(FP), R3 288 MOVW state+8(FP), R4 289 MOVD $libpthread_attr_setdetachstate(SB), R12 290 CSYSCALL() 291 MOVW R3, ret+16(FP) 292 RET 293 294 // Runs on OS stack, called from runtime·pthread_create. 295 TEXT runtime·pthread_create1(SB),NOSPLIT,$0-36 296 MOVD tid+0(FP), R3 297 MOVD attr+8(FP), R4 298 MOVD fn+16(FP), R5 299 MOVD arg+24(FP), R6 300 MOVD $libpthread_create(SB), R12 301 CSYSCALL() 302 MOVW R3, ret+32(FP) 303 RET 304 305 // Runs on OS stack, called from runtime·sigaction. 306 TEXT runtime·sigaction1(SB),NOSPLIT,$0-24 307 MOVD sig+0(FP), R3 308 MOVD new+8(FP), R4 309 MOVD old+16(FP), R5 310 MOVD $libc_sigaction(SB), R12 311 CSYSCALL() 312 RET