[PATCH] lib: sbi: Fix non-root domain startup

Anup Patel anup at brainfault.org
Wed Feb 19 03:42:39 PST 2025


On Tue, Feb 11, 2025 at 9:30 PM Anup Patel <apatel at ventanamicro.com> wrote:
>
> Currently, the sbi_sse_init() in cold boot path is called after
> sbi_domain_finalize() so boot HART of non-root domains will start
> before SSE cold boot init which can cause warm boot of such HARTs
> to crash in sbi_sse_init().
>
> To address the above issue, factor-out the non-root domain startup
> from sbi_domain_finalize() function as a separate sbi_domain_startup()
> function  which can be called after sbi_sse_init() in cold boot path.
>
> Fixes: 93f7d819fdeb ("lib: sbi: sse: allow adding new events")
> Signed-off-by: Anup Patel <apatel at ventanamicro.com>

Applied this patch to the riscv/opensbi repo.

Regards,
Anup

> ---
>  include/sbi/sbi_domain.h |  7 +++++--
>  lib/sbi/sbi_domain.c     | 33 ++++++++++++++++++++++++---------
>  lib/sbi/sbi_init.c       | 17 ++++++++++++++---
>  3 files changed, 43 insertions(+), 14 deletions(-)
>
> diff --git a/include/sbi/sbi_domain.h b/include/sbi/sbi_domain.h
> index 8a2b123d..e9cff0b1 100644
> --- a/include/sbi/sbi_domain.h
> +++ b/include/sbi/sbi_domain.h
> @@ -307,8 +307,11 @@ int sbi_domain_register(struct sbi_domain *dom,
>  int sbi_domain_root_add_memrange(unsigned long addr, unsigned long size,
>                            unsigned long align, unsigned long region_flags);
>
> -/** Finalize domain tables and startup non-root domains */
> -int sbi_domain_finalize(struct sbi_scratch *scratch, u32 cold_hartid);
> +/** Startup non-root domains */
> +int sbi_domain_startup(struct sbi_scratch *scratch, u32 cold_hartid);
> +
> +/** Finalize domain tables */
> +int sbi_domain_finalize(struct sbi_scratch *scratch);
>
>  /** Initialize domains */
>  int sbi_domain_init(struct sbi_scratch *scratch, u32 cold_hartid);
> diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
> index 1cf7e2d8..51c82a75 100644
> --- a/lib/sbi/sbi_domain.c
> +++ b/lib/sbi/sbi_domain.c
> @@ -685,20 +685,15 @@ int sbi_domain_root_add_memrange(unsigned long addr, unsigned long size,
>         return 0;
>  }
>
> -int sbi_domain_finalize(struct sbi_scratch *scratch, u32 cold_hartid)
> +int sbi_domain_startup(struct sbi_scratch *scratch, u32 cold_hartid)
>  {
>         int rc;
>         u32 dhart;
>         struct sbi_domain *dom;
> -       const struct sbi_platform *plat = sbi_platform_ptr(scratch);
>
> -       /* Initialize and populate domains for the platform */
> -       rc = sbi_platform_domains_init(plat);
> -       if (rc) {
> -               sbi_printf("%s: platform domains_init() failed (error %d)\n",
> -                          __func__, rc);
> -               return rc;
> -       }
> +       /* Sanity checks */
> +       if (!domain_finalized)
> +               return SBI_EINVAL;
>
>         /* Startup boot HART of domains */
>         sbi_domain_for_each(dom) {
> @@ -744,6 +739,26 @@ int sbi_domain_finalize(struct sbi_scratch *scratch, u32 cold_hartid)
>                 }
>         }
>
> +       return 0;
> +}
> +
> +int sbi_domain_finalize(struct sbi_scratch *scratch)
> +{
> +       int rc;
> +       const struct sbi_platform *plat = sbi_platform_ptr(scratch);
> +
> +       /* Sanity checks */
> +       if (domain_finalized)
> +               return SBI_EINVAL;
> +
> +       /* Initialize and populate domains for the platform */
> +       rc = sbi_platform_domains_init(plat);
> +       if (rc) {
> +               sbi_printf("%s: platform domains_init() failed (error %d)\n",
> +                          __func__, rc);
> +               return rc;
> +       }
> +
>         /*
>          * Set the finalized flag so that the root domain
>          * regions can't be changed.
> diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c
> index 3f654c80..880c1644 100644
> --- a/lib/sbi/sbi_init.c
> +++ b/lib/sbi/sbi_init.c
> @@ -318,13 +318,13 @@ static void __noreturn init_coldboot(struct sbi_scratch *scratch, u32 hartid)
>                 sbi_printf("%s: mpxy init failed (error %d)\n", __func__, rc);
>                 sbi_hart_hang();
>         }
> +
>         /*
> -        * Note: Finalize domains after HSM initialization so that we
> -        * can startup non-root domains.
> +        * Note: Finalize domains after HSM initialization
>          * Note: Finalize domains before HART PMP configuration so
>          * that we use correct domain for configuring PMP.
>          */
> -       rc = sbi_domain_finalize(scratch, hartid);
> +       rc = sbi_domain_finalize(scratch);
>         if (rc) {
>                 sbi_printf("%s: domain finalize failed (error %d)\n",
>                            __func__, rc);
> @@ -372,6 +372,17 @@ static void __noreturn init_coldboot(struct sbi_scratch *scratch, u32 hartid)
>
>         run_all_tests();
>
> +       /*
> +        * Note: Startup domains after all initialization are done
> +        * otherwise boot HART of non-root domain can crash.
> +        */
> +       rc = sbi_domain_startup(scratch, hartid);
> +       if (rc) {
> +               sbi_printf("%s: domain startup failed (error %d)\n",
> +                          __func__, rc);
> +               sbi_hart_hang();
> +       }
> +
>         /*
>          * Configure PMP at last because if SMEPMP is detected,
>          * M-mode access to the S/U space will be rescinded.
> --
> 2.43.0
>



More information about the opensbi mailing list