blob: d103ce12eacc54d03a1d416cfbf6ab88a2eb9022 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/* define and implement the zircon syscall wrappers for x86-64 */
#include "syscall-entry.h"
#include "zircon-syscall-x86-64.S"
.text
.cfi_sections .eh_frame, .debug_frame
// The following assembly code converts arguments from the x86-64 SysV
// ABI's function calling conventions to the conventions used for Zircon
// syscalls:
//
// arg 1: stays in %rdi
// arg 2: stays in %rsi
// arg 3: stays in %rdx
// arg 4: moved from %rcx to %r10
// arg 5: stays in %r8
// arg 6: stays in %r9
// arg 7: moved from 8(%rsp) to %r12
// arg 8: moved from 16(%rsp) to %r13
.macro m_syscall name, num, nargs, public
syscall_entry_begin \name
.cfi_same_value %r12
.cfi_same_value %r13
.if \nargs <= 3
zircon_syscall \num, \name, \name
ret
.elseif \nargs <= 6
mov %rcx, %r10 // Argument 4
zircon_syscall \num, \name, \name
ret
.elseif \nargs == 7
push_reg %r12
mov 0x10(%rsp), %r12 // Argument 7
mov %rcx, %r10 // Argument 4
zircon_syscall \num, \name, \name
pop_reg %r12
ret
.elseif \nargs == 8
push_reg %r12
push_reg %r13
mov 0x18(%rsp), %r12 // Argument 7
mov 0x20(%rsp), %r13 // Argument 8
mov %rcx, %r10 // Argument 4
zircon_syscall \num, \name, \name
pop_reg %r13
pop_reg %r12
ret
.endif
syscall_entry_end \name \public
.endm
#include <zircon/syscalls-x86-64.S>
#include "syscalls-stubs.S"