aboutsummaryrefslogtreecommitdiff
path: root/target-lm32/op_helper.c
diff options
context:
space:
mode:
authorMichael Walle <michael@walle.cc>2013-09-23 20:47:33 +0200
committerMichael Walle <michael@walle.cc>2014-02-04 19:47:39 +0100
commit667ff9612b786f9bb5b70135811164b48b7d44eb (patch)
tree82e7dffb9c98421b72a4ae48772bc4b51eed307d /target-lm32/op_helper.c
parent8c5edce5b775f98cff2e340427740137bd6847be (diff)
target-lm32: stop VM on illegal or unknown instruction
Instead of translating the instruction to a no-op, pause the VM and display a message to the user. As a side effect, this also works for instructions where the operands are only known at runtime. Signed-off-by: Michael Walle <michael@walle.cc>
Diffstat (limited to 'target-lm32/op_helper.c')
-rw-r--r--target-lm32/op_helper.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/target-lm32/op_helper.c b/target-lm32/op_helper.c
index 71f21d1e24..7189cb5cc4 100644
--- a/target-lm32/op_helper.c
+++ b/target-lm32/op_helper.c
@@ -8,6 +8,10 @@
#include "exec/softmmu_exec.h"
+#ifndef CONFIG_USER_ONLY
+#include "sysemu/sysemu.h"
+#endif
+
#if !defined(CONFIG_USER_ONLY)
#define MMUSUFFIX _mmu
#define SHIFT 0
@@ -39,6 +43,19 @@ void HELPER(hlt)(CPULM32State *env)
cpu_loop_exit(env);
}
+void HELPER(ill)(CPULM32State *env)
+{
+#ifndef CONFIG_USER_ONLY
+ CPUState *cs = CPU(lm32_env_get_cpu(env));
+ fprintf(stderr, "VM paused due to illegal instruction. "
+ "Connect a debugger or switch to the monitor console "
+ "to find out more.\n");
+ qemu_system_vmstop_request(RUN_STATE_PAUSED);
+ cs->halted = 1;
+ raise_exception(env, EXCP_HALTED);
+#endif
+}
+
void HELPER(wcsr_bp)(CPULM32State *env, uint32_t bp, uint32_t idx)
{
uint32_t addr = bp & ~1;