mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-25 15:51:41 +01:00
lib: sbi: Fix non-root domain startup
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: 93f7d819fd
("lib: sbi: sse: allow adding new events")
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
This commit is contained in:
@@ -307,8 +307,11 @@ int sbi_domain_register(struct sbi_domain *dom,
|
|||||||
int sbi_domain_root_add_memrange(unsigned long addr, unsigned long size,
|
int sbi_domain_root_add_memrange(unsigned long addr, unsigned long size,
|
||||||
unsigned long align, unsigned long region_flags);
|
unsigned long align, unsigned long region_flags);
|
||||||
|
|
||||||
/** Finalize domain tables and startup non-root domains */
|
/** Startup non-root domains */
|
||||||
int sbi_domain_finalize(struct sbi_scratch *scratch, u32 cold_hartid);
|
int sbi_domain_startup(struct sbi_scratch *scratch, u32 cold_hartid);
|
||||||
|
|
||||||
|
/** Finalize domain tables */
|
||||||
|
int sbi_domain_finalize(struct sbi_scratch *scratch);
|
||||||
|
|
||||||
/** Initialize domains */
|
/** Initialize domains */
|
||||||
int sbi_domain_init(struct sbi_scratch *scratch, u32 cold_hartid);
|
int sbi_domain_init(struct sbi_scratch *scratch, u32 cold_hartid);
|
||||||
|
@@ -685,20 +685,15 @@ int sbi_domain_root_add_memrange(unsigned long addr, unsigned long size,
|
|||||||
return 0;
|
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;
|
int rc;
|
||||||
u32 dhart;
|
u32 dhart;
|
||||||
struct sbi_domain *dom;
|
struct sbi_domain *dom;
|
||||||
const struct sbi_platform *plat = sbi_platform_ptr(scratch);
|
|
||||||
|
|
||||||
/* Initialize and populate domains for the platform */
|
/* Sanity checks */
|
||||||
rc = sbi_platform_domains_init(plat);
|
if (!domain_finalized)
|
||||||
if (rc) {
|
return SBI_EINVAL;
|
||||||
sbi_printf("%s: platform domains_init() failed (error %d)\n",
|
|
||||||
__func__, rc);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Startup boot HART of domains */
|
/* Startup boot HART of domains */
|
||||||
sbi_domain_for_each(dom) {
|
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
|
* Set the finalized flag so that the root domain
|
||||||
* regions can't be changed.
|
* regions can't be changed.
|
||||||
|
@@ -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_printf("%s: mpxy init failed (error %d)\n", __func__, rc);
|
||||||
sbi_hart_hang();
|
sbi_hart_hang();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note: Finalize domains after HSM initialization so that we
|
* Note: Finalize domains after HSM initialization
|
||||||
* can startup non-root domains.
|
|
||||||
* Note: Finalize domains before HART PMP configuration so
|
* Note: Finalize domains before HART PMP configuration so
|
||||||
* that we use correct domain for configuring PMP.
|
* that we use correct domain for configuring PMP.
|
||||||
*/
|
*/
|
||||||
rc = sbi_domain_finalize(scratch, hartid);
|
rc = sbi_domain_finalize(scratch);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
sbi_printf("%s: domain finalize failed (error %d)\n",
|
sbi_printf("%s: domain finalize failed (error %d)\n",
|
||||||
__func__, rc);
|
__func__, rc);
|
||||||
@@ -372,6 +372,17 @@ static void __noreturn init_coldboot(struct sbi_scratch *scratch, u32 hartid)
|
|||||||
|
|
||||||
run_all_tests();
|
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,
|
* Configure PMP at last because if SMEPMP is detected,
|
||||||
* M-mode access to the S/U space will be rescinded.
|
* M-mode access to the S/U space will be rescinded.
|
||||||
|
Reference in New Issue
Block a user