lib: sbi_trap: Restore redirect for access faults
authorSamuel Holland <samuel@sholland.org>
Sat, 14 Aug 2021 13:41:47 +0000 (08:41 -0500)
committerAnup Patel <anup@brainfault.org>
Fri, 20 Aug 2021 04:17:40 +0000 (09:47 +0530)
commit 764a17d852a8 ("lib: sbi: Implement firmware counters") added
switch cases for CAUSE_LOAD_ACCESS and CAUSE_STORE_ACCESS. This caused
them to stop being redirected to U or S mode, as that is handled in the
default switch case. As a result, an error in userspace could cause the
system to hang. Fix this by allowing the acces fault case to fall
through to the default case.

Fixes: 764a17d852a8 ("lib: sbi: Implement firmware counters")
Signed-off-by: Samuel Holland <samuel@sholland.org>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
lib/sbi/sbi_trap.c

index 5781fea..8d20e04 100644 (file)
@@ -259,11 +259,10 @@ struct sbi_trap_regs *sbi_trap_handler(struct sbi_trap_regs *regs)
                msg = "ecall handler failed";
                break;
        case CAUSE_LOAD_ACCESS:
-               sbi_pmu_ctr_incr_fw(SBI_PMU_FW_ACCESS_LOAD);
-               break;
        case CAUSE_STORE_ACCESS:
-               sbi_pmu_ctr_incr_fw(SBI_PMU_FW_ACCESS_STORE);
-               break;
+               sbi_pmu_ctr_incr_fw(mcause == CAUSE_LOAD_ACCESS ?
+                       SBI_PMU_FW_ACCESS_LOAD : SBI_PMU_FW_ACCESS_STORE);
+               /* fallthrough */
        default:
                /* If the trap came from S or U mode, redirect it there */
                trap.epc = regs->mepc;