[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