diff options
Diffstat (limited to 'lib/sbi/sbi_trap.c')
-rw-r--r-- | lib/sbi/sbi_trap.c | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/lib/sbi/sbi_trap.c b/lib/sbi/sbi_trap.c index 2c509e5..ee3e4e9 100644 --- a/lib/sbi/sbi_trap.c +++ b/lib/sbi/sbi_trap.c @@ -99,17 +99,14 @@ int sbi_trap_redirect(struct sbi_trap_regs *regs, if (prev_mode != PRV_S && prev_mode != PRV_U) return SBI_ENOTSUPP; - /* For certain exceptions from VS/VU-mode we redirect to VS-mode */ + /* If exceptions came from VS/VU-mode, redirect to VS-mode if + * delegated in hedeleg + */ if (misa_extension('H') && prev_virt) { - switch (trap->cause) { - case CAUSE_FETCH_PAGE_FAULT: - case CAUSE_LOAD_PAGE_FAULT: - case CAUSE_STORE_PAGE_FAULT: + if ((trap->cause < __riscv_xlen) && + (csr_read(CSR_HEDELEG) & BIT(trap->cause))) { next_virt = TRUE; - break; - default: - break; - }; + } } /* Update MSTATUS MPV bits */ |