[PATCH v2 2/5] lib: sbi_trap: Save mstatus[h].GVA in trap->gva
Anup Patel
anup at brainfault.org
Sun Aug 21 20:17:23 PDT 2022
On Thu, Aug 4, 2022 at 9:13 PM Vivian Wang <dramforever at live.com> wrote:
>
> The machine mode GVA field is available if the hypervisor extension is
> implemented, and indicates if mtval is a guest virtual address. Add a
> gva field to sbi_trap_info for this, and in __sbi_expected_trap_hext,
> save mstatus[h].GVA to it, so that gva indicates if tval is a guest
> virtual address. If the hypervisor extension is not implemented, always
> set gva to 0.
>
> 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
> ---
> include/sbi/sbi_trap.h | 6 +++++-
> lib/sbi/sbi_expected_trap.S | 17 +++++++++++++++--
> 2 files changed, 20 insertions(+), 3 deletions(-)
>
> diff --git a/include/sbi/sbi_trap.h b/include/sbi/sbi_trap.h
> index d205056..fe3640a 100644
> --- a/include/sbi/sbi_trap.h
> +++ b/include/sbi/sbi_trap.h
> @@ -95,8 +95,10 @@
> #define SBI_TRAP_INFO_tval2 3
> /** Index of tinst member in sbi_trap_info */
> #define SBI_TRAP_INFO_tinst 4
> +/** Index of gva member in sbi_trap_info */
> +#define SBI_TRAP_INFO_gva 5
> /** Last member index in sbi_trap_info */
> -#define SBI_TRAP_INFO_last 5
> +#define SBI_TRAP_INFO_last 6
>
> /* clang-format on */
>
> @@ -200,6 +202,8 @@ struct sbi_trap_info {
> unsigned long tval2;
> /** tinst Trap instruction */
> unsigned long tinst;
> + /** gva Guest virtual address in tval flag */
> + unsigned long gva;
> };
>
> int sbi_trap_redirect(struct sbi_trap_regs *regs,
> diff --git a/lib/sbi/sbi_expected_trap.S b/lib/sbi/sbi_expected_trap.S
> index 24891c7..a5ef26a 100644
> --- a/lib/sbi/sbi_expected_trap.S
> +++ b/lib/sbi/sbi_expected_trap.S
> @@ -22,7 +22,7 @@
> .align 3
> .global __sbi_expected_trap
> __sbi_expected_trap:
> - /* Without H-extension so, MTVAL2 and MTINST CSRs not available */
> + /* Without H-extension so, MTVAL2 and MTINST CSRs and GVA not available */
> csrr a4, CSR_MEPC
> REG_S a4, SBI_TRAP_INFO_OFFSET(epc)(a3)
> csrr a4, CSR_MCAUSE
> @@ -31,6 +31,7 @@ __sbi_expected_trap:
> REG_S a4, SBI_TRAP_INFO_OFFSET(tval)(a3)
> REG_S zero, SBI_TRAP_INFO_OFFSET(tval2)(a3)
> REG_S zero, SBI_TRAP_INFO_OFFSET(tinst)(a3)
> + REG_S zero, SBI_TRAP_INFO_OFFSET(gva)(a3)
> csrr a4, CSR_MEPC
> addi a4, a4, 4
> csrw CSR_MEPC, a4
> @@ -39,7 +40,7 @@ __sbi_expected_trap:
> .align 3
> .global __sbi_expected_trap_hext
> __sbi_expected_trap_hext:
> - /* With H-extension so, MTVAL2 and MTINST CSRs available */
> + /* With H-extension so, MTVAL2 and MTINST CSRs and GVA available */
> csrr a4, CSR_MEPC
> REG_S a4, SBI_TRAP_INFO_OFFSET(epc)(a3)
> csrr a4, CSR_MCAUSE
> @@ -50,6 +51,18 @@ __sbi_expected_trap_hext:
> REG_S a4, SBI_TRAP_INFO_OFFSET(tval2)(a3)
> csrr a4, CSR_MTINST
> REG_S a4, SBI_TRAP_INFO_OFFSET(tinst)(a3)
> +
> + /* Extract GVA bit from MSTATUS or MSTATUSH */
> +#if __riscv_xlen == 32
> + csrr a4, CSR_MSTATUSH
> + srli a4, a4, MSTATUSH_GVA_SHIFT
> +#else
> + csrr a4, CSR_MSTATUS
> + srli a4, a4, MSTATUS_GVA_SHIFT
> +#endif
> + andi a4, a4, 1
> + REG_S a4, SBI_TRAP_INFO_OFFSET(gva)(a3)
> +
> csrr a4, CSR_MEPC
> addi a4, a4, 4
> csrw CSR_MEPC, a4
> --
> 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