riscv: Use a riscv specific GuestABI for riscv system calls.
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>
This commit is contained in:
@@ -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" }},
|
||||
|
||||
@@ -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__
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user