[PATCH v2 4/5] lib: sbi_trap: Set hypervisor CSRs for HS-mode
Anup Patel
anup at brainfault.org
Sun Aug 21 20:19:15 PDT 2022
On Thu, Aug 4, 2022 at 9:13 PM Vivian Wang <dramforever at 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 at live.com>
> Reviewed-by: Andrew Jones <ajones at ventanamicro.com>
Looks good to me.
Reviewed-by: Anup Patel <anup at 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 at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
More information about the opensbi
mailing list