diff --git a/include/sbi/sbi_ipi.h b/include/sbi/sbi_ipi.h index fb7d658b..f6ac8072 100644 --- a/include/sbi/sbi_ipi.h +++ b/include/sbi/sbi_ipi.h @@ -75,7 +75,7 @@ int sbi_ipi_send_halt(ulong hmask, ulong hbase); void sbi_ipi_process(void); -void sbi_ipi_raw_send(u32 target_hart); +int sbi_ipi_raw_send(u32 target_hart); const struct sbi_ipi_device *sbi_ipi_get_device(void); diff --git a/lib/sbi/sbi_hsm.c b/lib/sbi/sbi_hsm.c index 1165acc0..836008fc 100644 --- a/lib/sbi/sbi_hsm.c +++ b/lib/sbi/sbi_hsm.c @@ -289,7 +289,9 @@ int sbi_hsm_hart_start(struct sbi_scratch *scratch, (hsm_device_has_hart_secondary_boot() && !init_count)) { return hsm_device_hart_start(hartid, scratch->warmboot_addr); } else { - sbi_ipi_raw_send(hartid); + int rc = sbi_ipi_raw_send(hartid); + if (rc) + return rc; } return 0; diff --git a/lib/sbi/sbi_ipi.c b/lib/sbi/sbi_ipi.c index 1014909b..7aafbbde 100644 --- a/lib/sbi/sbi_ipi.c +++ b/lib/sbi/sbi_ipi.c @@ -208,10 +208,13 @@ skip: }; } -void sbi_ipi_raw_send(u32 target_hart) +int sbi_ipi_raw_send(u32 target_hart) { - if (ipi_dev && ipi_dev->ipi_send) - ipi_dev->ipi_send(target_hart); + if (!ipi_dev || !ipi_dev->ipi_send) + return SBI_EINVAL; + + ipi_dev->ipi_send(target_hart); + return 0; } const struct sbi_ipi_device *sbi_ipi_get_device(void)