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:
@@ -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__
|
||||
|
||||
Reference in New Issue
Block a user