xref: /kvm-unit-tests/riscv/sbi-tests.h (revision 7536c9add92b9942c94b52e4dc973f247f5367a1)
1661fe480SJames Raphael Tiovalen /* SPDX-License-Identifier: GPL-2.0-only */
2661fe480SJames Raphael Tiovalen #ifndef _RISCV_SBI_TESTS_H_
3661fe480SJames Raphael Tiovalen #define _RISCV_SBI_TESTS_H_
4661fe480SJames Raphael Tiovalen 
5afd2cae5SJames Raphael Tiovalen #define SBI_HSM_TEST_DONE	(1 << 0)
6afd2cae5SJames Raphael Tiovalen #define SBI_HSM_TEST_MAGIC_A1	(1 << 1)
7afd2cae5SJames Raphael Tiovalen #define SBI_HSM_TEST_HARTID_A0	(1 << 2)
8afd2cae5SJames Raphael Tiovalen #define SBI_HSM_TEST_SATP	(1 << 3)
9afd2cae5SJames Raphael Tiovalen #define SBI_HSM_TEST_SIE	(1 << 4)
10afd2cae5SJames Raphael Tiovalen 
11afd2cae5SJames Raphael Tiovalen #define SBI_HSM_MAGIC		0x453
12afd2cae5SJames Raphael Tiovalen 
13afd2cae5SJames Raphael Tiovalen #define SBI_HSM_MAGIC_IDX	0
14afd2cae5SJames Raphael Tiovalen #define SBI_HSM_HARTID_IDX	1
15afd2cae5SJames Raphael Tiovalen #define SBI_HSM_NUM_OF_PARAMS	2
16afd2cae5SJames Raphael Tiovalen 
172ffe016fSAndrew Jones #define SBI_SUSP_MAGIC_IDX	0
182ffe016fSAndrew Jones #define SBI_SUSP_CSRS_IDX	1
192ffe016fSAndrew Jones #define SBI_SUSP_HARTID_IDX	2
202ffe016fSAndrew Jones #define SBI_SUSP_TESTNUM_IDX	3
212ffe016fSAndrew Jones #define SBI_SUSP_RESULTS_IDX	4
22635f8573SAndrew Jones #define SBI_SUSP_NR_IDX		5
232ffe016fSAndrew Jones 
242ffe016fSAndrew Jones #define SBI_CSR_SSTATUS_IDX	0
252ffe016fSAndrew Jones #define SBI_CSR_SIE_IDX		1
262ffe016fSAndrew Jones #define SBI_CSR_STVEC_IDX	2
272ffe016fSAndrew Jones #define SBI_CSR_SSCRATCH_IDX	3
282ffe016fSAndrew Jones #define SBI_CSR_SATP_IDX	4
29635f8573SAndrew Jones #define SBI_CSR_NR_IDX		5
302ffe016fSAndrew Jones 
312ffe016fSAndrew Jones #define SBI_SUSP_MAGIC		0x505b
322ffe016fSAndrew Jones 
332ffe016fSAndrew Jones #define SBI_SUSP_TEST_SATP	(1 << 0)
342ffe016fSAndrew Jones #define SBI_SUSP_TEST_SIE	(1 << 1)
352ffe016fSAndrew Jones #define SBI_SUSP_TEST_HARTID	(1 << 2)
362ffe016fSAndrew Jones #define SBI_SUSP_TEST_MASK	7
37661fe480SJames Raphael Tiovalen 
380cc3a351SSean Christopherson #ifndef __ASSEMBLER__
39db12c158SAkshay Behl #include <libcflat.h>
40f9a088b4SAndrew Jones #include <asm/sbi.h>
41f9a088b4SAndrew Jones 
421d3411dcSAndrew Jones #define __sbiret_report(ret, expected_error, expected_value, has_value, expected_error_name, fmt, ...) ({	\
43f9a088b4SAndrew Jones 	long ex_err = expected_error;										\
44f9a088b4SAndrew Jones 	long ex_val = expected_value;										\
451d3411dcSAndrew Jones 	bool has_val = !!(has_value);										\
46f9a088b4SAndrew Jones 	bool ch_err = (ret)->error == ex_err;									\
47f9a088b4SAndrew Jones 	bool ch_val = (ret)->value == ex_val;									\
481d3411dcSAndrew Jones 	bool pass;												\
49f9a088b4SAndrew Jones 														\
501d3411dcSAndrew Jones 	if (has_val)												\
511d3411dcSAndrew Jones 		pass = report(ch_err && ch_val, fmt, ##__VA_ARGS__);						\
521d3411dcSAndrew Jones 	else													\
531d3411dcSAndrew Jones 		pass = report(ch_err, fmt ": %s", ##__VA_ARGS__, expected_error_name);				\
541d3411dcSAndrew Jones 														\
551d3411dcSAndrew Jones 	if (!pass && has_val)											\
56f9a088b4SAndrew Jones 		report_info(fmt ": expected (error: %ld, value: %ld), received: (error: %ld, value %ld)",	\
57f9a088b4SAndrew Jones 			    ##__VA_ARGS__, ex_err, ex_val, (ret)->error, (ret)->value);				\
581d3411dcSAndrew Jones 	else if (!pass)												\
591d3411dcSAndrew Jones 		report_info(fmt ": %s (%ld): received error %ld",						\
601d3411dcSAndrew Jones 			    ##__VA_ARGS__, expected_error_name, ex_err, (ret)->error);				\
61f9a088b4SAndrew Jones 														\
62f9a088b4SAndrew Jones 	pass;													\
63f9a088b4SAndrew Jones })
64f9a088b4SAndrew Jones 
651d3411dcSAndrew Jones #define sbiret_report(ret, expected_error, expected_value, ...) \
661d3411dcSAndrew Jones 	__sbiret_report(ret, expected_error, expected_value, true, #expected_error, __VA_ARGS__)
671d3411dcSAndrew Jones 
681d3411dcSAndrew Jones #define sbiret_report_error(ret, expected_error, ...) \
691d3411dcSAndrew Jones 	__sbiret_report(ret, expected_error, 0, false, #expected_error, __VA_ARGS__)
701d3411dcSAndrew Jones 
71f9a088b4SAndrew Jones #define sbiret_check(ret, expected_error, expected_value) \
72f9a088b4SAndrew Jones 	sbiret_report(ret, expected_error, expected_value, "check sbi.error and sbi.value")
73f9a088b4SAndrew Jones 
74db12c158SAkshay Behl static inline bool env_or_skip(const char *env)
75db12c158SAkshay Behl {
76db12c158SAkshay Behl 	if (!getenv(env)) {
77db12c158SAkshay Behl 		report_skip("missing %s environment variable", env);
78db12c158SAkshay Behl 		return false;
79db12c158SAkshay Behl 	}
80db12c158SAkshay Behl 	return true;
81db12c158SAkshay Behl }
82db12c158SAkshay Behl 
83db12c158SAkshay Behl static inline bool env_enabled(const char *env)
84db12c158SAkshay Behl {
85db12c158SAkshay Behl 	char *s = getenv(env);
86db12c158SAkshay Behl 
87db12c158SAkshay Behl 	return s && (*s == '1' || *s == 'y' || *s == 'Y');
88db12c158SAkshay Behl }
89db12c158SAkshay Behl 
906fad56a1SAndrew Jones void sbi_bad_fid(int ext);
91*7536c9adSClément Léger void check_sse(void);
926fad56a1SAndrew Jones 
930cc3a351SSean Christopherson #endif /* __ASSEMBLER__ */
94661fe480SJames Raphael Tiovalen #endif /* _RISCV_SBI_TESTS_H_ */
95