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