[PATCH v3 2/4] lib: sbi: Refactor the code for enable extensions in menvfg CSR

Anup Patel anup at brainfault.org
Tue Dec 19 02:19:31 PST 2023


On Tue, Dec 12, 2023 at 2:28 PM Yong-Xuan Wang <yongxuan.wang at sifive.com> wrote:
>
> Use 1 variable to store the value of menvcfg.
>
> Signed-off-by: Yong-Xuan Wang <yongxuan.wang at sifive.com>
> Reviewed-by: Anup Patel <anup at brainfault.org>
> ---
>  include/sbi/riscv_encoding.h |  5 -----
>  lib/sbi/sbi_hart.c           | 15 ++++++---------
>  2 files changed, 6 insertions(+), 14 deletions(-)
>
> diff --git a/include/sbi/riscv_encoding.h b/include/sbi/riscv_encoding.h
> index 0996d649..f20df761 100644
> --- a/include/sbi/riscv_encoding.h
> +++ b/include/sbi/riscv_encoding.h
> @@ -207,13 +207,8 @@
>
>  #define MHPMEVENT_SSCOF_MASK           _ULL(0xFFFF000000000000)
>
> -#if __riscv_xlen > 32
>  #define ENVCFG_STCE                    (_ULL(1) << 63)
>  #define ENVCFG_PBMTE                   (_ULL(1) << 62)
> -#else
> -#define ENVCFGH_STCE                   (_UL(1) << 31)
> -#define ENVCFGH_PBMTE                  (_UL(1) << 30)
> -#endif
>  #define ENVCFG_CBZE                    (_UL(1) << 7)
>  #define ENVCFG_CBCFE                   (_UL(1) << 6)
>  #define ENVCFG_CBIE_SHIFT              4
> diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
> index 13998f1c..5734c09d 100644
> --- a/lib/sbi/sbi_hart.c
> +++ b/lib/sbi/sbi_hart.c
> @@ -108,6 +108,9 @@ static void mstatus_init(struct sbi_scratch *scratch)
>
>         if (sbi_hart_priv_version(scratch) >= SBI_HART_PRIV_VER_1_12) {
>                 menvcfg_val = csr_read(CSR_MENVCFG);
> +#if __riscv_xlen == 32
> +               menvcfg_val |= ((uint64_t)csr_read(CSR_MENVCFGH)) << 32;
> +#endif

We also need to change data type of menvcfg_val to uint64_t otherwise
it breaks compilation for RV32. In general, always test your patches on
both RV32 and RV64.

>
>                 /*
>                  * Set menvcfg.CBZE == 1
> @@ -139,9 +142,7 @@ static void mstatus_init(struct sbi_scratch *scratch)
>                  * If Svpbmt extension is not available then menvcfg.PBMTE
>                  * will be read-only zero.
>                  */
> -#if __riscv_xlen > 32
>                 menvcfg_val |= ENVCFG_PBMTE;
> -#endif

Svpbmt is not available on RV32 so this #if must be kept.

>
>                 /*
>                  * The spec doesn't explicitly describe the reset value of menvcfg.
> @@ -149,17 +150,13 @@ static void mstatus_init(struct sbi_scratch *scratch)
>                  * hardware.
>                  */
>                 if (sbi_hart_has_extension(scratch, SBI_HART_EXT_SSTC)) {
> -#if __riscv_xlen == 32
> -                       unsigned long menvcfgh_val;
> -                       menvcfgh_val = csr_read(CSR_MENVCFGH);
> -                       menvcfgh_val |= ENVCFGH_STCE;
> -                       csr_write(CSR_MENVCFGH, menvcfgh_val);
> -#else
>                         menvcfg_val |= ENVCFG_STCE;
> -#endif
>                 }
>
>                 csr_write(CSR_MENVCFG, menvcfg_val);
> +#if __riscv_xlen == 32
> +               csr_write(CSR_MENVCFGH, menvcfg_val >> 32);
> +#endif
>
>                 /* Enable S-mode access to seed CSR */
>                 if (sbi_hart_has_extension(scratch, SBI_HART_EXT_ZKR)) {
> --
> 2.17.1
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi

I have taken care of the above issues at the time of merging this patch.

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup



More information about the opensbi mailing list