[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 09/19] target/microblaze: Force rtid, rted, rtbd to exit
From: |
Richard Henderson |
Subject: |
[PATCH v3 09/19] target/microblaze: Force rtid, rted, rtbd to exit |
Date: |
Fri, 4 Sep 2020 12:08:32 -0700 |
These return-from-exception type instructions have modified
MSR to re-enable various forms of interrupt. Force a return
to the main loop.
Consolidate the cleanup of tb_flags into mb_tr_translate_insn.
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>
---
target/microblaze/translate.c | 27 ++++++++++++++++-----------
1 file changed, 16 insertions(+), 11 deletions(-)
diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c
index 608d413c83..da84fdb20b 100644
--- a/target/microblaze/translate.c
+++ b/target/microblaze/translate.c
@@ -1518,7 +1518,6 @@ static void do_rti(DisasContext *dc)
tcg_gen_or_i32(cpu_msr, cpu_msr, tmp);
tcg_temp_free_i32(tmp);
- dc->tb_flags &= ~DRTI_FLAG;
}
static void do_rtb(DisasContext *dc)
@@ -1531,7 +1530,6 @@ static void do_rtb(DisasContext *dc)
tcg_gen_or_i32(cpu_msr, cpu_msr, tmp);
tcg_temp_free_i32(tmp);
- dc->tb_flags &= ~DRTB_FLAG;
}
static void do_rte(DisasContext *dc)
@@ -1545,7 +1543,6 @@ static void do_rte(DisasContext *dc)
tcg_gen_or_i32(cpu_msr, cpu_msr, tmp);
tcg_temp_free_i32(tmp);
- dc->tb_flags &= ~DRTE_FLAG;
}
/* Insns connected to FSL or AXI stream attached devices. */
@@ -1700,12 +1697,16 @@ static void mb_tr_translate_insn(DisasContextBase *dcb,
CPUState *cs)
* Finish any return-from branch.
* TODO: Diagnose rtXd in delay slot of rtYd earlier.
*/
- if (dc->tb_flags & DRTI_FLAG) {
- do_rti(dc);
- } else if (dc->tb_flags & DRTB_FLAG) {
- do_rtb(dc);
- } else if (dc->tb_flags & DRTE_FLAG) {
- do_rte(dc);
+ uint32_t rt_ibe = dc->tb_flags & (DRTI_FLAG | DRTB_FLAG | DRTE_FLAG);
+ if (unlikely(rt_ibe != 0)) {
+ dc->tb_flags &= ~(DRTI_FLAG | DRTB_FLAG | DRTE_FLAG);
+ if (rt_ibe & DRTI_FLAG) {
+ do_rti(dc);
+ } else if (rt_ibe & DRTB_FLAG) {
+ do_rtb(dc);
+ } else {
+ do_rte(dc);
+ }
}
/* Complete the branch, ending the TB. */
@@ -1723,8 +1724,12 @@ static void mb_tr_translate_insn(DisasContextBase *dcb,
CPUState *cs)
*/
break;
case DISAS_NEXT:
- /* Normal insn a delay slot. */
- dc->base.is_jmp = DISAS_JUMP;
+ /*
+ * Normal insn a delay slot.
+ * However, the return-from-exception type insns should
+ * return to the main loop, as they have adjusted MSR.
+ */
+ dc->base.is_jmp = (rt_ibe ? DISAS_EXIT_JUMP : DISAS_JUMP);
break;
case DISAS_EXIT_NEXT:
/*
--
2.25.1
- [PATCH v3 00/19] target/microblaze improvements, Richard Henderson, 2020/09/04
- [PATCH v3 01/19] target/microblaze: Collected fixes for env->iflags, Richard Henderson, 2020/09/04
- [PATCH v3 02/19] target/microblaze: Renumber D_FLAG, Richard Henderson, 2020/09/04
- [PATCH v3 03/19] target/microblaze: Cleanup mb_cpu_do_interrupt, Richard Henderson, 2020/09/04
- [PATCH v3 04/19] target/microblaze: Rename mmu structs, Richard Henderson, 2020/09/04
- [PATCH v3 06/19] target/microblaze: Introduce DISAS_EXIT_NEXT, DISAS_EXIT_JUMP, Richard Henderson, 2020/09/04
- [PATCH v3 05/19] target/microblaze: Rename DISAS_UPDATE to DISAS_EXIT, Richard Henderson, 2020/09/04
- [PATCH v3 07/19] target/microblaze: Replace cpustate_changed with DISAS_EXIT_NEXT, Richard Henderson, 2020/09/04
- [PATCH v3 08/19] target/microblaze: Handle DISAS_EXIT_NEXT in delay slot, Richard Henderson, 2020/09/04
- [PATCH v3 10/19] target/microblaze: Use tcg_gen_lookup_and_goto_ptr, Richard Henderson, 2020/09/04
- [PATCH v3 09/19] target/microblaze: Force rtid, rted, rtbd to exit,
Richard Henderson <=
- [PATCH v3 11/19] target/microblaze: Diagnose invalid insns in delay slots, Richard Henderson, 2020/09/04
- [PATCH v3 12/19] target/microblaze: Split out MicroBlazeCPUConfig, Richard Henderson, 2020/09/04
- [PATCH v3 13/19] target/microblaze: Reorg MicroBlazeCPUConfig to minimize holes, Richard Henderson, 2020/09/04
- [PATCH v3 14/19] target/microblaze: Move pvr regs to MicroBlazeCPUConfig, Richard Henderson, 2020/09/04
- [PATCH v3 15/19] target/microblaze: Treat pvr_regs as constant, Richard Henderson, 2020/09/04
- [PATCH v3 18/19] target/microblaze: Put MicroBlazeCPUConfig into DisasContext, Richard Henderson, 2020/09/04