@@ -50,6 +50,14 @@ static void cbo_clean(char *base) { cbo_insn(base, 1); }
50
50
static void cbo_flush (char * base ) { cbo_insn (base , 2 ); }
51
51
static void cbo_zero (char * base ) { cbo_insn (base , 4 ); }
52
52
53
+ static void test_no_cbo_inval (void * arg )
54
+ {
55
+ ksft_print_msg ("Testing cbo.inval instruction remain privileged\n" );
56
+ illegal_insn = false;
57
+ cbo_inval (& mem [0 ]);
58
+ ksft_test_result (illegal_insn , "No cbo.inval\n" );
59
+ }
60
+
53
61
static void test_no_zicbom (void * arg )
54
62
{
55
63
ksft_print_msg ("Testing Zicbom instructions remain privileged\n" );
@@ -61,10 +69,6 @@ static void test_no_zicbom(void *arg)
61
69
illegal_insn = false;
62
70
cbo_flush (& mem [0 ]);
63
71
ksft_test_result (illegal_insn , "No cbo.flush\n" );
64
-
65
- illegal_insn = false;
66
- cbo_inval (& mem [0 ]);
67
- ksft_test_result (illegal_insn , "No cbo.inval\n" );
68
72
}
69
73
70
74
static void test_no_zicboz (void * arg )
@@ -81,6 +85,30 @@ static bool is_power_of_2(__u64 n)
81
85
return n != 0 && (n & (n - 1 )) == 0 ;
82
86
}
83
87
88
+ static void test_zicbom (void * arg )
89
+ {
90
+ struct riscv_hwprobe pair = {
91
+ .key = RISCV_HWPROBE_KEY_ZICBOM_BLOCK_SIZE ,
92
+ };
93
+ cpu_set_t * cpus = (cpu_set_t * )arg ;
94
+ __u64 block_size ;
95
+ long rc ;
96
+
97
+ rc = riscv_hwprobe (& pair , 1 , sizeof (cpu_set_t ), (unsigned long * )cpus , 0 );
98
+ block_size = pair .value ;
99
+ ksft_test_result (rc == 0 && pair .key == RISCV_HWPROBE_KEY_ZICBOM_BLOCK_SIZE &&
100
+ is_power_of_2 (block_size ), "Zicbom block size\n" );
101
+ ksft_print_msg ("Zicbom block size: %llu\n" , block_size );
102
+
103
+ illegal_insn = false;
104
+ cbo_clean (& mem [block_size ]);
105
+ ksft_test_result (!illegal_insn , "cbo.clean\n" );
106
+
107
+ illegal_insn = false;
108
+ cbo_flush (& mem [block_size ]);
109
+ ksft_test_result (!illegal_insn , "cbo.flush\n" );
110
+ }
111
+
84
112
static void test_zicboz (void * arg )
85
113
{
86
114
struct riscv_hwprobe pair = {
@@ -129,14 +157,15 @@ static void test_zicboz(void *arg)
129
157
ksft_test_result_pass ("cbo.zero check\n" );
130
158
}
131
159
132
- static void check_no_zicboz_cpus (cpu_set_t * cpus )
160
+ static void check_no_zicbo_cpus (cpu_set_t * cpus , __u64 cbo )
133
161
{
134
162
struct riscv_hwprobe pair = {
135
163
.key = RISCV_HWPROBE_KEY_IMA_EXT_0 ,
136
164
};
137
165
cpu_set_t one_cpu ;
138
166
int i = 0 , c = 0 ;
139
167
long rc ;
168
+ char * cbostr ;
140
169
141
170
while (i ++ < CPU_COUNT (cpus )) {
142
171
while (!CPU_ISSET (c , cpus ))
@@ -148,18 +177,23 @@ static void check_no_zicboz_cpus(cpu_set_t *cpus)
148
177
rc = riscv_hwprobe (& pair , 1 , sizeof (cpu_set_t ), (unsigned long * )& one_cpu , 0 );
149
178
assert (rc == 0 && pair .key == RISCV_HWPROBE_KEY_IMA_EXT_0 );
150
179
151
- if (pair .value & RISCV_HWPROBE_EXT_ZICBOZ )
152
- ksft_exit_fail_msg ("Zicboz is only present on a subset of harts.\n"
153
- "Use taskset to select a set of harts where Zicboz\n"
154
- "presence (present or not) is consistent for each hart\n" );
180
+ cbostr = cbo == RISCV_HWPROBE_EXT_ZICBOZ ? "Zicboz" : "Zicbom" ;
181
+
182
+ if (pair .value & cbo )
183
+ ksft_exit_fail_msg ("%s is only present on a subset of harts.\n"
184
+ "Use taskset to select a set of harts where %s\n"
185
+ "presence (present or not) is consistent for each hart\n" ,
186
+ cbostr , cbostr );
155
187
++ c ;
156
188
}
157
189
}
158
190
159
191
enum {
160
192
TEST_ZICBOZ ,
161
193
TEST_NO_ZICBOZ ,
194
+ TEST_ZICBOM ,
162
195
TEST_NO_ZICBOM ,
196
+ TEST_NO_CBO_INVAL ,
163
197
};
164
198
165
199
static struct test_info {
@@ -169,7 +203,9 @@ static struct test_info {
169
203
} tests [] = {
170
204
[TEST_ZICBOZ ] = { .nr_tests = 3 , test_zicboz },
171
205
[TEST_NO_ZICBOZ ] = { .nr_tests = 1 , test_no_zicboz },
172
- [TEST_NO_ZICBOM ] = { .nr_tests = 3 , test_no_zicbom },
206
+ [TEST_ZICBOM ] = { .nr_tests = 3 , test_zicbom },
207
+ [TEST_NO_ZICBOM ] = { .nr_tests = 2 , test_no_zicbom },
208
+ [TEST_NO_CBO_INVAL ] = { .nr_tests = 1 , test_no_cbo_inval },
173
209
};
174
210
175
211
int main (int argc , char * * argv )
@@ -189,6 +225,7 @@ int main(int argc, char **argv)
189
225
assert (rc == 0 );
190
226
tests [TEST_NO_ZICBOZ ].enabled = true;
191
227
tests [TEST_NO_ZICBOM ].enabled = true;
228
+ tests [TEST_NO_CBO_INVAL ].enabled = true;
192
229
}
193
230
194
231
rc = sched_getaffinity (0 , sizeof (cpu_set_t ), & cpus );
@@ -206,7 +243,14 @@ int main(int argc, char **argv)
206
243
tests [TEST_ZICBOZ ].enabled = true;
207
244
tests [TEST_NO_ZICBOZ ].enabled = false;
208
245
} else {
209
- check_no_zicboz_cpus (& cpus );
246
+ check_no_zicbo_cpus (& cpus , RISCV_HWPROBE_EXT_ZICBOZ );
247
+ }
248
+
249
+ if (pair .value & RISCV_HWPROBE_EXT_ZICBOM ) {
250
+ tests [TEST_ZICBOM ].enabled = true;
251
+ tests [TEST_NO_ZICBOM ].enabled = false;
252
+ } else {
253
+ check_no_zicbo_cpus (& cpus , RISCV_HWPROBE_EXT_ZICBOM );
210
254
}
211
255
212
256
for (i = 0 ; i < ARRAY_SIZE (tests ); ++ i )
0 commit comments