arch-riscv: fault on mstatus accesses from lower privilege modes.
[gem5.git] / src / arch / riscv / process.hh
index 933d6d19f6b37f0a3b01d5daf00fb3f3688a4b95..05cde41fe8332d186adcd24648b1422ba3982614 100644 (file)
 
 #include "mem/page_table.hh"
 #include "sim/process.hh"
+#include "sim/syscall_abi.hh"
 
+namespace Loader
+{
 class ObjectFile;
+} // namespace Loader
+
 class System;
 
 class RiscvProcess : public Process
 {
   protected:
-    RiscvProcess(ProcessParams * params, ObjectFile *objFile);
+    RiscvProcess(ProcessParams * params, ::Loader::ObjectFile *objFile);
     template<class IntType>
     void argsInit(int pageSize);
 
   public:
-    RegVal getSyscallArg(ThreadContext *tc, int &i) override;
-    /// Explicitly import the otherwise hidden getSyscallArg
-    using Process::getSyscallArg;
-    void setSyscallReturn(ThreadContext *tc,
-                          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
 {
   protected:
-    RiscvProcess64(ProcessParams * params, ObjectFile *objFile);
+    RiscvProcess64(ProcessParams * params, ::Loader::ObjectFile *objFile);
     void initState() override;
 };
 
 class RiscvProcess32 : public RiscvProcess
 {
   protected:
-    RiscvProcess32(ProcessParams * params, ObjectFile *objFile);
+    RiscvProcess32(ProcessParams * params, ::Loader::ObjectFile *objFile);
     void initState() override;
 };