diff options
| author | Yu-Chien Peter Lin <[email protected]> | 2025-10-08 16:44:42 +0800 |
|---|---|---|
| committer | Anup Patel <[email protected]> | 2025-11-02 16:35:19 +0530 |
| commit | 631efeeb4913f278b8f5e5920b8c233ac250ff28 (patch) | |
| tree | e9d5c05dd9d200abfc88d6e19c61b210e86531c6 | |
| parent | b34caeef815f2e3b54a13e69c8d163bc218712b9 (diff) | |
lib: sbi_domain: ensure consistent firmware PMP entries
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 <[email protected]>
Reviewed-by: Anup Patel <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Anup Patel <[email protected]>
| -rw-r--r-- | include/sbi/sbi_domain.h | 3 | ||||
| -rw-r--r-- | lib/sbi/sbi_domain.c | 13 |
2 files changed, 16 insertions, 0 deletions
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 8b03db12..da0f0557 100644 --- a/lib/sbi/sbi_domain.c +++ b/lib/sbi/sbi_domain.c @@ -292,6 +292,19 @@ 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; |
