14f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen// Copyright 2009 The Go Authors. All rights reserved.
24f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen// Use of this source code is governed by a BSD-style
34f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen// license that can be found in the LICENSE file.
44f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
54f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen/*
64f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen * Apple still insists on underscore prefixes for C function names.
74f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen */
84f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen#if defined(__APPLE__)
94f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen#define EXT(s) _##s
104f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen#else
114f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen#define EXT(s) s
124f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen#endif
134f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
144f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen/*
154f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen * void crosscall_amd64(void (*fn)(void))
164f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen *
174f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen * Calling into the 6c tool chain, where all registers are caller save.
184f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen * Called from standard x86-64 ABI, where %rbx, %rbp, %r12-%r15
194f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen * are callee-save so they must be saved explicitly.
204f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen * The standard x86-64 ABI passes the three arguments m, g, fn
214f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen * in %rdi, %rsi, %rdx.
224f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen */
234f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen.globl EXT(crosscall_amd64)
244f7f559a4b744258a796dd591b11bd88e4a6dc7Dan WillemsenEXT(crosscall_amd64):
254f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	pushq %rbx
264f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	pushq %rbp
274f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	pushq %r12
284f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	pushq %r13
294f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	pushq %r14
304f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	pushq %r15
314f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
324f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen#if defined(_WIN64)
334f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	call *%rcx	/* fn */
344f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen#else
354f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	call *%rdi	/* fn */
364f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen#endif
374f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
384f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	popq %r15
394f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	popq %r14
404f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	popq %r13
414f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	popq %r12
424f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	popq %rbp
434f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	popq %rbx
444f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	ret
454f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
464f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen#ifdef __ELF__
474f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen.section .note.GNU-stack,"",@progbits
484f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen#endif
49