sim: Add a transitional syscall ABI which defers to Process.
[gem5.git] / src / sim / syscall_desc.hh
index e5adf8bd5cec4c425110d1ab7120a5651ddb7757..c34dc904518628e906965090e8ad53c13530151d 100644 (file)
 #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__