diff --git a/src/sim/syscall_desc.hh b/src/sim/syscall_desc.hh index e5adf8bd5c..c34dc90451 100644 --- a/src/sim/syscall_desc.hh +++ b/src/sim/syscall_desc.hh @@ -50,12 +50,12 @@ #include #include "base/types.hh" +#include "cpu/thread_context.hh" #include "sim/guest_abi.hh" +#include "sim/process.hh" #include "sim/syscall_return.hh" -class Process; class SyscallDesc; -class ThreadContext; SyscallReturn unimplementedFunc(SyscallDesc *desc, int num, ThreadContext *tc); @@ -154,4 +154,50 @@ class SyscallDescABI : public SyscallDesc using SyscallDesc::SyscallDesc; }; +struct DefaultSyscallABI +{ + using Position = int; +}; + +namespace GuestABI +{ + +template <> +struct Result +{ + static void + store(ThreadContext *tc, const SyscallReturn &ret) + { + auto *process = tc->getProcessPtr(); + process->setSyscallReturn(tc, ret); + } +}; + +template +struct Argument::value>::type> +{ + static Arg + get(ThreadContext *tc, DefaultSyscallABI::Position &position) + { + auto *process = tc->getProcessPtr(); + return process->getSyscallArg(tc, position); + } +}; + +template +struct Argument::value>::type> +{ + static Arg + get(ThreadContext *tc, DefaultSyscallABI::Position &position) + { + auto *process = tc->getProcessPtr(); + RegVal reg = process->getSyscallArg(tc, position); + return (Arg)(uintptr_t)(reg); + } +}; + +} // namespace GuestABI + #endif // __SIM_SYSCALL_DESC_HH__