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);