aboutsummaryrefslogtreecommitdiff
path: root/target-cris/helper.c
diff options
context:
space:
mode:
authoredgar_igl <edgar_igl@c046a42c-6fe2-441c-8c8c-71466251a162>2008-06-09 23:18:06 +0000
committeredgar_igl <edgar_igl@c046a42c-6fe2-441c-8c8c-71466251a162>2008-06-09 23:18:06 +0000
commit1b1a38b0aaf3a24b9b8162d8aef9e700a42f8d43 (patch)
tree1492c8dbf290afdd5fe16fb1437729671ef287ec /target-cris/helper.c
parent5bf8f1aba1ab727713edf4084e7bc841dd1e6732 (diff)
CRIS: Emulate NMIs.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4719 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-cris/helper.c')
-rw-r--r--target-cris/helper.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/target-cris/helper.c b/target-cris/helper.c
index c16a58a3b0..a29e55c055 100644
--- a/target-cris/helper.c
+++ b/target-cris/helper.c
@@ -78,13 +78,13 @@ int cpu_cris_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
miss = cris_mmu_translate(&res, env, address, rw, mmu_idx);
if (miss)
{
- if (env->exception_index == EXCP_MMU_FAULT)
+ if (env->exception_index == EXCP_BUSFAULT)
cpu_abort(env,
"CRIS: Illegal recursive bus fault."
"addr=%x rw=%d\n",
address, rw);
- env->exception_index = EXCP_MMU_FAULT;
+ env->exception_index = EXCP_BUSFAULT;
env->fault_vector = res.bf_vec;
r = 1;
}
@@ -120,17 +120,20 @@ void do_interrupt(CPUState *env)
env->pregs[PR_ERP] = env->pc + 2;
break;
- case EXCP_MMU_FAULT:
+ case EXCP_NMI:
+ /* NMI is hardwired to vector zero. */
+ ex_vec = 0;
+ env->pregs[PR_CCS] &= ~M_FLAG;
+ env->pregs[PR_NRP] = env->pc;
+ break;
+
+ case EXCP_BUSFAULT:
ex_vec = env->fault_vector;
env->pregs[PR_ERP] = env->pc;
break;
default:
- /* Is the core accepting interrupts? */
- if (!(env->pregs[PR_CCS] & I_FLAG))
- return;
- /* The interrupt controller gives us the
- vector. */
+ /* The interrupt controller gives us the vector. */
ex_vec = env->interrupt_vector;
/* Normal interrupts are taken between
TB's. env->pc is valid here. */