ARM: Implement the shadow registers using register flattening.

This commit is contained in:
Gabe Black 2009-11-08 00:07:49 -08:00
parent 4a454c4f47
commit a2b76516c4

View file

@ -44,14 +44,44 @@ namespace ArmISA
{ {
protected: protected:
MiscReg miscRegs[NumMiscRegs]; MiscReg miscRegs[NumMiscRegs];
const IntRegIndex *intRegMap;
void
updateRegMap(CPSR cpsr)
{
switch (cpsr.mode) {
case MODE_USER:
case MODE_SYSTEM:
intRegMap = IntRegUsrMap;
break;
case MODE_FIQ:
intRegMap = IntRegFiqMap;
break;
case MODE_IRQ:
intRegMap = IntRegIrqMap;
break;
case MODE_SVC:
intRegMap = IntRegSvcMap;
break;
case MODE_ABORT:
intRegMap = IntRegAbtMap;
break;
case MODE_UNDEFINED:
intRegMap = IntRegUndMap;
break;
default:
panic("Unrecognized mode setting in CPSR.\n");
}
}
public: public:
void clear() void clear()
{ {
memset(miscRegs, 0, sizeof(miscRegs)); memset(miscRegs, 0, sizeof(miscRegs));
CPSR cpsr = 0; CPSR cpsr = 0;
cpsr.mode = MODE_USER; cpsr.mode = MODE_SYSTEM;
miscRegs[MISCREG_CPSR] = cpsr; miscRegs[MISCREG_CPSR] = cpsr;
updateRegMap(cpsr);
//XXX We need to initialize the rest of the state. //XXX We need to initialize the rest of the state.
} }
@ -79,6 +109,9 @@ namespace ArmISA
void void
setMiscReg(int misc_reg, const MiscReg &val, ThreadContext *tc) setMiscReg(int misc_reg, const MiscReg &val, ThreadContext *tc)
{ {
if (misc_reg == MISCREG_CPSR) {
updateRegMap(val);
}
assert(misc_reg < NumMiscRegs); assert(misc_reg < NumMiscRegs);
miscRegs[misc_reg] = val; miscRegs[misc_reg] = val;
} }
@ -86,7 +119,13 @@ namespace ArmISA
int int
flattenIntIndex(int reg) flattenIntIndex(int reg)
{ {
return reg; assert(reg >= 0);
if (reg < NUM_ARCH_INTREGS) {
return intRegMap[reg];
} else {
assert(reg < NUM_INTREGS);
return reg;
}
} }
int int