xref: /kvm-unit-tests/riscv/sbi-tests.h (revision 695740795adee59b48599e2f1a6bf19866a77779)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 #ifndef _RISCV_SBI_TESTS_H_
3 #define _RISCV_SBI_TESTS_H_
4 
5 #define SBI_HSM_TEST_DONE	(1 << 0)
6 #define SBI_HSM_TEST_MAGIC_A1	(1 << 1)
7 #define SBI_HSM_TEST_HARTID_A0	(1 << 2)
8 #define SBI_HSM_TEST_SATP	(1 << 3)
9 #define SBI_HSM_TEST_SIE	(1 << 4)
10 
11 #define SBI_HSM_MAGIC		0x453
12 
13 #define SBI_HSM_MAGIC_IDX	0
14 #define SBI_HSM_HARTID_IDX	1
15 #define SBI_HSM_NUM_OF_PARAMS	2
16 
17 #define SBI_SUSP_MAGIC_IDX	0
18 #define SBI_SUSP_CSRS_IDX	1
19 #define SBI_SUSP_HARTID_IDX	2
20 #define SBI_SUSP_TESTNUM_IDX	3
21 #define SBI_SUSP_RESULTS_IDX	4
22 #define SBI_SUSP_NR_IDX		5
23 
24 #define SBI_CSR_SSTATUS_IDX	0
25 #define SBI_CSR_SIE_IDX		1
26 #define SBI_CSR_STVEC_IDX	2
27 #define SBI_CSR_SSCRATCH_IDX	3
28 #define SBI_CSR_SATP_IDX	4
29 #define SBI_CSR_NR_IDX		5
30 
31 #define SBI_SUSP_MAGIC		0x505b
32 
33 #define SBI_SUSP_TEST_SATP	(1 << 0)
34 #define SBI_SUSP_TEST_SIE	(1 << 1)
35 #define SBI_SUSP_TEST_HARTID	(1 << 2)
36 #define SBI_SUSP_TEST_MASK	7
37 
38 #ifndef __ASSEMBLER__
39 #include <libcflat.h>
40 #include <asm/sbi.h>
41 
42 #define __sbiret_report(kfail, ret, expected_error, expected_value,						\
43 			has_value, expected_error_name, fmt, ...) ({						\
44 	long ex_err = expected_error;										\
45 	long ex_val = expected_value;										\
46 	bool has_val = !!(has_value);										\
47 	bool ch_err = (ret)->error == ex_err;									\
48 	bool ch_val = (ret)->value == ex_val;									\
49 	bool pass;												\
50 														\
51 	if (has_val)												\
52 		pass = report_kfail(kfail, ch_err && ch_val, fmt, ##__VA_ARGS__);				\
53 	else													\
54 		pass = report_kfail(kfail, ch_err, fmt ": %s", ##__VA_ARGS__, expected_error_name);		\
55 														\
56 	if (!pass && has_val)											\
57 		report_info(fmt ": expected (error: %ld, value: %ld), received: (error: %ld, value %ld)",	\
58 			    ##__VA_ARGS__, ex_err, ex_val, (ret)->error, (ret)->value);				\
59 	else if (!pass)												\
60 		report_info(fmt ": %s (%ld): received error %ld",						\
61 			    ##__VA_ARGS__, expected_error_name, ex_err, (ret)->error);				\
62 														\
63 	pass;													\
64 })
65 
66 #define sbiret_report(ret, expected_error, expected_value, ...) \
67 	__sbiret_report(false, ret, expected_error, expected_value, true, #expected_error, __VA_ARGS__)
68 
69 #define sbiret_report_error(ret, expected_error, ...) \
70 	__sbiret_report(false, ret, expected_error, 0, false, #expected_error, __VA_ARGS__)
71 
72 #define sbiret_check(ret, expected_error, expected_value) \
73 	sbiret_report(ret, expected_error, expected_value, "check sbi.error and sbi.value")
74 
75 #define sbiret_kfail(kfail, ret, expected_error, expected_value, ...) \
76 	__sbiret_report(kfail, ret, expected_error, expected_value, true, #expected_error, __VA_ARGS__)
77 
78 #define sbiret_kfail_error(kfail, ret, expected_error, ...) \
79 	__sbiret_report(kfail, ret, expected_error, 0, false, #expected_error, __VA_ARGS__)
80 
81 #define sbiret_check_kfail(kfail, ret, expected_error, expected_value) \
82 	sbiret_kfail(kfail, ret, expected_error, expected_value, "check sbi.error and sbi.value")
83 
env_or_skip(const char * env)84 static inline bool env_or_skip(const char *env)
85 {
86 	if (!getenv(env)) {
87 		report_skip("missing %s environment variable", env);
88 		return false;
89 	}
90 	return true;
91 }
92 
env_enabled(const char * env)93 static inline bool env_enabled(const char *env)
94 {
95 	char *s = getenv(env);
96 
97 	return s && (*s == '1' || *s == 'y' || *s == 'Y');
98 }
99 
100 void sbi_bad_fid(int ext);
101 void check_sse(void);
102 
103 #endif /* __ASSEMBLER__ */
104 #endif /* _RISCV_SBI_TESTS_H_ */
105