提交 ecbe1de8 编写于 作者: M Michael Walle 提交者: Edgar E. Iglesias

lm32: fix exception handling

Global interrupt enable bit is already saved within the exception handler
helper routine. Thus remove extra code in translation routines.

Additionally, debug exceptions has always DEBA as base address.
Signed-off-by: NMichael Walle <michael@walle.cc>
Signed-off-by: NEdgar E. Iglesias <edgar.iglesias@gmail.com>
上级 4a043713
......@@ -76,11 +76,7 @@ void do_interrupt(CPUState *env)
env->regs[R_BA] = env->pc;
env->ie |= (env->ie & IE_IE) ? IE_BIE : 0;
env->ie &= ~IE_IE;
if (env->dc & DC_RE) {
env->pc = env->deba + (env->exception_index * 32);
} else {
env->pc = env->eba + (env->exception_index * 32);
}
env->pc = env->deba + (env->exception_index * 32);
log_cpu_state_mask(CPU_LOG_INT, env, 0);
break;
default:
......
......@@ -598,36 +598,10 @@ static void dec_scall(DisasContext *dc)
t0 = tcg_temp_new();
l1 = gen_new_label();
/* save IE.IE */
tcg_gen_andi_tl(t0, cpu_ie, IE_IE);
/* IE.IE = 0 */
tcg_gen_andi_tl(cpu_ie, cpu_ie, ~IE_IE);
if (dc->imm5 == 7) {
/* IE.EIE = IE.IE */
tcg_gen_ori_tl(cpu_ie, cpu_ie, IE_EIE);
tcg_gen_brcondi_tl(TCG_COND_EQ, t0, IE_IE, l1);
tcg_gen_andi_tl(cpu_ie, cpu_ie, ~IE_EIE);
gen_set_label(l1);
/* gpr[ea] = PC */
tcg_gen_movi_tl(cpu_R[R_EA], dc->pc);
tcg_temp_free(t0);
tcg_gen_movi_tl(cpu_pc, dc->pc);
t_gen_raise_exception(dc, EXCP_SYSTEMCALL);
} else {
/* IE.BIE = IE.IE */
tcg_gen_ori_tl(cpu_ie, cpu_ie, IE_BIE);
tcg_gen_brcondi_tl(TCG_COND_EQ, t0, IE_IE, l1);
tcg_gen_andi_tl(cpu_ie, cpu_ie, ~IE_BIE);
gen_set_label(l1);
/* gpr[ba] = PC */
tcg_gen_movi_tl(cpu_R[R_BA], dc->pc);
tcg_temp_free(t0);
tcg_gen_movi_tl(cpu_pc, dc->pc);
t_gen_raise_exception(dc, EXCP_BREAKPOINT);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册