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>
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;