aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>2006-12-10 22:08:10 +0000
committerths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>2006-12-10 22:08:10 +0000
commitca7c2b1b9f984f622c7495004483016fee61e489 (patch)
tree039162ed6c3010cb651694b5ccc850033fdf3a2d
parent7d600c804d79e21254a20b953d6bd175597d752d (diff)
Handle invalid accesses as SIGILL for mips/mipsel userland emulation.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2235 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--linux-user/main.c2
-rw-r--r--target-mips/helper.c7
-rw-r--r--target-mips/translate.c3
3 files changed, 12 insertions, 0 deletions
diff --git a/linux-user/main.c b/linux-user/main.c
index 6dd08022f0..c423d299b5 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -1352,6 +1352,8 @@ void cpu_loop(CPUMIPSState *env)
}
}
break;
+ case EXCP_TLBL:
+ case EXCP_TLBS:
case EXCP_CpU:
case EXCP_RI:
info.si_signo = TARGET_SIGILL;
diff --git a/target-mips/helper.c b/target-mips/helper.c
index a222d6b0ec..a0a56d8f04 100644
--- a/target-mips/helper.c
+++ b/target-mips/helper.c
@@ -243,6 +243,12 @@ int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
return ret;
}
+#if defined(CONFIG_USER_ONLY)
+void do_interrupt (CPUState *env)
+{
+ env->exception_index = EXCP_NONE;
+}
+#else
void do_interrupt (CPUState *env)
{
target_ulong offset;
@@ -409,3 +415,4 @@ void do_interrupt (CPUState *env)
}
env->exception_index = EXCP_NONE;
}
+#endif /* !defined(CONFIG_USER_ONLY) */
diff --git a/target-mips/translate.c b/target-mips/translate.c
index 74fa114160..64f7d75650 100644
--- a/target-mips/translate.c
+++ b/target-mips/translate.c
@@ -4072,6 +4072,7 @@ void cpu_reset (CPUMIPSState *env)
tlb_flush(env, 1);
/* Minimal init */
+#if !defined(CONFIG_USER_ONLY)
if (env->hflags & MIPS_HFLAG_BMASK) {
/* If the exception was raised from a delay slot,
* come back to the jump. */
@@ -4098,9 +4099,11 @@ void cpu_reset (CPUMIPSState *env)
/* Count register increments in debug mode, EJTAG version 1 */
env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER);
env->CP0_PRid = MIPS_CPU;
+#endif
env->exception_index = EXCP_NONE;
#if defined(CONFIG_USER_ONLY)
env->hflags |= MIPS_HFLAG_UM;
+ env->user_mode_only = 1;
#endif
#ifdef MIPS_USES_FPU
env->fcr0 = MIPS_FCR0;