aboutsummaryrefslogtreecommitdiff
path: root/sim/arm/arminit.c
diff options
context:
space:
mode:
Diffstat (limited to 'sim/arm/arminit.c')
-rw-r--r--sim/arm/arminit.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/sim/arm/arminit.c b/sim/arm/arminit.c
index 2f6e73d..bdbb2c7 100644
--- a/sim/arm/arminit.c
+++ b/sim/arm/arminit.c
@@ -106,6 +106,9 @@ ARMul_NewState (void)
state->OSptr = NULL;
state->CommandLine = NULL;
+ state->CP14R0_CCD = -1;
+ state->LastTime = 0;
+
state->EventSet = 0;
state->Now = 0;
state->EventPtr = (struct EventNode **) malloc ((unsigned) EVENTLISTSIZE *
@@ -299,10 +302,14 @@ ARMul_Abort (ARMul_State * state, ARMword vector)
SETABORT (IBIT, SVC26MODE, isize);
break;
case ARMul_IRQV: /* IRQ */
- SETABORT (IBIT, state->prog32Sig ? IRQ32MODE : IRQ26MODE, esize);
+ if (!state->is_XScale
+ || (state->CPRead[13](state, 0, 0) & ARMul_CP13_R0_IRQ))
+ SETABORT (IBIT, state->prog32Sig ? IRQ32MODE : IRQ26MODE, esize);
break;
case ARMul_FIQV: /* FIQ */
- SETABORT (INTBITS, state->prog32Sig ? FIQ32MODE : FIQ26MODE, esize);
+ if (!state->is_XScale
+ || (state->CPRead[13](state, 0, 0) & ARMul_CP13_R0_FIQ))
+ SETABORT (INTBITS, state->prog32Sig ? FIQ32MODE : FIQ26MODE, esize);
break;
}
if (ARMul_MODE32BIT)