From: Max Filippov Date: Tue, 25 Oct 2011 14:24:09 +0000 (+0400) Subject: target-xtensa: raise an exception for invalid and reserved opcodes X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=6b814719b4ef3d69c61ec0c1d580006110b04b04;p=qemu.git target-xtensa: raise an exception for invalid and reserved opcodes This includes opcodes from disabled features and those marked reserved in the ISA. Also end TB on opcodes that definitely generate an exception: illegal instructions, syscall and privileged instructions. Signed-off-by: Max Filippov --- diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index b724d466d6..c81450d1a5 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -266,6 +266,10 @@ static void gen_exception_cause(DisasContext *dc, uint32_t cause) gen_helper_exception_cause(tpc, tcause); tcg_temp_free(tpc); tcg_temp_free(tcause); + if (cause == ILLEGAL_INSTRUCTION_CAUSE || + cause == SYSCALL_CAUSE) { + dc->is_jmp = DISAS_UPDATE; + } } static void gen_exception_cause_vaddr(DisasContext *dc, uint32_t cause, @@ -283,6 +287,7 @@ static void gen_check_privilege(DisasContext *dc) { if (dc->cring) { gen_exception_cause(dc, PRIVILEGED_CAUSE); + dc->is_jmp = DISAS_UPDATE; } } @@ -2378,7 +2383,7 @@ static void disas_xtensa_insn(DisasContext *dc) invalid_opcode: qemu_log("INVALID(pc = %08x)\n", dc->pc); - dc->pc = dc->next_pc; + gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE); #undef HAS_OPTION }