[PATCH v3 3/4] lib: sbi: Using one array to define the name of extensions

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


On Tue, Dec 12, 2023 at 2:28 PM Yong-Xuan Wang <yongxuan.wang at sifive.com> wrote:
>
> Define an array sbi_hart_ext to map extension ID and name , and use it
> for ISA parsing and printing out the supported extensions.
>
> Signed-off-by: Yong-Xuan Wang <yongxuan.wang at sifive.com>

LGTM.

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

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

> ---
>  include/sbi/sbi_hart.h     |  7 ++++
>  lib/sbi/sbi_hart.c         | 68 +++++++++++---------------------------
>  lib/utils/fdt/fdt_helper.c |  6 ++--
>  3 files changed, 31 insertions(+), 50 deletions(-)
>
> diff --git a/include/sbi/sbi_hart.h b/include/sbi/sbi_hart.h
> index 0aefc2be..77138232 100644
> --- a/include/sbi/sbi_hart.h
> +++ b/include/sbi/sbi_hart.h
> @@ -52,6 +52,13 @@ enum sbi_hart_extensions {
>         SBI_HART_EXT_MAX,
>  };
>
> +struct sbi_hart_ext_data {
> +       const unsigned int id;
> +       const char *name;
> +};
> +
> +extern const struct sbi_hart_ext_data sbi_hart_ext[];
> +
>  /*
>   * Smepmp enforces access boundaries between M-mode and
>   * S/U-mode. When it is enabled, the PMPs are programmed
> diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
> index 5734c09d..06b5f87e 100644
> --- a/lib/sbi/sbi_hart.c
> +++ b/lib/sbi/sbi_hart.c
> @@ -659,48 +659,24 @@ bool sbi_hart_has_extension(struct sbi_scratch *scratch,
>                 return false;
>  }
>
> -static inline char *sbi_hart_extension_id2string(int ext)
> -{
> -       char *estr = NULL;
> -
> -       switch (ext) {
> -       case SBI_HART_EXT_SMAIA:
> -               estr = "smaia";
> -               break;
> -       case SBI_HART_EXT_SMSTATEEN:
> -               estr = "smstateen";
> -               break;
> -       case SBI_HART_EXT_SSCOFPMF:
> -               estr = "sscofpmf";
> -               break;
> -       case SBI_HART_EXT_SSTC:
> -               estr = "sstc";
> -               break;
> -       case SBI_HART_EXT_ZICNTR:
> -               estr = "zicntr";
> -               break;
> -       case SBI_HART_EXT_ZIHPM:
> -               estr = "zihpm";
> -               break;
> -       case SBI_HART_EXT_ZKR:
> -               estr = "zkr";
> -               break;
> -       case SBI_HART_EXT_SMEPMP:
> -               estr = "smepmp";
> -               break;
> -       case SBI_HART_EXT_SMCNTRPMF:
> -               estr = "smcntrpmf";
> -               break;
> -       case SBI_HART_EXT_XANDESPMU:
> -               estr = "xandespmu";
> -               break;
> -       default:
> -               break;
> -       }
> -
> -       return estr;
> +#define __SBI_HART_EXT_DATA(_name, _id) {      \
> +       .name = #_name,                         \
> +       .id = _id,                              \
>  }
>
> +const struct sbi_hart_ext_data sbi_hart_ext[] = {
> +       __SBI_HART_EXT_DATA(smaia, SBI_HART_EXT_SMAIA),
> +       __SBI_HART_EXT_DATA(smepmp, SBI_HART_EXT_SMEPMP),
> +       __SBI_HART_EXT_DATA(smstateen, SBI_HART_EXT_SMSTATEEN),
> +       __SBI_HART_EXT_DATA(sscofpmf, SBI_HART_EXT_SSCOFPMF),
> +       __SBI_HART_EXT_DATA(sstc, SBI_HART_EXT_SSTC),
> +       __SBI_HART_EXT_DATA(zicntr, SBI_HART_EXT_ZICNTR),
> +       __SBI_HART_EXT_DATA(zihpm, SBI_HART_EXT_ZIHPM),
> +       __SBI_HART_EXT_DATA(zkr, SBI_HART_EXT_ZKR),
> +       __SBI_HART_EXT_DATA(smcntrpmf, SBI_HART_EXT_SMCNTRPMF),
> +       __SBI_HART_EXT_DATA(xandespmu, SBI_HART_EXT_XANDESPMU),
> +};
> +
>  /**
>   * Get the hart extensions in string format
>   *
> @@ -716,20 +692,16 @@ void sbi_hart_get_extensions_str(struct sbi_scratch *scratch,
>         struct sbi_hart_features *hfeatures =
>                         sbi_scratch_offset_ptr(scratch, hart_features_offset);
>         int offset = 0, ext = 0;
> -       char *temp;
>
>         if (!extensions_str || nestr <= 0)
>                 return;
>         sbi_memset(extensions_str, 0, nestr);
>
>         for_each_set_bit(ext, hfeatures->extensions, SBI_HART_EXT_MAX) {
> -               temp = sbi_hart_extension_id2string(ext);
> -               if (temp) {
> -                       sbi_snprintf(extensions_str + offset,
> -                                    nestr - offset,
> -                                    "%s,", temp);
> -                       offset = offset + sbi_strlen(temp) + 1;
> -               }
> +               sbi_snprintf(extensions_str + offset,
> +                                nestr - offset,
> +                                "%s,", sbi_hart_ext[ext].name);
> +               offset = offset + sbi_strlen(sbi_hart_ext[ext].name) + 1;
>         }
>
>         if (offset)
> diff --git a/lib/utils/fdt/fdt_helper.c b/lib/utils/fdt/fdt_helper.c
> index 78c1f380..4ed6bbc1 100644
> --- a/lib/utils/fdt/fdt_helper.c
> +++ b/lib/utils/fdt/fdt_helper.c
> @@ -401,8 +401,10 @@ static int fdt_parse_isa_one_hart(const char *isa, unsigned long *extensions)
>                                 continue;                       \
>                         }
>
> -               set_multi_letter_ext("smepmp", SBI_HART_EXT_SMEPMP);
> -               set_multi_letter_ext("zkr", SBI_HART_EXT_ZKR);
> +               for (j = 0; j < SBI_HART_EXT_MAX; j++) {
> +                       set_multi_letter_ext(sbi_hart_ext[j].name,
> +                                            sbi_hart_ext[j].id);
> +               }
>  #undef set_multi_letter_ext
>         }
>
> --
> 2.17.1
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi



More information about the opensbi mailing list