diff options
Diffstat (limited to 'src/pkg/runtime/cgo/amd64.S')
-rw-r--r-- | src/pkg/runtime/cgo/amd64.S | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/pkg/runtime/cgo/amd64.S b/src/pkg/runtime/cgo/amd64.S new file mode 100644 index 000000000..083c2bc94 --- /dev/null +++ b/src/pkg/runtime/cgo/amd64.S @@ -0,0 +1,73 @@ +// Copyright 2009 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. + +/* + * Apple still insists on underscore prefixes for C function names. + */ +#if defined(__APPLE__) || defined(_WIN32) +#define EXT(s) _##s +#else +#define EXT(s) s +#endif + +/* + * void crosscall_amd64(void (*fn)(void)) + * + * Calling into the 6c tool chain, where all registers are caller save. + * Called from standard x86-64 ABI, where %rbx, %rbp, %r12-%r15 + * are callee-save so they must be saved explicitly. + * The standard x86-64 ABI passes the three arguments m, g, fn + * in %rdi, %rsi, %rdx. + * + * Also need to set %r15 to g and %r14 to m (see ../pkg/runtime/mkasmh.sh) + * during the call. + */ +.globl EXT(crosscall_amd64) +EXT(crosscall_amd64): + pushq %rbx + pushq %rbp + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + + call *%rdi /* fn */ + + popq %r15 + popq %r14 + popq %r13 + popq %r12 + popq %rbp + popq %rbx + ret + +/* + * void crosscall2(void (*fn)(void*, int32), void *arg, int32 argsize) + * + * Save registers and call fn with two arguments. fn is a Go function + * which takes parameters on the stack rather than in registers. + */ +.globl EXT(crosscall2) +EXT(crosscall2): + subq $0x58, %rsp /* keeps stack pointer 32-byte aligned */ + movq %rbx, 0x10(%rsp) + movq %rbp, 0x18(%rsp) + movq %r12, 0x20(%rsp) + movq %r13, 0x28(%rsp) + movq %r14, 0x30(%rsp) + movq %r15, 0x38(%rsp) + + movq %rsi, 0(%rsp) /* arg */ + movq %rdx, 8(%rsp) /* argsize (includes padding) */ + + call *%rdi /* fn */ + + movq 0x10(%rsp), %rbx + movq 0x18(%rsp), %rbp + movq 0x20(%rsp), %r12 + movq 0x28(%rsp), %r13 + movq 0x30(%rsp), %r14 + movq 0x38(%rsp), %r15 + addq $0x58, %rsp + ret |