mirror of
https://github.com/riscv-software-src/opensbi
synced 2025-10-14 12:56:03 +01:00
lib: sbi: Refine the settings for switching to Virtual Supervisor Mode.
Although Mstatus.MPV is set, before executing mret, access to VS mode registers should use the actual register addresses, not the pseudonyms of S registers. Signed-off-by: Pope B.Lei <popeblei@gmail.com> Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
parent
033104da08
commit
1d89a9da64
@ -1046,10 +1046,17 @@ sbi_hart_switch_mode(unsigned long arg0, unsigned long arg1,
|
||||
csr_write(CSR_MEPC, next_addr);
|
||||
|
||||
if (next_mode == PRV_S) {
|
||||
csr_write(CSR_STVEC, next_addr);
|
||||
csr_write(CSR_SSCRATCH, 0);
|
||||
csr_write(CSR_SIE, 0);
|
||||
csr_write(CSR_SATP, 0);
|
||||
if (next_virt) {
|
||||
csr_write(CSR_VSTVEC, next_addr);
|
||||
csr_write(CSR_VSSCRATCH, 0);
|
||||
csr_write(CSR_VSIE, 0);
|
||||
csr_write(CSR_VSATP, 0);
|
||||
} else {
|
||||
csr_write(CSR_STVEC, next_addr);
|
||||
csr_write(CSR_SSCRATCH, 0);
|
||||
csr_write(CSR_SIE, 0);
|
||||
csr_write(CSR_SATP, 0);
|
||||
}
|
||||
} else if (next_mode == PRV_U) {
|
||||
if (misa_extension('N')) {
|
||||
csr_write(CSR_UTVEC, next_addr);
|
||||
|
Loading…
x
Reference in New Issue
Block a user