ARM: Clean up flattening for SPSR adding
This commit is contained in:
parent
a02d82f9f8
commit
d2fac84b95
|
@ -157,28 +157,17 @@ MiscReg
|
||||||
ISA::readMiscRegNoEffect(int misc_reg)
|
ISA::readMiscRegNoEffect(int misc_reg)
|
||||||
{
|
{
|
||||||
assert(misc_reg < NumMiscRegs);
|
assert(misc_reg < NumMiscRegs);
|
||||||
if (misc_reg == MISCREG_SPSR) {
|
|
||||||
CPSR cpsr = miscRegs[MISCREG_CPSR];
|
int flat_idx;
|
||||||
switch (cpsr.mode) {
|
if (misc_reg == MISCREG_SPSR)
|
||||||
case MODE_USER:
|
flat_idx = flattenMiscIndex(misc_reg);
|
||||||
return miscRegs[MISCREG_SPSR];
|
else
|
||||||
case MODE_FIQ:
|
flat_idx = misc_reg;
|
||||||
return miscRegs[MISCREG_SPSR_FIQ];
|
MiscReg val = miscRegs[flat_idx];
|
||||||
case MODE_IRQ:
|
|
||||||
return miscRegs[MISCREG_SPSR_IRQ];
|
DPRINTF(MiscRegs, "Reading From misc reg %d (%d) : %#x\n",
|
||||||
case MODE_SVC:
|
misc_reg, flat_idx, val);
|
||||||
return miscRegs[MISCREG_SPSR_SVC];
|
return val;
|
||||||
case MODE_MON:
|
|
||||||
return miscRegs[MISCREG_SPSR_MON];
|
|
||||||
case MODE_ABORT:
|
|
||||||
return miscRegs[MISCREG_SPSR_ABT];
|
|
||||||
case MODE_UNDEFINED:
|
|
||||||
return miscRegs[MISCREG_SPSR_UND];
|
|
||||||
default:
|
|
||||||
return miscRegs[MISCREG_SPSR];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return miscRegs[misc_reg];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -237,36 +226,16 @@ void
|
||||||
ISA::setMiscRegNoEffect(int misc_reg, const MiscReg &val)
|
ISA::setMiscRegNoEffect(int misc_reg, const MiscReg &val)
|
||||||
{
|
{
|
||||||
assert(misc_reg < NumMiscRegs);
|
assert(misc_reg < NumMiscRegs);
|
||||||
if (misc_reg == MISCREG_SPSR) {
|
|
||||||
CPSR cpsr = miscRegs[MISCREG_CPSR];
|
int flat_idx;
|
||||||
switch (cpsr.mode) {
|
if (misc_reg == MISCREG_SPSR)
|
||||||
case MODE_USER:
|
flat_idx = flattenMiscIndex(misc_reg);
|
||||||
miscRegs[MISCREG_SPSR] = val;
|
else
|
||||||
return;
|
flat_idx = misc_reg;
|
||||||
case MODE_FIQ:
|
miscRegs[flat_idx] = val;
|
||||||
miscRegs[MISCREG_SPSR_FIQ] = val;
|
|
||||||
return;
|
DPRINTF(MiscRegs, "Writing to misc reg %d (%d) : %#x\n", misc_reg,
|
||||||
case MODE_IRQ:
|
flat_idx, val);
|
||||||
miscRegs[MISCREG_SPSR_IRQ] = val;
|
|
||||||
return;
|
|
||||||
case MODE_SVC:
|
|
||||||
miscRegs[MISCREG_SPSR_SVC] = val;
|
|
||||||
return;
|
|
||||||
case MODE_MON:
|
|
||||||
miscRegs[MISCREG_SPSR_MON] = val;
|
|
||||||
return;
|
|
||||||
case MODE_ABORT:
|
|
||||||
miscRegs[MISCREG_SPSR_ABT] = val;
|
|
||||||
return;
|
|
||||||
case MODE_UNDEFINED:
|
|
||||||
miscRegs[MISCREG_SPSR_UND] = val;
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
miscRegs[MISCREG_SPSR] = val;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
miscRegs[misc_reg] = val;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -276,8 +245,8 @@ ISA::setMiscReg(int misc_reg, const MiscReg &val, ThreadContext *tc)
|
||||||
if (misc_reg == MISCREG_CPSR) {
|
if (misc_reg == MISCREG_CPSR) {
|
||||||
updateRegMap(val);
|
updateRegMap(val);
|
||||||
CPSR cpsr = val;
|
CPSR cpsr = val;
|
||||||
DPRINTF(Arm, "Updating CPSR to %#x f:%d i:%d a:%d mode:%#x\n",
|
DPRINTF(Arm, "Updating CPSR from %#x to %#x f:%d i:%d a:%d mode:%#x\n",
|
||||||
cpsr, cpsr.f, cpsr.i, cpsr.a, cpsr.mode);
|
miscRegs[misc_reg], cpsr, cpsr.f, cpsr.i, cpsr.a, cpsr.mode);
|
||||||
Addr npc = tc->readNextPC() & ~PcModeMask;
|
Addr npc = tc->readNextPC() & ~PcModeMask;
|
||||||
if (cpsr.j)
|
if (cpsr.j)
|
||||||
npc = npc | (ULL(1) << PcJBitShift);
|
npc = npc | (ULL(1) << PcJBitShift);
|
||||||
|
|
|
@ -137,6 +137,46 @@ namespace ArmISA
|
||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
flattenMiscIndex(int reg)
|
||||||
|
{
|
||||||
|
if (reg == MISCREG_SPSR) {
|
||||||
|
int spsr_idx = NUM_MISCREGS;
|
||||||
|
CPSR cpsr = miscRegs[MISCREG_CPSR];
|
||||||
|
switch (cpsr.mode) {
|
||||||
|
case MODE_USER:
|
||||||
|
warn("User mode does not have SPSR\n");
|
||||||
|
spsr_idx = MISCREG_SPSR;
|
||||||
|
break;
|
||||||
|
case MODE_FIQ:
|
||||||
|
spsr_idx = MISCREG_SPSR_FIQ;
|
||||||
|
break;
|
||||||
|
case MODE_IRQ:
|
||||||
|
spsr_idx = MISCREG_SPSR_IRQ;
|
||||||
|
break;
|
||||||
|
case MODE_SVC:
|
||||||
|
spsr_idx = MISCREG_SPSR_SVC;
|
||||||
|
break;
|
||||||
|
case MODE_MON:
|
||||||
|
spsr_idx = MISCREG_SPSR_MON;
|
||||||
|
break;
|
||||||
|
case MODE_ABORT:
|
||||||
|
spsr_idx = MISCREG_SPSR_ABT;
|
||||||
|
break;
|
||||||
|
case MODE_UNDEFINED:
|
||||||
|
spsr_idx = MISCREG_SPSR_UND;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
warn("Trying to access SPSR in an invalid mode: %d\n",
|
||||||
|
cpsr.mode);
|
||||||
|
spsr_idx = MISCREG_SPSR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return spsr_idx;
|
||||||
|
}
|
||||||
|
return reg;
|
||||||
|
}
|
||||||
|
|
||||||
void serialize(EventManager *em, std::ostream &os)
|
void serialize(EventManager *em, std::ostream &os)
|
||||||
{}
|
{}
|
||||||
void unserialize(EventManager *em, Checkpoint *cp,
|
void unserialize(EventManager *em, Checkpoint *cp,
|
||||||
|
|
Loading…
Reference in a new issue