mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-25 15:51:41 +01:00
lib: sbi: Add error prints in sbi_domain_finalize()
We add error prints in sbi_domain_finalize() and sanitize_domain() to help debug domain configuration issues. Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Reviewed-by: Atish Patra <atish.patra@wdc.com>
This commit is contained in:
@@ -174,20 +174,34 @@ static int sanitize_domain(const struct sbi_platform *plat,
|
|||||||
struct sbi_domain_memregion treg, *reg, *reg1;
|
struct sbi_domain_memregion treg, *reg, *reg1;
|
||||||
|
|
||||||
/* Check possible HARTs */
|
/* Check possible HARTs */
|
||||||
if (!dom->possible_harts)
|
if (!dom->possible_harts) {
|
||||||
|
sbi_printf("%s: %s possible HART mask is NULL\n",
|
||||||
|
__func__, dom->name);
|
||||||
return SBI_EINVAL;
|
return SBI_EINVAL;
|
||||||
|
}
|
||||||
sbi_hartmask_for_each_hart(i, dom->possible_harts) {
|
sbi_hartmask_for_each_hart(i, dom->possible_harts) {
|
||||||
if (sbi_platform_hart_invalid(plat, i))
|
if (sbi_platform_hart_invalid(plat, i)) {
|
||||||
|
sbi_printf("%s: %s possible HART mask has invalid "
|
||||||
|
"hart %d\n", __func__, dom->name, i);
|
||||||
return SBI_EINVAL;
|
return SBI_EINVAL;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Check memory regions */
|
/* Check memory regions */
|
||||||
if (!dom->regions)
|
if (!dom->regions) {
|
||||||
|
sbi_printf("%s: %s regions is NULL\n",
|
||||||
|
__func__, dom->name);
|
||||||
return SBI_EINVAL;
|
return SBI_EINVAL;
|
||||||
|
}
|
||||||
sbi_domain_for_each_memregion(dom, reg) {
|
sbi_domain_for_each_memregion(dom, reg) {
|
||||||
if (!is_region_valid(reg))
|
if (!is_region_valid(reg)) {
|
||||||
|
sbi_printf("%s: %s has invalid region base=0x%lx "
|
||||||
|
"order=%lu flags=0x%lx\n", __func__,
|
||||||
|
dom->name, reg->base, reg->order,
|
||||||
|
reg->flags);
|
||||||
return SBI_EINVAL;
|
return SBI_EINVAL;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Count memory regions and check presence of firmware region */
|
/* Count memory regions and check presence of firmware region */
|
||||||
count = 0;
|
count = 0;
|
||||||
@@ -199,8 +213,11 @@ static int sanitize_domain(const struct sbi_platform *plat,
|
|||||||
have_fw_reg = TRUE;
|
have_fw_reg = TRUE;
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
if (!have_fw_reg)
|
if (!have_fw_reg) {
|
||||||
|
sbi_printf("%s: %s does not have firmware region\n",
|
||||||
|
__func__, dom->name);
|
||||||
return SBI_EINVAL;
|
return SBI_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Sort the memory regions */
|
/* Sort the memory regions */
|
||||||
for (i = 0; i < (count - 1); i++) {
|
for (i = 0; i < (count - 1); i++) {
|
||||||
@@ -208,8 +225,15 @@ static int sanitize_domain(const struct sbi_platform *plat,
|
|||||||
for (j = i + 1; j < count; j++) {
|
for (j = i + 1; j < count; j++) {
|
||||||
reg1 = &dom->regions[j];
|
reg1 = &dom->regions[j];
|
||||||
|
|
||||||
if (is_region_conflict(reg1, reg))
|
if (is_region_conflict(reg1, reg)) {
|
||||||
|
sbi_printf("%s: %s conflict between regions "
|
||||||
|
"(base=0x%lx order=%lu flags=0x%lx) and "
|
||||||
|
"(base=0x%lx order=%lu flags=0x%lx)\n",
|
||||||
|
__func__, dom->name,
|
||||||
|
reg->base, reg->order, reg->flags,
|
||||||
|
reg1->base, reg1->order, reg1->flags);
|
||||||
return SBI_EINVAL;
|
return SBI_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!is_region_before(reg1, reg))
|
if (!is_region_before(reg1, reg))
|
||||||
continue;
|
continue;
|
||||||
@@ -233,13 +257,19 @@ static int sanitize_domain(const struct sbi_platform *plat,
|
|||||||
* protect M-mode context and enforce checks on memory accesses.
|
* protect M-mode context and enforce checks on memory accesses.
|
||||||
*/
|
*/
|
||||||
if (dom->next_mode != PRV_S &&
|
if (dom->next_mode != PRV_S &&
|
||||||
dom->next_mode != PRV_U)
|
dom->next_mode != PRV_U) {
|
||||||
|
sbi_printf("%s: %s invalid next booting stage mode 0x%lx\n",
|
||||||
|
__func__, dom->name, dom->next_mode);
|
||||||
return SBI_EINVAL;
|
return SBI_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check next address and next mode*/
|
/* Check next address and next mode*/
|
||||||
if (!sbi_domain_check_addr(dom, dom->next_addr, dom->next_mode,
|
if (!sbi_domain_check_addr(dom, dom->next_addr, dom->next_mode,
|
||||||
SBI_DOMAIN_EXECUTE))
|
SBI_DOMAIN_EXECUTE)) {
|
||||||
|
sbi_printf("%s: %s next booting stage addres 0x%lx can't "
|
||||||
|
"execute\n", __func__, dom->name, dom->next_addr);
|
||||||
return SBI_EINVAL;
|
return SBI_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -371,13 +401,20 @@ int sbi_domain_finalize(struct sbi_scratch *scratch, u32 cold_hartid)
|
|||||||
* Ensure that we have room for Domain Index to
|
* Ensure that we have room for Domain Index to
|
||||||
* HART ID mapping
|
* HART ID mapping
|
||||||
*/
|
*/
|
||||||
if (SBI_DOMAIN_MAX_INDEX <= domain_count)
|
if (SBI_DOMAIN_MAX_INDEX <= domain_count) {
|
||||||
|
sbi_printf("%s: No room for %s\n",
|
||||||
|
__func__, dom->name);
|
||||||
return SBI_ENOSPC;
|
return SBI_ENOSPC;
|
||||||
|
}
|
||||||
|
|
||||||
/* Sanitize discovered domain */
|
/* Sanitize discovered domain */
|
||||||
rc = sanitize_domain(plat, dom);
|
rc = sanitize_domain(plat, dom);
|
||||||
if (rc)
|
if (rc) {
|
||||||
|
sbi_printf("%s: sanity checks failed for"
|
||||||
|
" %s (error %d)\n", __func__,
|
||||||
|
dom->name, rc);
|
||||||
return rc;
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
/* Assign index to domain */
|
/* Assign index to domain */
|
||||||
dom->index = domain_count++;
|
dom->index = domain_count++;
|
||||||
@@ -437,10 +474,14 @@ int sbi_domain_finalize(struct sbi_scratch *scratch, u32 cold_hartid)
|
|||||||
dom->next_addr,
|
dom->next_addr,
|
||||||
dom->next_mode,
|
dom->next_mode,
|
||||||
dom->next_arg1);
|
dom->next_arg1);
|
||||||
if (rc)
|
if (rc) {
|
||||||
|
sbi_printf("%s: failed to start boot HART %d"
|
||||||
|
" for %s (error %d)\n", __func__,
|
||||||
|
dhart, dom->name, rc);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user