diff options
author | Michael Walle <michael@walle.cc> | 2013-09-23 20:47:33 +0200 |
---|---|---|
committer | Michael Walle <michael@walle.cc> | 2014-02-04 19:47:39 +0100 |
commit | 667ff9612b786f9bb5b70135811164b48b7d44eb (patch) | |
tree | 82e7dffb9c98421b72a4ae48772bc4b51eed307d /target-lm32/op_helper.c | |
parent | 8c5edce5b775f98cff2e340427740137bd6847be (diff) | |
download | hqemu-667ff9612b786f9bb5b70135811164b48b7d44eb.zip hqemu-667ff9612b786f9bb5b70135811164b48b7d44eb.tar.gz |
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.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/target-lm32/op_helper.c b/target-lm32/op_helper.c index 71f21d1..7189cb5 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; |