#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;
};