From: Vivian Wang Date: Thu, 4 Aug 2022 14:32:30 +0000 (+0800) Subject: lib: sbi_trap: Set hypervisor CSRs for HS-mode X-Git-Tag: v1.3~251 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5a0ca098f176fd5b84d311e82543a05aaab8cafb;p=platform%2Fkernel%2Fopensbi-spacemit.git lib: sbi_trap: Set hypervisor CSRs for HS-mode The hypervisor CSRs hstatus, htval, htinst should always be set if the trap is to be taken in HS-mode, regardless of which mode it came from. Signed-off-by: Vivian Wang Reviewed-by: Andrew Jones Reviewed-by: Anup Patel --- diff --git a/lib/sbi/sbi_trap.c b/lib/sbi/sbi_trap.c index db70c26..1cf2e6f 100644 --- a/lib/sbi/sbi_trap.c +++ b/lib/sbi/sbi_trap.c @@ -118,12 +118,14 @@ int sbi_trap_redirect(struct sbi_trap_regs *regs, regs->mstatus |= (next_virt) ? MSTATUS_MPV : 0UL; #endif - /* Update HSTATUS for VS/VU-mode to HS-mode transition */ - if (misa_extension('H') && prev_virt && !next_virt) { - /* Update HSTATUS SPVP and SPV bits */ + /* Update hypervisor CSRs if going to HS-mode */ + if (misa_extension('H') && !next_virt) { hstatus = csr_read(CSR_HSTATUS); - hstatus &= ~HSTATUS_SPVP; - hstatus |= (prev_mode == PRV_S) ? HSTATUS_SPVP : 0; + if (prev_virt) { + /* hstatus.SPVP is only updated if coming from VS/VU-mode */ + hstatus &= ~HSTATUS_SPVP; + hstatus |= (prev_mode == PRV_S) ? HSTATUS_SPVP : 0; + } hstatus &= ~HSTATUS_SPV; hstatus |= (prev_virt) ? HSTATUS_SPV : 0; csr_write(CSR_HSTATUS, hstatus);