lib: Delegate supervisor ecall to HS-mode when H extension available
authorAnup Patel <anup.patel@wdc.com>
Fri, 5 Apr 2019 07:47:42 +0000 (13:17 +0530)
committerAnup Patel <anup@brainfault.org>
Mon, 30 Sep 2019 09:44:00 +0000 (15:14 +0530)
When hypervisor extension is available, we only handle hypervisor
ecalls coming from HS-mode and we let hypervisor handle ecalls coming
from VS-mode.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
lib/sbi/sbi_hart.c

index 018fe85..6dac84b 100644 (file)
@@ -87,6 +87,14 @@ static int delegate_traps(struct sbi_scratch *scratch, u32 hartid)
                              (1U << CAUSE_LOAD_PAGE_FAULT) |
                              (1U << CAUSE_STORE_PAGE_FAULT);
 
+       /*
+        * If hypervisor extension available then we only handle
+        * hypervisor calls (i.e. ecalls from HS-mode) and we let
+        * HS-mode handle supervisor calls (i.e. ecalls from VS-mode)
+        */
+       if (misa_extension('H'))
+               exceptions |= (1U << CAUSE_SUPERVISOR_ECALL);
+
        csr_write(CSR_MIDELEG, interrupts);
        csr_write(CSR_MEDELEG, exceptions);