aboutsummaryrefslogtreecommitdiff
path: root/target-mips/op.c
diff options
context:
space:
mode:
authorths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>2007-04-14 12:56:46 +0000
committerths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>2007-04-14 12:56:46 +0000
commit16c00cb2c2017aaa04f2849903210761825145e7 (patch)
treecb24445c34422504ae0715a71526c507dd31dea5 /target-mips/op.c
parentdcb5b19a4e32d300a3ddf14fa8cc9a0a055dd1db (diff)
Restart interrupts after an exception.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2664 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-mips/op.c')
-rw-r--r--target-mips/op.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/target-mips/op.c b/target-mips/op.c
index 3951204169..9e9f8eb759 100644
--- a/target-mips/op.c
+++ b/target-mips/op.c
@@ -1365,7 +1365,7 @@ void op_mtc0_status (void)
!(env->hflags & MIPS_HFLAG_DM) &&
(val & (1 << CP0St_UM)))
env->hflags |= MIPS_HFLAG_UM;
- env->CP0_Status = val;
+ env->CP0_Status = (env->CP0_Status & ~0xF878FF17) | val;
if (loglevel & CPU_LOG_EXEC)
CALL_FROM_TB2(do_mtc0_status_debug, old, val);
CALL_FROM_TB1(cpu_mips_update_irq, env);
@@ -2181,6 +2181,19 @@ void op_save_pc (void)
RETURN();
}
+void op_interrupt_restart (void)
+{
+ if (!(env->CP0_Status & (1 << CP0St_EXL)) &&
+ !(env->CP0_Status & (1 << CP0St_ERL)) &&
+ !(env->hflags & MIPS_HFLAG_DM) &&
+ (env->CP0_Status & (1 << CP0St_IE)) &&
+ (env->CP0_Status & env->CP0_Cause & CP0Ca_IP_mask)) {
+ env->CP0_Cause &= ~(0x1f << CP0Ca_EC);
+ CALL_FROM_TB1(do_raise_exception, EXCP_EXT_INTERRUPT);
+ }
+ RETURN();
+}
+
void op_raise_exception (void)
{
CALL_FROM_TB1(do_raise_exception, PARAM1);