[PATCH v2 2/8] lib: sbi_domain: allow specifying inaccessible region

Anup Patel anup at brainfault.org
Sun Nov 2 02:32:23 PST 2025


On Wed, Oct 8, 2025 at 2:14 PM Yu-Chien Peter Lin <peter.lin at sifive.com> wrote:
>
> According to the RISC‑V Privileged Specification, SmePMP
> regions that grant no access in any privilege mode are
> valid. Allow such regions to be specified.
>
> Signed-off-by: Yu-Chien Peter Lin <peter.lin at sifive.com>

LGTM.

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

Thanks,
Anup

> ---
>  lib/sbi/sbi_domain.c | 12 +++++++++++-
>  lib/sbi/sbi_hart.c   |  4 ----
>  2 files changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
> index 1fa56b6a..89250d4c 100644
> --- a/lib/sbi/sbi_domain.c
> +++ b/lib/sbi/sbi_domain.c
> @@ -126,7 +126,17 @@ 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)) {
> +       if ((reg->flags & SBI_DOMAIN_MEMREGION_ACCESS_MASK) == 0) {
> +               /*
> +                * Region is inaccessible in all privilege modes.
> +                *
> +                * SmePMP allows two encodings for an inaccessible region:
> +                *   - pmpcfg.LRWX = 0000 (Inaccessible region)
> +                *   - pmpcfg.LRWX = 1000 (Locked inaccessible region)
> +                * We use the first encoding here.
> +                */
> +               return 0;
> +       } else 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);
> diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
> index 2dca2699..d018619b 100644
> --- a/lib/sbi/sbi_hart.c
> +++ b/lib/sbi/sbi_hart.c
> @@ -358,8 +358,6 @@ static int sbi_hart_smepmp_configure(struct sbi_scratch *scratch,
>                 }
>
>                 pmp_flags = sbi_domain_get_smepmp_flags(reg);
> -               if (!pmp_flags)
> -                       return 0;
>
>                 sbi_hart_smepmp_set(scratch, dom, reg, pmp_idx++, pmp_flags,
>                                     pmp_log2gran, pmp_addr_max);
> @@ -384,8 +382,6 @@ static int sbi_hart_smepmp_configure(struct sbi_scratch *scratch,
>                 }
>
>                 pmp_flags = sbi_domain_get_smepmp_flags(reg);
> -               if (!pmp_flags)
> -                       return 0;
>
>                 sbi_hart_smepmp_set(scratch, dom, reg, pmp_idx++, pmp_flags,
>                                     pmp_log2gran, pmp_addr_max);
> --
> 2.48.0
>



More information about the opensbi mailing list