From 667eed22661a5c5a7b73654ea3ea81737a6a1188 Mon Sep 17 00:00:00 2001 From: Yu-Chien Peter Lin Date: Wed, 8 Oct 2025 16:44:38 +0800 Subject: [PATCH] lib: sbi_domain: allow specifying inaccessible region MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Anup Patel Link: https://lore.kernel.org/r/20251008084444.3525615-3-peter.lin@sifive.com Signed-off-by: Anup Patel --- 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 81b9e479..7edd2a05 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);