target/cris: Mark exceptions as DISAS_NORETURN

After we've raised the exception, we have left the TB.

Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
Tested-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2021-06-19 20:24:37 -07:00
parent a67f11b1d9
commit 1dd09c47f6
2 changed files with 5 additions and 3 deletions

View File

@ -2873,6 +2873,7 @@ static int dec_rfe_etc(CPUCRISState *env, DisasContext *dc)
-offsetof(CRISCPU, env) + offsetof(CPUState, halted)); -offsetof(CRISCPU, env) + offsetof(CPUState, halted));
tcg_gen_movi_tl(env_pc, dc->pc + 2); tcg_gen_movi_tl(env_pc, dc->pc + 2);
t_gen_raise_exception(EXCP_HLT); t_gen_raise_exception(EXCP_HLT);
dc->base.is_jmp = DISAS_NORETURN;
return 2; return 2;
} }
@ -2900,7 +2901,7 @@ static int dec_rfe_etc(CPUCRISState *env, DisasContext *dc)
/* Breaks start at 16 in the exception vector. */ /* Breaks start at 16 in the exception vector. */
t_gen_movi_env_TN(trap_vector, dc->op1 + 16); t_gen_movi_env_TN(trap_vector, dc->op1 + 16);
t_gen_raise_exception(EXCP_BREAK); t_gen_raise_exception(EXCP_BREAK);
dc->base.is_jmp = DISAS_UPDATE; dc->base.is_jmp = DISAS_NORETURN;
break; break;
default: default:
printf("op2=%x\n", dc->op2); printf("op2=%x\n", dc->op2);
@ -3188,7 +3189,7 @@ void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
cris_evaluate_flags(dc); cris_evaluate_flags(dc);
tcg_gen_movi_tl(env_pc, dc->pc); tcg_gen_movi_tl(env_pc, dc->pc);
t_gen_raise_exception(EXCP_DEBUG); t_gen_raise_exception(EXCP_DEBUG);
dc->base.is_jmp = DISAS_UPDATE; dc->base.is_jmp = DISAS_NORETURN;
/* The address covered by the breakpoint must be included in /* The address covered by the breakpoint must be included in
[tb->pc, tb->pc + tb->size) in order to for it to be [tb->pc, tb->pc + tb->size) in order to for it to be
properly cleared -- thus we increment the PC here so that properly cleared -- thus we increment the PC here so that

View File

@ -61,6 +61,7 @@ static inline void cris_illegal_insn(DisasContext *dc)
{ {
qemu_log_mask(LOG_GUEST_ERROR, "illegal insn at pc=%x\n", dc->pc); qemu_log_mask(LOG_GUEST_ERROR, "illegal insn at pc=%x\n", dc->pc);
t_gen_raise_exception(EXCP_BREAK); t_gen_raise_exception(EXCP_BREAK);
dc->base.is_jmp = DISAS_NORETURN;
} }
static void gen_store_v10_conditional(DisasContext *dc, TCGv addr, TCGv val, static void gen_store_v10_conditional(DisasContext *dc, TCGv addr, TCGv val,
@ -1169,7 +1170,7 @@ static unsigned int dec10_ind(CPUCRISState *env, DisasContext *dc)
t_gen_mov_env_TN(trap_vector, c); t_gen_mov_env_TN(trap_vector, c);
tcg_temp_free(c); tcg_temp_free(c);
t_gen_raise_exception(EXCP_BREAK); t_gen_raise_exception(EXCP_BREAK);
dc->base.is_jmp = DISAS_UPDATE; dc->base.is_jmp = DISAS_NORETURN;
return insn_len; return insn_len;
} }
LOG_DIS("%d: jump.%d %d r%d r%d\n", __LINE__, size, LOG_DIS("%d: jump.%d %d r%d r%d\n", __LINE__, size,