riscv: Use a riscv specific GuestABI for riscv system calls.
authorGabe Black <gabeblack@google.com>
Sun, 8 Dec 2019 04:52:09 +0000 (20:52 -0800)
committerGabe Black <gabeblack@google.com>
Thu, 12 Mar 2020 01:35:34 +0000 (01:35 +0000)
Change-Id: Ia6ac34dfb38b71eff7b573b3c9ce477fef0ef5f7
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/23453
Reviewed-by: Bobby R. Bruce <bbruce@ucdavis.edu>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/riscv/linux/process.cc
src/arch/riscv/linux/process.hh
src/arch/riscv/process.cc
src/arch/riscv/process.hh

index d5be09848b28ee552e1502e19fe93c1d9278d62d..257fe770953475a9d50f72bc2cc9f755e67241a4 100644 (file)
@@ -116,7 +116,7 @@ unameFunc32(SyscallDesc *desc, int callnum, ThreadContext *tc, Addr utsname)
     return 0;
 }
 
-std::map<int, SyscallDescABI<DefaultSyscallABI>>
+std::map<int, SyscallDescABI<RiscvProcess::SyscallABI>>
         RiscvLinuxProcess64::syscallDescs = {
     {0,    { "io_setup" }},
     {1,    { "io_destroy" }},
@@ -448,7 +448,7 @@ std::map<int, SyscallDescABI<DefaultSyscallABI>>
     {2011, { "getmainvars" }}
 };
 
-std::map<int, SyscallDescABI<DefaultSyscallABI>>
+std::map<int, SyscallDescABI<RiscvProcess::SyscallABI>>
         RiscvLinuxProcess32::syscallDescs = {
     {0,    { "io_setup" }},
     {1,    { "io_destroy" }},
index 521d645be3e05d441e03300a6d17044fd0058754..8d0d3ec85838e4e335d48a92bc9993ae4fca5904 100644 (file)
@@ -55,7 +55,7 @@ class RiscvLinuxProcess64 : public RiscvProcess64
     void syscall(ThreadContext *tc, Fault *fault) override;
 
     /// Array of syscall descriptors, indexed by call number.
-    static std::map<int, SyscallDescABI<DefaultSyscallABI>> syscallDescs;
+    static std::map<int, SyscallDescABI<SyscallABI>> syscallDescs;
 };
 
 class RiscvLinuxProcess32 : public RiscvProcess32
@@ -75,7 +75,7 @@ class RiscvLinuxProcess32 : public RiscvProcess32
     void syscall(ThreadContext *tc, Fault *fault) override;
 
     /// Array of syscall descriptors, indexed by call number.
-    static std::map<int, SyscallDescABI<DefaultSyscallABI>> syscallDescs;
+    static std::map<int, SyscallDescABI<SyscallABI>> syscallDescs;
 };
 
 #endif // __RISCV_LINUX_PROCESS_HH__
index a80f88cdc504f4fe20660a6b729f791a389e34fc..9041bf3160b29a3080d491f8fa097d38f18a8644 100644 (file)
@@ -266,3 +266,7 @@ RiscvProcess::setSyscallReturn(ThreadContext *tc, SyscallReturn sysret)
         tc->setIntReg(SyscallPseudoReturnReg, sysret.encodedValue());
     }
 }
+
+const std::vector<int> RiscvProcess::SyscallABI::ArgumentRegs = {
+    10, 11, 12, 13, 14, 15, 16
+};
index 933d6d19f6b37f0a3b01d5daf00fb3f3688a4b95..f3f8462b711146cbc068192fddd5430cc137cd6d 100644 (file)
@@ -35,6 +35,7 @@
 
 #include "mem/page_table.hh"
 #include "sim/process.hh"
+#include "sim/syscall_abi.hh"
 
 class ObjectFile;
 class System;
@@ -54,6 +55,36 @@ class RiscvProcess : public Process
                           SyscallReturn return_value) override;
 
     virtual bool mmapGrowsDown() const override { return false; }
+
+    //FIXME RISCV needs to handle 64 bit arguments in its 32 bit ISA.
+    struct SyscallABI : public GenericSyscallABI64
+    {
+        static const std::vector<int> ArgumentRegs;
+    };
+};
+
+namespace GuestABI
+{
+
+template <>
+struct Result<RiscvProcess::SyscallABI, SyscallReturn>
+{
+    static void
+    store(ThreadContext *tc, const SyscallReturn &ret)
+    {
+        if (ret.suppressed() || ret.needsRetry())
+            return;
+
+        if (ret.successful()) {
+            // no error
+            tc->setIntReg(RiscvISA::ReturnValueReg, ret.returnValue());
+        } else {
+            // got an error, return details
+            tc->setIntReg(RiscvISA::ReturnValueReg, ret.encodedValue());
+        }
+    }
+};
+
 };
 
 class RiscvProcess64 : public RiscvProcess