[PATCH] lib: sbi: change sbi_hart_features.extensions as an array

Anup Patel anup at brainfault.org
Thu Nov 16 23:59:31 PST 2023


On Mon, Oct 30, 2023 at 10:11 PM Xiang W <wxjstz at 126.com> wrote:
>
> In the future there may be a lot of ISA extensions, a 'long' may not
> be able to accommodate, changed to an array for the future.
>
> Signed-off-by: Xiang W <wxjstz at 126.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_hart.h      |  3 ++-
>  lib/sbi/sbi_hart.c          | 32 ++++++++++++--------------------
>  platform/generic/platform.c |  2 +-
>  3 files changed, 15 insertions(+), 22 deletions(-)
>
> diff --git a/include/sbi/sbi_hart.h b/include/sbi/sbi_hart.h
> index e60f415..3b73f63 100644
> --- a/include/sbi/sbi_hart.h
> +++ b/include/sbi/sbi_hart.h
> @@ -11,6 +11,7 @@
>  #define __SBI_HART_H__
>
>  #include <sbi/sbi_types.h>
> +#include <sbi/sbi_bitops.h>
>
>  /** Possible privileged specification versions of a hart */
>  enum sbi_hart_priv_versions {
> @@ -65,7 +66,7 @@ enum sbi_hart_extensions {
>  struct sbi_hart_features {
>         bool detected;
>         int priv_version;
> -       unsigned long extensions;
> +       unsigned long extensions[BITS_TO_LONGS(SBI_HART_EXT_MAX)];
>         unsigned int pmp_count;
>         unsigned int pmp_addr_bits;
>         unsigned long pmp_gran;
> diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
> index 29d6481..f94eba5 100644
> --- a/lib/sbi/sbi_hart.c
> +++ b/lib/sbi/sbi_hart.c
> @@ -614,9 +614,9 @@ static inline void __sbi_hart_update_extension(
>                                         bool enable)
>  {
>         if (enable)
> -               hfeatures->extensions |= BIT(ext);
> +               __set_bit(ext, hfeatures->extensions);
>         else
> -               hfeatures->extensions &= ~BIT(ext);
> +               __clear_bit(ext, hfeatures->extensions);
>  }
>
>  /**
> @@ -649,7 +649,7 @@ bool sbi_hart_has_extension(struct sbi_scratch *scratch,
>         struct sbi_hart_features *hfeatures =
>                         sbi_scratch_offset_ptr(scratch, hart_features_offset);
>
> -       if (hfeatures->extensions & BIT(ext))
> +       if (__test_bit(ext, hfeatures->extensions))
>                 return true;
>         else
>                 return false;
> @@ -712,24 +712,16 @@ void sbi_hart_get_extensions_str(struct sbi_scratch *scratch,
>                 return;
>         sbi_memset(extensions_str, 0, nestr);
>
> -       if (!hfeatures->extensions)
> -               goto done;
> -
> -       do {
> -               if (hfeatures->extensions & BIT(ext)) {
> -                       temp = sbi_hart_extension_id2string(ext);
> -                       if (temp) {
> -                               sbi_snprintf(extensions_str + offset,
> -                                            nestr - offset,
> -                                            "%s,", temp);
> -                               offset = offset + sbi_strlen(temp) + 1;
> -                       }
> +       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;
>                 }
> +       }
>
> -               ext++;
> -       } while (ext < SBI_HART_EXT_MAX);
> -
> -done:
>         if (offset)
>                 extensions_str[offset - 1] = '\0';
>         else
> @@ -799,7 +791,7 @@ static int hart_detect_features(struct sbi_scratch *scratch)
>                 return 0;
>
>         /* Clear hart features */
> -       hfeatures->extensions = 0;
> +       sbi_memset(hfeatures->extensions, 0, sizeof(hfeatures->extensions));
>         hfeatures->pmp_count = 0;
>         hfeatures->mhpm_mask = 0;
>
> diff --git a/platform/generic/platform.c b/platform/generic/platform.c
> index 66a0b77..9182faa 100644
> --- a/platform/generic/platform.c
> +++ b/platform/generic/platform.c
> @@ -215,7 +215,7 @@ static int generic_extensions_init(struct sbi_hart_features *hfeatures)
>
>         /* Parse the ISA string from FDT and enable the listed extensions */
>         rc = fdt_parse_isa_extensions(fdt_get_address(), current_hartid(),
> -                                     &hfeatures->extensions);
> +                                     hfeatures->extensions);
>
>         if (rc)
>                 return rc;
> --
> 2.42.0
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi



More information about the opensbi mailing list