[PATCH v3 2/3] lib: sbi: report smrnmi_handlers_init failures instead of ignoring them

Nia Su nia.su at sifive.com
Tue Sep 15 22:56:44 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. Also
update the doc comment on rnmi_handler to use SBI_OK instead of
SBI_SUCCESS, so both callbacks consistently reference the correct
firmware-internal success constant rather than the ecall-facing one.

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>
Reviewed-by: Evgeny Voevodin <evvoevod at tenstorrent.com>
---
 include/sbi/sbi_platform.h |  7 ++++---
 lib/sbi/sbi_hart.c         | 21 ++++++++++++++++-----
 2 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/include/sbi/sbi_platform.h b/include/sbi/sbi_platform.h
index 0a1e7eee0bae8eee963e5a4ebc0895b2bd10dd23..2cfb0976772dcff627b3c7c6bb8ff6488a3ac365 100644
--- a/include/sbi/sbi_platform.h
+++ b/include/sbi/sbi_platform.h
@@ -157,12 +157,13 @@ struct sbi_platform_operations {
 	/** platform specific Smrnmi handlers init on current HART.
 	 *  May be called more than once on the same HART (e.g. once
 	 *  during boot feature detection and again during hart
-	 *  re-init), so it must be safe to call repeatedly. */
-	void (*smrnmi_handlers_init)(void (*rnmi_handler)(void),
+	 *  re-init), so it must be safe to call repeatedly.
+	 *  Returns SBI_OK on success, error code otherwise. */
+	int (*smrnmi_handlers_init)(void (*rnmi_handler)(void),
 			void (*rnme_handler)(void));
 
 	/** platform specific Smrnmi NMI handler.
-	 *  Returns SBI_SUCCESS on success, error code if NMI cannot be handled. */
+	 *  Returns SBI_OK on success, error code if NMI cannot be handled. */
 	int (*rnmi_handler)(struct sbi_trap_context *tcntx);
 };
 
diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
index 18fac76ac070cb626ccb1cc959f4327de0e7c1d8..34f02ece279333366370114333b95ced916b0e1c 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);			  \
@@ -699,7 +706,11 @@ __pmp_skip:
 
 int sbi_hart_reinit(struct sbi_scratch *scratch)
 {
-	sbi_smrnmi_hart_init(scratch);
+	int rc;
+
+	rc = sbi_smrnmi_hart_init(scratch);
+	if (rc)
+		return rc;
 
 	mstatus_init(scratch);
 

-- 
2.43.7




More information about the opensbi mailing list