* [PATCH] lib: sbi: Fix non-root domain startup
@ 2025-02-11 16:00 Anup Patel
2025-02-19 11:42 ` Anup Patel
0 siblings, 1 reply; 2+ messages in thread
From: Anup Patel @ 2025-02-11 16:00 UTC (permalink / raw)
To: opensbi
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@ventanamicro.com>
---
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
^ permalink raw reply related [flat|nested] 2+ messages in thread* [PATCH] lib: sbi: Fix non-root domain startup
2025-02-11 16:00 [PATCH] lib: sbi: Fix non-root domain startup Anup Patel
@ 2025-02-19 11:42 ` Anup Patel
0 siblings, 0 replies; 2+ messages in thread
From: Anup Patel @ 2025-02-19 11:42 UTC (permalink / raw)
To: opensbi
On Tue, Feb 11, 2025 at 9:30?PM Anup Patel <apatel@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@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
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-02-19 11:42 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-11 16:00 [PATCH] lib: sbi: Fix non-root domain startup Anup Patel
2025-02-19 11:42 ` Anup Patel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox