lib: sbi_trap: Redirect exception based on hedeleg
authordramforever <dramforever@live.com>
Sun, 12 Jun 2022 05:57:37 +0000 (13:57 +0800)
committerAnup Patel <anup@brainfault.org>
Mon, 13 Jun 2022 05:32:49 +0000 (11:02 +0530)
HS-mode software can choose what exceptions to delegate to VS-mode using
the hedeleg CSR. Synthetic VS/VU-mode exceptions should also honor
hedeleg. They should be redirected to VS-mode if and only if delegated
by HS-mode.

Signed-off-by: dramforever <dramforever@live.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
lib/sbi/sbi_trap.c

index 2c509e5..ee3e4e9 100644 (file)
@@ -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 */