| // Copyright 2020 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" | |
| // Set the x_crosscall2_ptr C function pointer variable point to crosscall2. | |
| // It's such a pointer chain: _crosscall2_ptr -> x_crosscall2_ptr -> crosscall2 | |
| // Use a local trampoline, to avoid taking the address of a dynamically exported | |
| // function. | |
| TEXT 路set_crosscall2(SB),NOSPLIT,$0-0 | |
| MOV _crosscall2_ptr(SB), X7 | |
| MOV $crosscall2_trampoline<>(SB), X8 | |
| MOV X8, (X7) | |
| RET | |
| TEXT crosscall2_trampoline<>(SB),NOSPLIT,$0-0 | |
| JMP crosscall2(SB) | |
| // Called by C code generated by cmd/cgo. | |
| // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr) | |
| // Saves C callee-saved registers and calls cgocallback with three arguments. | |
| // fn is the PC of a func(a unsafe.Pointer) function. | |
| TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0 | |
| /* | |
| * Push arguments for fn (X10, X11, X13), along with all callee-save | |
| * registers. Note that at procedure entry the first argument is at | |
| * 8(X2). | |
| */ | |
| ADD $(-8*29), X2 | |
| MOV X10, (8*1)(X2) // fn unsafe.Pointer | |
| MOV X11, (8*2)(X2) // a unsafe.Pointer | |
| MOV X13, (8*3)(X2) // ctxt uintptr | |
| MOV X8, (8*4)(X2) | |
| MOV X9, (8*5)(X2) | |
| MOV X18, (8*6)(X2) | |
| MOV X19, (8*7)(X2) | |
| MOV X20, (8*8)(X2) | |
| MOV X21, (8*9)(X2) | |
| MOV X22, (8*10)(X2) | |
| MOV X23, (8*11)(X2) | |
| MOV X24, (8*12)(X2) | |
| MOV X25, (8*13)(X2) | |
| MOV X26, (8*14)(X2) | |
| MOV g, (8*15)(X2) | |
| MOV X1, (8*16)(X2) | |
| MOVD F8, (8*17)(X2) | |
| MOVD F9, (8*18)(X2) | |
| MOVD F18, (8*19)(X2) | |
| MOVD F19, (8*20)(X2) | |
| MOVD F20, (8*21)(X2) | |
| MOVD F21, (8*22)(X2) | |
| MOVD F22, (8*23)(X2) | |
| MOVD F23, (8*24)(X2) | |
| MOVD F24, (8*25)(X2) | |
| MOVD F25, (8*26)(X2) | |
| MOVD F26, (8*27)(X2) | |
| MOVD F27, (8*28)(X2) | |
| // Initialize Go ABI environment | |
| CALL runtime路load_g(SB) | |
| CALL runtime路cgocallback(SB) | |
| MOV (8*4)(X2), X8 | |
| MOV (8*5)(X2), X9 | |
| MOV (8*6)(X2), X18 | |
| MOV (8*7)(X2), X19 | |
| MOV (8*8)(X2), X20 | |
| MOV (8*9)(X2), X21 | |
| MOV (8*10)(X2), X22 | |
| MOV (8*11)(X2), X23 | |
| MOV (8*12)(X2), X24 | |
| MOV (8*13)(X2), X25 | |
| MOV (8*14)(X2), X26 | |
| MOV (8*15)(X2), g | |
| MOV (8*16)(X2), X1 | |
| MOVD (8*17)(X2), F8 | |
| MOVD (8*18)(X2), F9 | |
| MOVD (8*19)(X2), F18 | |
| MOVD (8*20)(X2), F19 | |
| MOVD (8*21)(X2), F20 | |
| MOVD (8*22)(X2), F21 | |
| MOVD (8*23)(X2), F22 | |
| MOVD (8*24)(X2), F23 | |
| MOVD (8*25)(X2), F24 | |
| MOVD (8*26)(X2), F25 | |
| MOVD (8*27)(X2), F26 | |
| MOVD (8*28)(X2), F27 | |
| ADD $(8*29), X2 | |
| RET | |