diff mbox series

[v2,4/5] lib: sbi_trap: Set hypervisor CSRs for HS-mode

Message ID TYYP286MB14394E15716844F8DB334C60C69F9@TYYP286MB1439.JPNP286.PROD.OUTLOOK.COM
State Accepted
Headers show
Series Set hstatus.GVA for traps going to HS-mode | expand

Commit Message

dramforever Aug. 4, 2022, 2:32 p.m. UTC
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 <dramforever@live.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
 lib/sbi/sbi_trap.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

Comments

Anup Patel Aug. 22, 2022, 3:19 a.m. UTC | #1
On Thu, Aug 4, 2022 at 9:13 PM Vivian Wang <dramforever@live.com> wrote:
>
> 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 <dramforever@live.com>
> Reviewed-by: Andrew Jones <ajones@ventanamicro.com>

Looks good to me.

Reviewed-by: Anup Patel <anup@brainfault.org>

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

> ---
>  lib/sbi/sbi_trap.c | 12 +++++++-----
>  1 file changed, 7 insertions(+), 5 deletions(-)
>
> 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);
> --
> 2.37.1
>
>
> --
> opensbi mailing list
> opensbi@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
diff mbox series

Patch

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);