[PATCH v2 6/8] lib: sbi_domain: ensure consistent firmware PMP entries
Yu-Chien Peter Lin
peter.lin at sifive.com
Wed Oct 8 01:44:42 PDT 2025
During domain context switches, all PMP entries are reconfigured
which can clear firmware access permissions, causing M-mode access
faults under SmePMP.
Sort domain regions to place firmware regions first, ensuring
consistent firmware PMP entries so they won't be revoked during
domain context switches.
Signed-off-by: Yu-Chien Peter Lin <peter.lin at sifive.com>
---
include/sbi/sbi_domain.h | 3 +++
lib/sbi/sbi_domain.c | 14 ++++++++++++++
2 files changed, 17 insertions(+)
diff --git a/include/sbi/sbi_domain.h b/include/sbi/sbi_domain.h
index 9193feb0..1196d609 100644
--- a/include/sbi/sbi_domain.h
+++ b/include/sbi/sbi_domain.h
@@ -121,6 +121,9 @@ struct sbi_domain_memregion {
((__flags & SBI_DOMAIN_MEMREGION_SU_ACCESS_MASK) && \
!(__flags & SBI_DOMAIN_MEMREGION_M_ACCESS_MASK))
+#define SBI_DOMAIN_MEMREGION_IS_FIRMWARE(__flags) \
+ ((__flags & SBI_DOMAIN_MEMREGION_FW) ? true : false) \
+
/** Bit to control if permissions are enforced on all modes */
#define SBI_DOMAIN_MEMREGION_ENF_PERMISSIONS (1UL << 6)
diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
index 968fe61b..657de10d 100644
--- a/lib/sbi/sbi_domain.c
+++ b/lib/sbi/sbi_domain.c
@@ -294,6 +294,20 @@ static bool is_region_compatible(const struct sbi_domain_memregion *regA,
static bool is_region_before(const struct sbi_domain_memregion *regA,
const struct sbi_domain_memregion *regB)
{
+ /*
+ * Enforce firmware region ordering for memory access
+ * under SmePMP.
+ * Place firmware regions first to ensure consistent
+ * PMP entries during domain context switches.
+ */
+ if (SBI_DOMAIN_MEMREGION_IS_FIRMWARE(regA->flags) &&
+ !SBI_DOMAIN_MEMREGION_IS_FIRMWARE(regB->flags))
+ return true;
+ if (!SBI_DOMAIN_MEMREGION_IS_FIRMWARE(regA->flags) &&
+ SBI_DOMAIN_MEMREGION_IS_FIRMWARE(regB->flags))
+ return false;
+
+
if (regA->order < regB->order)
return true;
--
2.48.0
More information about the opensbi
mailing list