From 04ad1340d51855756f45b7f65e619a794d17fe87 Mon Sep 17 00:00:00 2001 From: Adrian-Ken Rueegsegger Date: Fri, 20 Feb 2015 10:34:53 +0100 Subject: [PATCH] hw_x86_64: Add syscall helper macros The macros are used to assign syscall arguments to specific registers. Using the AMD64 parameter passing convention avoids additional copying of variables since the C++ function parameters are already in the right registers. --- .../src/base/x86_64/kernel/interface.cc | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/repos/base-hw/src/base/x86_64/kernel/interface.cc b/repos/base-hw/src/base/x86_64/kernel/interface.cc index 1e9d79c52..6e466d515 100644 --- a/repos/base-hw/src/base/x86_64/kernel/interface.cc +++ b/repos/base-hw/src/base/x86_64/kernel/interface.cc @@ -17,6 +17,38 @@ using namespace Kernel; +/************************************ + ** Helper macros for kernel calls ** + ************************************/ + +/** + * Assign argument registers according to AMD64 parameter passing + * convention to avoid additional register copy operations. + */ + +#define CALL_1_FILL_ARG_REGS \ + register Call_arg arg_0_reg asm("rdi") = arg_0; + +#define CALL_2_FILL_ARG_REGS \ + CALL_1_FILL_ARG_REGS \ + register Call_arg arg_1_reg asm("rsi") = arg_1; + +#define CALL_3_FILL_ARG_REGS \ + CALL_2_FILL_ARG_REGS \ + register Call_arg arg_2_reg asm("rdx") = arg_2; + +#define CALL_4_FILL_ARG_REGS \ + CALL_3_FILL_ARG_REGS \ + register Call_arg arg_3_reg asm("rcx") = arg_3; + +#define CALL_5_FILL_ARG_REGS \ + CALL_4_FILL_ARG_REGS \ + register Call_arg arg_4_reg asm("r8") = arg_4; + +#define CALL_6_FILL_ARG_REGS \ + CALL_5_FILL_ARG_REGS \ + register Call_arg arg_5_reg asm("r9") = arg_5; + /****************** ** Kernel calls **