sim: Add a transitional syscall ABI which defers to Process.

This change adds a transitional ABI which just falls back to the
existing Process syscall arg getters. It should be phased out once each
ISA implements its own actual ABI.

Jira Issue: https://gem5.atlassian.net/browse/GEM5-187

Change-Id: Ic40bd924989f91de70bbce59fda888b79bbbfca4
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/23190
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Gabe Black
2019-11-25 23:01:59 -08:00
parent e0f0351182
commit a255a2ee64

View File

@@ -50,12 +50,12 @@
#include <string>
#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<DefaultSyscallABI, SyscallReturn>
{
static void
store(ThreadContext *tc, const SyscallReturn &ret)
{
auto *process = tc->getProcessPtr();
process->setSyscallReturn(tc, ret);
}
};
template <typename Arg>
struct Argument<DefaultSyscallABI, Arg,
typename std::enable_if<std::is_integral<Arg>::value>::type>
{
static Arg
get(ThreadContext *tc, DefaultSyscallABI::Position &position)
{
auto *process = tc->getProcessPtr();
return process->getSyscallArg(tc, position);
}
};
template <typename Arg>
struct Argument<DefaultSyscallABI, Arg,
typename std::enable_if<std::is_pointer<Arg>::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__