aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/cgo/asm_amd64.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/cgo/asm_amd64.s')
-rw-r--r--src/runtime/cgo/asm_amd64.s20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/runtime/cgo/asm_amd64.s b/src/runtime/cgo/asm_amd64.s
index 06c538b9bc..5dc8e2d235 100644
--- a/src/runtime/cgo/asm_amd64.s
+++ b/src/runtime/cgo/asm_amd64.s
@@ -5,8 +5,10 @@
#include "textflag.h"
// Called by C code generated by cmd/cgo.
-// func crosscall2(fn func(a unsafe.Pointer, n int32, ctxt uintptr), a unsafe.Pointer, n int32, ctxt uintptr)
-// Saves C callee-saved registers and calls fn with three arguments.
+// 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.
+// This signature is known to SWIG, so we can't change it.
#ifndef GOOS_windows
TEXT crosscall2(SB),NOSPLIT,$0x50-0 /* keeps stack pointer 32-byte aligned */
#else
@@ -33,11 +35,12 @@ TEXT crosscall2(SB),NOSPLIT,$0x110-0 /* also need to save xmm6 - xmm15 */
MOVUPS X14, 0xe0(SP)
MOVUPS X15, 0xf0(SP)
- MOVQ DX, 0x0(SP) /* arg */
- MOVQ R8, 0x8(SP) /* argsize (includes padding) */
+ MOVQ CX, 0x0(SP) /* fn */
+ MOVQ DX, 0x8(SP) /* arg */
+ // Skip n in R8.
MOVQ R9, 0x10(SP) /* ctxt */
- CALL CX /* fn */
+ CALL runtime·cgocallback(SB)
MOVQ 0x48(SP), DI
MOVQ 0x50(SP), SI
@@ -52,11 +55,12 @@ TEXT crosscall2(SB),NOSPLIT,$0x110-0 /* also need to save xmm6 - xmm15 */
MOVUPS 0xe0(SP), X14
MOVUPS 0xf0(SP), X15
#else
- MOVQ SI, 0x0(SP) /* arg */
- MOVQ DX, 0x8(SP) /* argsize (includes padding) */
+ MOVQ DI, 0x0(SP) /* fn */
+ MOVQ SI, 0x8(SP) /* arg */
+ // Skip n in DX.
MOVQ CX, 0x10(SP) /* ctxt */
- CALL DI /* fn */
+ CALL runtime·cgocallback(SB)
#endif
MOVQ 0x18(SP), BX