diff options
author | Anup Patel <anup.patel@wdc.com> | 2020-11-21 08:58:39 +0300 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2020-12-04 15:26:10 +0300 |
commit | 8d2edc4fc957588e23d09c8f567a94cd737405d3 (patch) | |
tree | 8a3d3600d83002c98eebd8334789e88c624d29f4 | |
parent | 2677324f906133db8596de4868df87cb1224f113 (diff) | |
download | opensbi-8d2edc4fc957588e23d09c8f567a94cd737405d3.tar.xz |
lib: sbi: Fix sbi_hart_switch_mode() for u-mode
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>
-rw-r--r-- | lib/sbi/sbi_hart.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c index 30d8aef..fc86e9f 100644 --- a/lib/sbi/sbi_hart.c +++ b/lib/sbi/sbi_hart.c @@ -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; |