[PATCH v2 2/3] lib: sbi: report smrnmi_handlers_init failures instead of ignoring them
Nia Su
nia.su at sifive.com
Thu Sep 3 21:43:51 PDT 2026
smrnmi_handlers_init returned void, so a failed callback went
unreported and NMIE was enabled anyway.
Change it to return int and skip enabling NMIE on failure.
Signed-off-by: Nylon Chen <nylon.chen at sifive.com>
Co-developed-by: Nia Su <nia.su at sifive.com>
Signed-off-by: Nia Su <nia.su at sifive.com>
---
include/sbi/sbi_platform.h | 2 +-
lib/sbi/sbi_hart.c | 19 ++++++++++++-------
2 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/include/sbi/sbi_platform.h b/include/sbi/sbi_platform.h
index 1e9a23c1252558879c683633ad000828fbfa8f3f..d55805defafb0a7935d0d95653aefcc622078f69 100644
--- a/include/sbi/sbi_platform.h
+++ b/include/sbi/sbi_platform.h
@@ -155,7 +155,7 @@ struct sbi_platform_operations {
void (*pmp_disable)(unsigned int n);
/** platform specific Smrnmi handlers init on current HART */
- void (*smrnmi_handlers_init)(void (*rnmi_handler)(void),
+ int (*smrnmi_handlers_init)(void (*rnmi_handler)(void),
void (*rnme_handler)(void));
/** platform specific Smrnmi NMI handler.
diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
index d2b5be6a3ce68e6ab5c368e83b9cd0f09c4ca337..e34bbe27a8396fef80a3d69c0416898cae47ec88 100644
--- a/lib/sbi/sbi_hart.c
+++ b/lib/sbi/sbi_hart.c
@@ -466,15 +466,16 @@ static int hart_mhpm_get_allowed_bits(void)
return num_bits;
}
-static void sbi_smrnmi_hart_init(struct sbi_scratch *scratch)
+static int sbi_smrnmi_hart_init(struct sbi_scratch *scratch)
{
const struct sbi_platform *plat;
const struct sbi_platform_operations *ops;
extern void _trap_rnmi_handler(void);
extern void _trap_handler(void);
+ int ret;
if (!sbi_hart_has_extension(scratch, SBI_HART_EXT_SMRNMI))
- return;
+ return 0;
plat = sbi_platform_thishart_ptr();
ops = sbi_platform_ops(plat);
@@ -484,13 +485,17 @@ static void sbi_smrnmi_hart_init(struct sbi_scratch *scratch)
/* Reuse _trap_handler for the RNME slot since RNME is taken
* as a regular M-mode trap with NMIE=0. */
- ops->smrnmi_handlers_init(_trap_rnmi_handler, _trap_handler);
+ ret = ops->smrnmi_handlers_init(_trap_rnmi_handler, _trap_handler);
+ if (ret)
+ return ret;
/* Initialize MNSCRATCH for the RNMI handler */
csr_write(CSR_MNSCRATCH, scratch);
/* Enable NMIs */
csr_set(CSR_MNSTATUS, MNSTATUS_NMIE);
+
+ return 0;
}
static int hart_detect_features(struct sbi_scratch *scratch, bool cold_boot)
@@ -514,7 +519,9 @@ static int hart_detect_features(struct sbi_scratch *scratch, bool cold_boot)
if (rc)
return rc;
- sbi_smrnmi_hart_init(scratch);
+ rc = sbi_smrnmi_hart_init(scratch);
+ if (rc)
+ return rc;
#define __check_hpm_csr(__csr, __mask) \
oldval = csr_read_allowed(__csr, &trap); \
@@ -707,9 +714,7 @@ int sbi_hart_reinit(struct sbi_scratch *scratch)
if (rc)
return rc;
- sbi_smrnmi_hart_init(scratch);
-
- return 0;
+ return sbi_smrnmi_hart_init(scratch);
}
int sbi_hart_init(struct sbi_scratch *scratch, bool cold_boot)
--
2.43.7
More information about the opensbi
mailing list