Revisited register implementation in gem5

Change-Id: I31fd80d374c945adaf35b47958d6437a8e2d48c3
This commit is contained in:
Adrian Böckenkamp
2013-04-24 14:16:25 +02:00
parent 896d6cc4c1
commit a43da33fd0
3 changed files with 19 additions and 19 deletions

View File

@ -9,15 +9,17 @@ ArmArchitecture::ArmArchitecture()
// TODO: Add missing registers
// 16x 32-Bit GP Registers
for (int i = 0; i < 16; i++) {
Register *reg = new Register(i, RT_GP, 32);
// Build and set the register name:
std::stringstream sstr;
sstr << "R" << i+1;
reg->setName(sstr.str().c_str());
m_addRegister(reg);
if (i != RI_IP) { // IP will be added separately (see below)
Register *reg = new Register(i, RT_GP, 32);
// Build and set the register name:
std::stringstream sstr;
sstr << "R" << i+1;
reg->setName(sstr.str().c_str());
m_addRegister(reg);
}
}
// Instruction Pointer
// Instruction Pointer:
Register *reg = new Register(RI_IP, RT_IP, 32);
reg->setName("IP");
m_addRegister(reg);

View File

@ -67,7 +67,9 @@ enum GPRegIndex {
RI_R14_FIQ
};
// TODO: Enum for misc registers
// TODO: Enum for misc registers, see (e.g.)
// simulators/gem5/src/arch/arm/miscregs.hh and
// simulators/gem5/src/arch/arm/intregs.hh
} // end-of-namespace: fail

View File

@ -11,12 +11,8 @@ namespace fail {
regdata_t GetRegisterContent(System* sys, unsigned int id, RegisterType type, size_t idx)
{
switch (type) {
case RT_GP:
if (idx == 15) {
return sys->getThreadContext(id)->pcState().pc();
}
return sys->getThreadContext(id)->readIntReg(idx);
case RT_FP: return sys->getThreadContext(id)->readFloatReg(idx); // FIXME: correct?! (FP <-> Float?!)
case RT_GP: // pass on...
case RT_FP: return sys->getThreadContext(id)->readIntReg(idx);
case RT_ST: return sys->getThreadContext(id)->readMiscReg(idx);
case RT_IP: return sys->getThreadContext(id)->pcState().pc();
}
@ -29,13 +25,13 @@ void SetRegisterContent(System* sys, unsigned int id, RegisterType type, size_t
regdata_t value)
{
switch (type) {
case RT_GP: sys->getThreadContext(id)->setIntReg(idx, value); break;
case RT_FP: sys->getThreadContext(id)->setFloatReg(idx, value); break; // FIXME: correct?! (FP <-> Float?!)
case RT_ST: sys->getThreadContext(id)->setMiscReg(idx, value); break;
case RT_IP: sys->getThreadContext(id)->pcState().pc(static_cast<Addr>(value)); break;
case RT_GP: // pass on...
case RT_FP: sys->getThreadContext(id)->setIntReg(idx, value); return;
case RT_ST: sys->getThreadContext(id)->setMiscReg(idx, value); return;
case RT_IP: sys->getThreadContext(id)->pcState().pc(static_cast<Addr>(value)); return;
}
// This shouldn't be reached if a valid register is passed
assert(false && "FATAL ERROR: invalid register type (should never be reached)!");
assert(false && "FATAL ERROR: Invalid register type (should never be reached)!");
}
void ReadMemory(System* sys, guest_address_t addr, size_t cnt, void *dest)