[PATCH v2 1/8] lib: sbi_hart: move sbi_hart_get_smepmp_flags() to sbi_domain

Anup Patel anup at brainfault.org
Sun Nov 2 02:27:14 PST 2025


On Wed, Oct 8, 2025 at 2:14 PM Yu-Chien Peter Lin <peter.lin at sifive.com> wrote:
>
> Move sbi_hart_get_smepmp_flags() from sbi_hart.c to sbi_domain.c and
> rename it to sbi_domain_get_smepmp_flags() to better reflect its
> purpose of converting domain memory region flags to PMP configuration.
>
> Also removes unused parameters (scratch and dom).
>
> Signed-off-by: Yu-Chien Peter Lin <peter.lin at sifive.com>

LGTM.

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

Thanks,
Anup

> ---
>  include/sbi/sbi_domain.h |  7 +++++
>  lib/sbi/sbi_domain.c     | 58 ++++++++++++++++++++++++++++++++++
>  lib/sbi/sbi_hart.c       | 67 ++--------------------------------------
>  3 files changed, 67 insertions(+), 65 deletions(-)
>
> diff --git a/include/sbi/sbi_domain.h b/include/sbi/sbi_domain.h
> index e9cff0b1..a6ee553b 100644
> --- a/include/sbi/sbi_domain.h
> +++ b/include/sbi/sbi_domain.h
> @@ -249,6 +249,13 @@ void sbi_domain_memregion_init(unsigned long addr,
>                                 unsigned long flags,
>                                 struct sbi_domain_memregion *reg);
>
> +/**
> + * Return the Smepmp pmpcfg LRWX encoding for the flags in @reg.
> + *
> + * @param reg pointer to memory region; its flags field encodes permissions.
> + */
> +unsigned int sbi_domain_get_smepmp_flags(struct sbi_domain_memregion *reg);
> +
>  /**
>   * Check whether we can access specified address for given mode and
>   * memory region flags under a domain
> diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
> index 461c7e53..1fa56b6a 100644
> --- a/lib/sbi/sbi_domain.c
> +++ b/lib/sbi/sbi_domain.c
> @@ -122,6 +122,64 @@ void sbi_domain_memregion_init(unsigned long addr,
>         }
>  }
>
> +unsigned int sbi_domain_get_smepmp_flags(struct sbi_domain_memregion *reg)
> +{
> +       unsigned int pmp_flags = 0;
> +
> +       if (SBI_DOMAIN_MEMREGION_IS_SHARED(reg->flags)) {
> +               /* Read only for both M and SU modes */
> +               if (SBI_DOMAIN_MEMREGION_IS_SUR_MR(reg->flags))
> +                       pmp_flags = (PMP_L | PMP_R | PMP_W | PMP_X);
> +
> +               /* Execute for SU but Read/Execute for M mode */
> +               else if (SBI_DOMAIN_MEMREGION_IS_SUX_MRX(reg->flags))
> +                       /* locked region */
> +                       pmp_flags = (PMP_L | PMP_W | PMP_X);
> +
> +               /* Execute only for both M and SU modes */
> +               else if (SBI_DOMAIN_MEMREGION_IS_SUX_MX(reg->flags))
> +                       pmp_flags = (PMP_L | PMP_W);
> +
> +               /* Read/Write for both M and SU modes */
> +               else if (SBI_DOMAIN_MEMREGION_IS_SURW_MRW(reg->flags))
> +                       pmp_flags = (PMP_W | PMP_X);
> +
> +               /* Read only for SU mode but Read/Write for M mode */
> +               else if (SBI_DOMAIN_MEMREGION_IS_SUR_MRW(reg->flags))
> +                       pmp_flags = (PMP_W);
> +       } else if (SBI_DOMAIN_MEMREGION_M_ONLY_ACCESS(reg->flags)) {
> +               /*
> +                * When smepmp is supported and used, M region cannot have RWX
> +                * permissions on any region.
> +                */
> +               if ((reg->flags & SBI_DOMAIN_MEMREGION_M_ACCESS_MASK)
> +                   == SBI_DOMAIN_MEMREGION_M_RWX) {
> +                       sbi_printf("%s: M-mode only regions cannot have"
> +                                  "RWX permissions\n", __func__);
> +                       return 0;
> +               }
> +
> +               /* M-mode only access regions are always locked */
> +               pmp_flags |= PMP_L;
> +
> +               if (reg->flags & SBI_DOMAIN_MEMREGION_M_READABLE)
> +                       pmp_flags |= PMP_R;
> +               if (reg->flags & SBI_DOMAIN_MEMREGION_M_WRITABLE)
> +                       pmp_flags |= PMP_W;
> +               if (reg->flags & SBI_DOMAIN_MEMREGION_M_EXECUTABLE)
> +                       pmp_flags |= PMP_X;
> +       } else if (SBI_DOMAIN_MEMREGION_SU_ONLY_ACCESS(reg->flags)) {
> +               if (reg->flags & SBI_DOMAIN_MEMREGION_SU_READABLE)
> +                       pmp_flags |= PMP_R;
> +               if (reg->flags & SBI_DOMAIN_MEMREGION_SU_WRITABLE)
> +                       pmp_flags |= PMP_W;
> +               if (reg->flags & SBI_DOMAIN_MEMREGION_SU_EXECUTABLE)
> +                       pmp_flags |= PMP_X;
> +       }
> +
> +       return pmp_flags;
> +}
> +
>  bool sbi_domain_check_addr(const struct sbi_domain *dom,
>                            unsigned long addr, unsigned long mode,
>                            unsigned long access_flags)
> diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
> index 1b50f671..2dca2699 100644
> --- a/lib/sbi/sbi_hart.c
> +++ b/lib/sbi/sbi_hart.c
> @@ -301,69 +301,6 @@ unsigned int sbi_hart_mhpm_bits(struct sbi_scratch *scratch)
>         return hfeatures->mhpm_bits;
>  }
>
> -/*
> - * Returns Smepmp flags for a given domain and region based on permissions.
> - */
> -static unsigned int sbi_hart_get_smepmp_flags(struct sbi_scratch *scratch,
> -                                             struct sbi_domain *dom,
> -                                             struct sbi_domain_memregion *reg)
> -{
> -       unsigned int pmp_flags = 0;
> -
> -       if (SBI_DOMAIN_MEMREGION_IS_SHARED(reg->flags)) {
> -               /* Read only for both M and SU modes */
> -               if (SBI_DOMAIN_MEMREGION_IS_SUR_MR(reg->flags))
> -                       pmp_flags = (PMP_L | PMP_R | PMP_W | PMP_X);
> -
> -               /* Execute for SU but Read/Execute for M mode */
> -               else if (SBI_DOMAIN_MEMREGION_IS_SUX_MRX(reg->flags))
> -                       /* locked region */
> -                       pmp_flags = (PMP_L | PMP_W | PMP_X);
> -
> -               /* Execute only for both M and SU modes */
> -               else if (SBI_DOMAIN_MEMREGION_IS_SUX_MX(reg->flags))
> -                       pmp_flags = (PMP_L | PMP_W);
> -
> -               /* Read/Write for both M and SU modes */
> -               else if (SBI_DOMAIN_MEMREGION_IS_SURW_MRW(reg->flags))
> -                       pmp_flags = (PMP_W | PMP_X);
> -
> -               /* Read only for SU mode but Read/Write for M mode */
> -               else if (SBI_DOMAIN_MEMREGION_IS_SUR_MRW(reg->flags))
> -                       pmp_flags = (PMP_W);
> -       } else if (SBI_DOMAIN_MEMREGION_M_ONLY_ACCESS(reg->flags)) {
> -               /*
> -                * When smepmp is supported and used, M region cannot have RWX
> -                * permissions on any region.
> -                */
> -               if ((reg->flags & SBI_DOMAIN_MEMREGION_M_ACCESS_MASK)
> -                   == SBI_DOMAIN_MEMREGION_M_RWX) {
> -                       sbi_printf("%s: M-mode only regions cannot have"
> -                                  "RWX permissions\n", __func__);
> -                       return 0;
> -               }
> -
> -               /* M-mode only access regions are always locked */
> -               pmp_flags |= PMP_L;
> -
> -               if (reg->flags & SBI_DOMAIN_MEMREGION_M_READABLE)
> -                       pmp_flags |= PMP_R;
> -               if (reg->flags & SBI_DOMAIN_MEMREGION_M_WRITABLE)
> -                       pmp_flags |= PMP_W;
> -               if (reg->flags & SBI_DOMAIN_MEMREGION_M_EXECUTABLE)
> -                       pmp_flags |= PMP_X;
> -       } else if (SBI_DOMAIN_MEMREGION_SU_ONLY_ACCESS(reg->flags)) {
> -               if (reg->flags & SBI_DOMAIN_MEMREGION_SU_READABLE)
> -                       pmp_flags |= PMP_R;
> -               if (reg->flags & SBI_DOMAIN_MEMREGION_SU_WRITABLE)
> -                       pmp_flags |= PMP_W;
> -               if (reg->flags & SBI_DOMAIN_MEMREGION_SU_EXECUTABLE)
> -                       pmp_flags |= PMP_X;
> -       }
> -
> -       return pmp_flags;
> -}
> -
>  static void sbi_hart_smepmp_set(struct sbi_scratch *scratch,
>                                 struct sbi_domain *dom,
>                                 struct sbi_domain_memregion *reg,
> @@ -420,7 +357,7 @@ static int sbi_hart_smepmp_configure(struct sbi_scratch *scratch,
>                         continue;
>                 }
>
> -               pmp_flags = sbi_hart_get_smepmp_flags(scratch, dom, reg);
> +               pmp_flags = sbi_domain_get_smepmp_flags(reg);
>                 if (!pmp_flags)
>                         return 0;
>
> @@ -446,7 +383,7 @@ static int sbi_hart_smepmp_configure(struct sbi_scratch *scratch,
>                         continue;
>                 }
>
> -               pmp_flags = sbi_hart_get_smepmp_flags(scratch, dom, reg);
> +               pmp_flags = sbi_domain_get_smepmp_flags(reg);
>                 if (!pmp_flags)
>                         return 0;
>
> --
> 2.48.0
>



More information about the opensbi mailing list