lib: sbi: Fix sbi_hart_switch_mode() for u-mode
authorAnup Patel <anup.patel@wdc.com>
Sat, 21 Nov 2020 05:58:39 +0000 (11:28 +0530)
committerAnup Patel <anup@brainfault.org>
Fri, 4 Dec 2020 12:26:10 +0000 (17:56 +0530)
We should check and access N-extension CSRs in sbi_hart_switch_mode()
when next_mode is u-mode because N-extension is optional.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
lib/sbi/sbi_hart.c

index 30d8aef..fc86e9f 100644 (file)
@@ -522,9 +522,11 @@ sbi_hart_switch_mode(unsigned long arg0, unsigned long arg1,
                csr_write(CSR_SIE, 0);
                csr_write(CSR_SATP, 0);
        } else if (next_mode == PRV_U) {
-               csr_write(CSR_UTVEC, next_addr);
-               csr_write(CSR_USCRATCH, 0);
-               csr_write(CSR_UIE, 0);
+               if (misa_extension('N')) {
+                       csr_write(CSR_UTVEC, next_addr);
+                       csr_write(CSR_USCRATCH, 0);
+                       csr_write(CSR_UIE, 0);
+               }
        }
 
        register unsigned long a0 asm("a0") = arg0;