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:
Gabe Black
2019-12-07 20:13:50 -08:00
parent 4078b32ba1
commit 216d828f41
4 changed files with 37 additions and 2 deletions

View File

@@ -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" },

View File

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

View File

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

View File

@@ -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__