[kvm-unit-tests PATCH v2 3/3] riscv: sbi: Add sbiret_report_error

Andrew Jones andrew.jones at linux.dev
Tue Feb 18 10:54:04 PST 2025


An sbiret value may be unspecified in the case of errors, and even in
the case of success when the function doesn't return anything.
Provide an sbiret report function that only checks sbiret.error.

sbiret_report_error() has a different PASS format than
sbiret_report(). The former will always output the stringized
expected error so the format string doesn't need to contain it, e.g.

  PASS: sbi: test foo: SBI_SUCCESS
  PASS: sbi: test event id 0x0: SBI_INVALID_PARAM

Signed-off-by: Andrew Jones <andrew.jones at linux.dev>
---
 riscv/sbi-tests.h | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/riscv/sbi-tests.h b/riscv/sbi-tests.h
index 2bdc9440d82d..7a24e083a7b8 100644
--- a/riscv/sbi-tests.h
+++ b/riscv/sbi-tests.h
@@ -36,20 +36,35 @@
 #ifndef __ASSEMBLY__
 #include <asm/sbi.h>
 
-#define sbiret_report(ret, expected_error, expected_value, fmt, ...) ({						\
+#define __sbiret_report(ret, expected_error, expected_value, has_value, expected_error_name, fmt, ...) ({	\
 	long ex_err = expected_error;										\
 	long ex_val = expected_value;										\
+	bool has_val = !!(has_value);										\
 	bool ch_err = (ret)->error == ex_err;									\
 	bool ch_val = (ret)->value == ex_val;									\
-	bool pass = report(ch_err && ch_val, fmt, ##__VA_ARGS__);						\
+	bool pass;												\
 														\
-	if (!pass)												\
+	if (has_val)												\
+		pass = report(ch_err && ch_val, fmt, ##__VA_ARGS__);						\
+	else													\
+		pass = report(ch_err, fmt ": %s", ##__VA_ARGS__, expected_error_name);				\
+														\
+	if (!pass && has_val)											\
 		report_info(fmt ": expected (error: %ld, value: %ld), received: (error: %ld, value %ld)",	\
 			    ##__VA_ARGS__, ex_err, ex_val, (ret)->error, (ret)->value);				\
+	else if (!pass)												\
+		report_info(fmt ": %s (%ld): received error %ld",						\
+			    ##__VA_ARGS__, expected_error_name, ex_err, (ret)->error);				\
 														\
 	pass;													\
 })
 
+#define sbiret_report(ret, expected_error, expected_value, ...) \
+	__sbiret_report(ret, expected_error, expected_value, true, #expected_error, __VA_ARGS__)
+
+#define sbiret_report_error(ret, expected_error, ...) \
+	__sbiret_report(ret, expected_error, 0, false, #expected_error, __VA_ARGS__)
+
 #define sbiret_check(ret, expected_error, expected_value) \
 	sbiret_report(ret, expected_error, expected_value, "check sbi.error and sbi.value")
 
-- 
2.48.1




More information about the kvm-riscv mailing list