power: Use a power specific GuestABI for power system calls.
Change-Id: I39cf64c025c284b63980f3c2e48fbd8b6c355d2b Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/23452 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:
@@ -91,7 +91,7 @@ unameFunc(SyscallDesc *desc, int callnum, ThreadContext *tc, Addr utsname)
|
||||
return 0;
|
||||
}
|
||||
|
||||
SyscallDescABI<DefaultSyscallABI> PowerLinuxProcess::syscallDescs[] = {
|
||||
SyscallDescABI<PowerProcess::SyscallABI> PowerLinuxProcess::syscallDescs[] = {
|
||||
/* 0 */ { "syscall" },
|
||||
/* 1 */ { "exit", exitFunc },
|
||||
/* 2 */ { "fork" },
|
||||
|
||||
@@ -51,7 +51,7 @@ class PowerLinuxProcess : public PowerProcess
|
||||
using Process::getSyscallArg;
|
||||
|
||||
/// Array of syscall descriptors, indexed by call number.
|
||||
static SyscallDescABI<DefaultSyscallABI> syscallDescs[];
|
||||
static SyscallDescABI<SyscallABI> syscallDescs[];
|
||||
|
||||
const int Num_Syscall_Descs;
|
||||
};
|
||||
|
||||
@@ -288,3 +288,7 @@ PowerProcess::setSyscallReturn(ThreadContext *tc, SyscallReturn sysret)
|
||||
tc->setIntReg(INTREG_CR, cr);
|
||||
tc->setIntReg(ReturnValueReg, sysret.encodedValue());
|
||||
}
|
||||
|
||||
const std::vector<int> PowerProcess::SyscallABI::ArgumentRegs = {
|
||||
3, 4, 5, 6, 7, 8
|
||||
};
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
|
||||
#include "mem/page_table.hh"
|
||||
#include "sim/process.hh"
|
||||
#include "sim/syscall_abi.hh"
|
||||
|
||||
class ObjectFile;
|
||||
|
||||
@@ -52,7 +53,37 @@ class PowerProcess : public Process
|
||||
using Process::getSyscallArg;
|
||||
void setSyscallReturn(ThreadContext *tc,
|
||||
SyscallReturn return_value) override;
|
||||
|
||||
struct SyscallABI : public GenericSyscallABI64
|
||||
{
|
||||
static const std::vector<int> ArgumentRegs;
|
||||
};
|
||||
};
|
||||
|
||||
namespace GuestABI
|
||||
{
|
||||
|
||||
template <>
|
||||
struct Result<PowerProcess::SyscallABI, SyscallReturn>
|
||||
{
|
||||
static void
|
||||
store(ThreadContext *tc, const SyscallReturn &ret)
|
||||
{
|
||||
if (ret.suppressed() || ret.needsRetry())
|
||||
return;
|
||||
|
||||
PowerISA::Cr cr = tc->readIntReg(PowerISA::INTREG_CR);
|
||||
if (ret.successful()) {
|
||||
cr.cr0.so = 0;
|
||||
} else {
|
||||
cr.cr0.so = 1;
|
||||
}
|
||||
tc->setIntReg(PowerISA::INTREG_CR, cr);
|
||||
tc->setIntReg(PowerISA::ReturnValueReg, ret.encodedValue());
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace GuestABI
|
||||
|
||||
#endif // __POWER_PROCESS_HH__
|
||||
|
||||
|
||||
Reference in New Issue
Block a user