ARM: Implement the shadow registers using register flattening.
This commit is contained in:
parent
4a454c4f47
commit
a2b76516c4
1 changed files with 41 additions and 2 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue