From 64fb41e9270caf208b8f411d10e4e70b2b61db86 Mon Sep 17 00:00:00 2001 From: Inochi Amaoto Date: Sun, 19 Mar 2023 08:12:31 +0800 Subject: [PATCH] lib: sbi_trap: change flush tlb in all cases As flush tlb in interrupt and mode switch is not enough. Flush tlb in all cases. Signed-off-by: Inochi Amaoto --- lib/sbi/sbi_trap.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/lib/sbi/sbi_trap.c b/lib/sbi/sbi_trap.c index 64872ceb..f77d49df 100644 --- a/lib/sbi/sbi_trap.c +++ b/lib/sbi/sbi_trap.c @@ -268,16 +268,16 @@ struct sbi_trap_regs *sbi_trap_handler(struct sbi_trap_regs *regs) ulong mtval = csr_read(CSR_MTVAL), mtval2 = 0, mtinst = 0; struct sbi_trap_info trap; + if (misa_extension('S')) { + __asm__ __volatile__("sfence.vma"); + } + if (misa_extension('H')) { mtval2 = csr_read(CSR_MTVAL2); mtinst = csr_read(CSR_MTINST); } if (mcause & (1UL << (__riscv_xlen - 1))) { - if (misa_extension('S')) { - __asm__ __volatile__("sfence.vma"); - } - if (sbi_hart_has_extension(sbi_scratch_thishart_ptr(), SBI_HART_EXT_SMAIA)) rc = sbi_trap_aia_irq(regs, mcause); @@ -322,10 +322,6 @@ struct sbi_trap_regs *sbi_trap_handler(struct sbi_trap_regs *regs) trap.tinst = mtinst; trap.gva = sbi_regs_gva(regs); - if (misa_extension('S')) { - __asm__ __volatile__("sfence.vma"); - } - rc = sbi_trap_redirect(regs, &trap); break; };