xref: /kvm-unit-tests/riscv/sbi-tests.h (revision a3fc8778e92d12896807b35e781bf21b7dc64db3)
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(ret, expected_error, expected_value, has_value, expected_error_name, fmt, ...) ({	\
43 	long ex_err = expected_error;										\
44 	long ex_val = expected_value;										\
45 	bool has_val = !!(has_value);										\
46 	bool ch_err = (ret)->error == ex_err;									\
47 	bool ch_val = (ret)->value == ex_val;									\
48 	bool pass;												\
49 														\
50 	if (has_val)												\
51 		pass = report(ch_err && ch_val, fmt, ##__VA_ARGS__);						\
52 	else													\
53 		pass = report(ch_err, fmt ": %s", ##__VA_ARGS__, expected_error_name);				\
54 														\
55 	if (!pass && has_val)											\
56 		report_info(fmt ": expected (error: %ld, value: %ld), received: (error: %ld, value %ld)",	\
57 			    ##__VA_ARGS__, ex_err, ex_val, (ret)->error, (ret)->value);				\
58 	else if (!pass)												\
59 		report_info(fmt ": %s (%ld): received error %ld",						\
60 			    ##__VA_ARGS__, expected_error_name, ex_err, (ret)->error);				\
61 														\
62 	pass;													\
63 })
64 
65 #define sbiret_report(ret, expected_error, expected_value, ...) \
66 	__sbiret_report(ret, expected_error, expected_value, true, #expected_error, __VA_ARGS__)
67 
68 #define sbiret_report_error(ret, expected_error, ...) \
69 	__sbiret_report(ret, expected_error, 0, false, #expected_error, __VA_ARGS__)
70 
71 #define sbiret_check(ret, expected_error, expected_value) \
72 	sbiret_report(ret, expected_error, expected_value, "check sbi.error and sbi.value")
73 
74 static inline bool env_or_skip(const char *env)
75 {
76 	if (!getenv(env)) {
77 		report_skip("missing %s environment variable", env);
78 		return false;
79 	}
80 	return true;
81 }
82 
83 static inline bool env_enabled(const char *env)
84 {
85 	char *s = getenv(env);
86 
87 	return s && (*s == '1' || *s == 'y' || *s == 'Y');
88 }
89 
90 void sbi_bad_fid(int ext);
91 void check_sse(void);
92 
93 #endif /* __ASSEMBLER__ */
94 #endif /* _RISCV_SBI_TESTS_H_ */
95