[PATCH v2 6/8] lib: sbi_domain: ensure consistent firmware PMP entries

Anup Patel anup at brainfault.org
Sun Nov 2 03:04:20 PST 2025


On Wed, Oct 8, 2025 at 2:15 PM Yu-Chien Peter Lin <peter.lin at sifive.com> wrote:
>
> 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>

Reviewed-by: Anup Patel <anup at brainfault.org>

Thanks,
Anup

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

Redundant newline here otherwise it looks good to me.

Reviewed-by: Anup Patel <anup at brainfault.org>

Thanks,
Anup



More information about the opensbi mailing list