Skip to content

Commit 64a64e5

Browse files
LeviYeoReumctmarinas
authored andcommitted
kselftest/arm64/mte: Refactor check_mmap_option test
Before add mtefar testcase on check_mmap_option.c, refactor check_mmap_option: - make testcase suite array with test options (mem_type, mte_sync type and etc) to use general testcase pattern - generate each test case name acoording to test options. Signed-off-by: Yeoreum Yun <[email protected]> Reviewed-by: Mark Brown <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Catalin Marinas <[email protected]>
1 parent 49cee36 commit 64a64e5

File tree

1 file changed

+313
-54
lines changed

1 file changed

+313
-54
lines changed

tools/testing/selftests/arm64/mte/check_mmap_options.c

Lines changed: 313 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#define _GNU_SOURCE
55

6+
#include <assert.h>
67
#include <errno.h>
78
#include <fcntl.h>
89
#include <signal.h>
@@ -24,6 +25,23 @@
2425
#define TAG_CHECK_ON 0
2526
#define TAG_CHECK_OFF 1
2627

28+
#define TEST_NAME_MAX 256
29+
30+
enum mte_mem_check_type {
31+
CHECK_ANON_MEM = 0,
32+
CHECK_FILE_MEM = 1,
33+
CHECK_CLEAR_PROT_MTE = 2,
34+
};
35+
36+
struct check_mmap_testcase {
37+
int check_type;
38+
int mem_type;
39+
int mte_sync;
40+
int mapping;
41+
int tag_check;
42+
bool enable_tco;
43+
};
44+
2745
static size_t page_size;
2846
static int sizes[] = {
2947
1, 537, 989, 1269, MT_GRANULE_SIZE - 1, MT_GRANULE_SIZE,
@@ -183,10 +201,271 @@ static int check_clear_prot_mte_flag(int mem_type, int mode, int mapping)
183201
return KSFT_PASS;
184202
}
185203

204+
const char *format_test_name(struct check_mmap_testcase *tc)
205+
{
206+
static char test_name[TEST_NAME_MAX];
207+
const char *check_type_str;
208+
const char *mem_type_str;
209+
const char *sync_str;
210+
const char *mapping_str;
211+
const char *tag_check_str;
212+
213+
switch (tc->check_type) {
214+
case CHECK_ANON_MEM:
215+
check_type_str = "anonymous memory";
216+
break;
217+
case CHECK_FILE_MEM:
218+
check_type_str = "file memory";
219+
break;
220+
case CHECK_CLEAR_PROT_MTE:
221+
check_type_str = "clear PROT_MTE flags";
222+
break;
223+
default:
224+
assert(0);
225+
break;
226+
}
227+
228+
switch (tc->mem_type) {
229+
case USE_MMAP:
230+
mem_type_str = "mmap";
231+
break;
232+
case USE_MPROTECT:
233+
mem_type_str = "mmap/mprotect";
234+
break;
235+
default:
236+
assert(0);
237+
break;
238+
}
239+
240+
switch (tc->mte_sync) {
241+
case MTE_NONE_ERR:
242+
sync_str = "no error";
243+
break;
244+
case MTE_SYNC_ERR:
245+
sync_str = "sync error";
246+
break;
247+
case MTE_ASYNC_ERR:
248+
sync_str = "async error";
249+
break;
250+
default:
251+
assert(0);
252+
break;
253+
}
254+
255+
switch (tc->mapping) {
256+
case MAP_SHARED:
257+
mapping_str = "shared";
258+
break;
259+
case MAP_PRIVATE:
260+
mapping_str = "private";
261+
break;
262+
default:
263+
assert(0);
264+
break;
265+
}
266+
267+
switch (tc->tag_check) {
268+
case TAG_CHECK_ON:
269+
tag_check_str = "tag check on";
270+
break;
271+
case TAG_CHECK_OFF:
272+
tag_check_str = "tag check off";
273+
break;
274+
default:
275+
assert(0);
276+
break;
277+
}
278+
279+
snprintf(test_name, sizeof(test_name),
280+
"Check %s with %s mapping, %s mode, %s memory and %s\n",
281+
check_type_str, mapping_str, sync_str, mem_type_str,
282+
tag_check_str);
283+
284+
return test_name;
285+
}
286+
186287
int main(int argc, char *argv[])
187288
{
188-
int err;
289+
int err, i;
189290
int item = ARRAY_SIZE(sizes);
291+
struct check_mmap_testcase test_cases[]= {
292+
{
293+
.check_type = CHECK_ANON_MEM,
294+
.mem_type = USE_MMAP,
295+
.mte_sync = MTE_SYNC_ERR,
296+
.mapping = MAP_PRIVATE,
297+
.tag_check = TAG_CHECK_OFF,
298+
.enable_tco = true,
299+
},
300+
{
301+
.check_type = CHECK_FILE_MEM,
302+
.mem_type = USE_MPROTECT,
303+
.mte_sync = MTE_SYNC_ERR,
304+
.mapping = MAP_PRIVATE,
305+
.tag_check = TAG_CHECK_OFF,
306+
.enable_tco = true,
307+
},
308+
{
309+
.check_type = CHECK_ANON_MEM,
310+
.mem_type = USE_MMAP,
311+
.mte_sync = MTE_NONE_ERR,
312+
.mapping = MAP_PRIVATE,
313+
.tag_check = TAG_CHECK_OFF,
314+
.enable_tco = false,
315+
},
316+
{
317+
.check_type = CHECK_FILE_MEM,
318+
.mem_type = USE_MPROTECT,
319+
.mte_sync = MTE_NONE_ERR,
320+
.mapping = MAP_PRIVATE,
321+
.tag_check = TAG_CHECK_OFF,
322+
.enable_tco = false,
323+
},
324+
{
325+
.check_type = CHECK_ANON_MEM,
326+
.mem_type = USE_MMAP,
327+
.mte_sync = MTE_SYNC_ERR,
328+
.mapping = MAP_PRIVATE,
329+
.tag_check = TAG_CHECK_ON,
330+
.enable_tco = false,
331+
},
332+
{
333+
.check_type = CHECK_ANON_MEM,
334+
.mem_type = USE_MPROTECT,
335+
.mte_sync = MTE_SYNC_ERR,
336+
.mapping = MAP_PRIVATE,
337+
.tag_check = TAG_CHECK_ON,
338+
.enable_tco = false,
339+
},
340+
{
341+
.check_type = CHECK_ANON_MEM,
342+
.mem_type = USE_MMAP,
343+
.mte_sync = MTE_SYNC_ERR,
344+
.mapping = MAP_SHARED,
345+
.tag_check = TAG_CHECK_ON,
346+
.enable_tco = false,
347+
},
348+
{
349+
.check_type = CHECK_ANON_MEM,
350+
.mem_type = USE_MPROTECT,
351+
.mte_sync = MTE_SYNC_ERR,
352+
.mapping = MAP_SHARED,
353+
.tag_check = TAG_CHECK_ON,
354+
.enable_tco = false,
355+
},
356+
{
357+
.check_type = CHECK_ANON_MEM,
358+
.mem_type = USE_MMAP,
359+
.mte_sync = MTE_ASYNC_ERR,
360+
.mapping = MAP_PRIVATE,
361+
.tag_check = TAG_CHECK_ON,
362+
.enable_tco = false,
363+
},
364+
{
365+
.check_type = CHECK_ANON_MEM,
366+
.mem_type = USE_MPROTECT,
367+
.mte_sync = MTE_ASYNC_ERR,
368+
.mapping = MAP_PRIVATE,
369+
.tag_check = TAG_CHECK_ON,
370+
.enable_tco = false,
371+
},
372+
{
373+
.check_type = CHECK_ANON_MEM,
374+
.mem_type = USE_MMAP,
375+
.mte_sync = MTE_ASYNC_ERR,
376+
.mapping = MAP_SHARED,
377+
.tag_check = TAG_CHECK_ON,
378+
.enable_tco = false,
379+
},
380+
{
381+
.check_type = CHECK_ANON_MEM,
382+
.mem_type = USE_MPROTECT,
383+
.mte_sync = MTE_ASYNC_ERR,
384+
.mapping = MAP_SHARED,
385+
.tag_check = TAG_CHECK_ON,
386+
.enable_tco = false,
387+
},
388+
{
389+
.check_type = CHECK_FILE_MEM,
390+
.mem_type = USE_MMAP,
391+
.mte_sync = MTE_SYNC_ERR,
392+
.mapping = MAP_PRIVATE,
393+
.tag_check = TAG_CHECK_ON,
394+
.enable_tco = false,
395+
},
396+
{
397+
.check_type = CHECK_FILE_MEM,
398+
.mem_type = USE_MPROTECT,
399+
.mte_sync = MTE_SYNC_ERR,
400+
.mapping = MAP_PRIVATE,
401+
.tag_check = TAG_CHECK_ON,
402+
.enable_tco = false,
403+
},
404+
{
405+
.check_type = CHECK_FILE_MEM,
406+
.mem_type = USE_MMAP,
407+
.mte_sync = MTE_SYNC_ERR,
408+
.mapping = MAP_SHARED,
409+
.tag_check = TAG_CHECK_ON,
410+
.enable_tco = false,
411+
},
412+
{
413+
.check_type = CHECK_FILE_MEM,
414+
.mem_type = USE_MPROTECT,
415+
.mte_sync = MTE_SYNC_ERR,
416+
.mapping = MAP_SHARED,
417+
.tag_check = TAG_CHECK_ON,
418+
.enable_tco = false,
419+
},
420+
{
421+
.check_type = CHECK_FILE_MEM,
422+
.mem_type = USE_MMAP,
423+
.mte_sync = MTE_ASYNC_ERR,
424+
.mapping = MAP_PRIVATE,
425+
.tag_check = TAG_CHECK_ON,
426+
.enable_tco = false,
427+
},
428+
{
429+
.check_type = CHECK_FILE_MEM,
430+
.mem_type = USE_MPROTECT,
431+
.mte_sync = MTE_ASYNC_ERR,
432+
.mapping = MAP_PRIVATE,
433+
.tag_check = TAG_CHECK_ON,
434+
.enable_tco = false,
435+
},
436+
{
437+
.check_type = CHECK_FILE_MEM,
438+
.mem_type = USE_MMAP,
439+
.mte_sync = MTE_ASYNC_ERR,
440+
.mapping = MAP_SHARED,
441+
.tag_check = TAG_CHECK_ON,
442+
.enable_tco = false,
443+
},
444+
{
445+
.check_type = CHECK_FILE_MEM,
446+
.mem_type = USE_MPROTECT,
447+
.mte_sync = MTE_ASYNC_ERR,
448+
.mapping = MAP_SHARED,
449+
.tag_check = TAG_CHECK_ON,
450+
.enable_tco = false,
451+
},
452+
{
453+
.check_type = CHECK_CLEAR_PROT_MTE,
454+
.mem_type = USE_MMAP,
455+
.mte_sync = MTE_SYNC_ERR,
456+
.mapping = MAP_PRIVATE,
457+
.tag_check = TAG_CHECK_ON,
458+
.enable_tco = false,
459+
},
460+
{
461+
.check_type = CHECK_CLEAR_PROT_MTE,
462+
.mem_type = USE_MPROTECT,
463+
.mte_sync = MTE_SYNC_ERR,
464+
.mapping = MAP_PRIVATE,
465+
.tag_check = TAG_CHECK_ON,
466+
.enable_tco = false,
467+
},
468+
};
190469

191470
err = mte_default_setup();
192471
if (err)
@@ -205,59 +484,39 @@ int main(int argc, char *argv[])
205484
mte_register_signal(SIGSEGV, mte_default_handler, false);
206485

207486
/* Set test plan */
208-
ksft_set_plan(22);
209-
210-
mte_enable_pstate_tco();
211-
212-
evaluate_test(check_anonymous_memory_mapping(USE_MMAP, MTE_SYNC_ERR, MAP_PRIVATE, TAG_CHECK_OFF),
213-
"Check anonymous memory with private mapping, sync error mode, mmap memory and tag check off\n");
214-
evaluate_test(check_file_memory_mapping(USE_MPROTECT, MTE_SYNC_ERR, MAP_PRIVATE, TAG_CHECK_OFF),
215-
"Check file memory with private mapping, sync error mode, mmap/mprotect memory and tag check off\n");
216-
217-
mte_disable_pstate_tco();
218-
evaluate_test(check_anonymous_memory_mapping(USE_MMAP, MTE_NONE_ERR, MAP_PRIVATE, TAG_CHECK_OFF),
219-
"Check anonymous memory with private mapping, no error mode, mmap memory and tag check off\n");
220-
evaluate_test(check_file_memory_mapping(USE_MPROTECT, MTE_NONE_ERR, MAP_PRIVATE, TAG_CHECK_OFF),
221-
"Check file memory with private mapping, no error mode, mmap/mprotect memory and tag check off\n");
222-
223-
evaluate_test(check_anonymous_memory_mapping(USE_MMAP, MTE_SYNC_ERR, MAP_PRIVATE, TAG_CHECK_ON),
224-
"Check anonymous memory with private mapping, sync error mode, mmap memory and tag check on\n");
225-
evaluate_test(check_anonymous_memory_mapping(USE_MPROTECT, MTE_SYNC_ERR, MAP_PRIVATE, TAG_CHECK_ON),
226-
"Check anonymous memory with private mapping, sync error mode, mmap/mprotect memory and tag check on\n");
227-
evaluate_test(check_anonymous_memory_mapping(USE_MMAP, MTE_SYNC_ERR, MAP_SHARED, TAG_CHECK_ON),
228-
"Check anonymous memory with shared mapping, sync error mode, mmap memory and tag check on\n");
229-
evaluate_test(check_anonymous_memory_mapping(USE_MPROTECT, MTE_SYNC_ERR, MAP_SHARED, TAG_CHECK_ON),
230-
"Check anonymous memory with shared mapping, sync error mode, mmap/mprotect memory and tag check on\n");
231-
evaluate_test(check_anonymous_memory_mapping(USE_MMAP, MTE_ASYNC_ERR, MAP_PRIVATE, TAG_CHECK_ON),
232-
"Check anonymous memory with private mapping, async error mode, mmap memory and tag check on\n");
233-
evaluate_test(check_anonymous_memory_mapping(USE_MPROTECT, MTE_ASYNC_ERR, MAP_PRIVATE, TAG_CHECK_ON),
234-
"Check anonymous memory with private mapping, async error mode, mmap/mprotect memory and tag check on\n");
235-
evaluate_test(check_anonymous_memory_mapping(USE_MMAP, MTE_ASYNC_ERR, MAP_SHARED, TAG_CHECK_ON),
236-
"Check anonymous memory with shared mapping, async error mode, mmap memory and tag check on\n");
237-
evaluate_test(check_anonymous_memory_mapping(USE_MPROTECT, MTE_ASYNC_ERR, MAP_SHARED, TAG_CHECK_ON),
238-
"Check anonymous memory with shared mapping, async error mode, mmap/mprotect memory and tag check on\n");
239-
240-
evaluate_test(check_file_memory_mapping(USE_MMAP, MTE_SYNC_ERR, MAP_PRIVATE, TAG_CHECK_ON),
241-
"Check file memory with private mapping, sync error mode, mmap memory and tag check on\n");
242-
evaluate_test(check_file_memory_mapping(USE_MPROTECT, MTE_SYNC_ERR, MAP_PRIVATE, TAG_CHECK_ON),
243-
"Check file memory with private mapping, sync error mode, mmap/mprotect memory and tag check on\n");
244-
evaluate_test(check_file_memory_mapping(USE_MMAP, MTE_SYNC_ERR, MAP_SHARED, TAG_CHECK_ON),
245-
"Check file memory with shared mapping, sync error mode, mmap memory and tag check on\n");
246-
evaluate_test(check_file_memory_mapping(USE_MPROTECT, MTE_SYNC_ERR, MAP_SHARED, TAG_CHECK_ON),
247-
"Check file memory with shared mapping, sync error mode, mmap/mprotect memory and tag check on\n");
248-
evaluate_test(check_file_memory_mapping(USE_MMAP, MTE_ASYNC_ERR, MAP_PRIVATE, TAG_CHECK_ON),
249-
"Check file memory with private mapping, async error mode, mmap memory and tag check on\n");
250-
evaluate_test(check_file_memory_mapping(USE_MPROTECT, MTE_ASYNC_ERR, MAP_PRIVATE, TAG_CHECK_ON),
251-
"Check file memory with private mapping, async error mode, mmap/mprotect memory and tag check on\n");
252-
evaluate_test(check_file_memory_mapping(USE_MMAP, MTE_ASYNC_ERR, MAP_SHARED, TAG_CHECK_ON),
253-
"Check file memory with shared mapping, async error mode, mmap memory and tag check on\n");
254-
evaluate_test(check_file_memory_mapping(USE_MPROTECT, MTE_ASYNC_ERR, MAP_SHARED, TAG_CHECK_ON),
255-
"Check file memory with shared mapping, async error mode, mmap/mprotect memory and tag check on\n");
256-
257-
evaluate_test(check_clear_prot_mte_flag(USE_MMAP, MTE_SYNC_ERR, MAP_PRIVATE),
258-
"Check clear PROT_MTE flags with private mapping, sync error mode and mmap memory\n");
259-
evaluate_test(check_clear_prot_mte_flag(USE_MPROTECT, MTE_SYNC_ERR, MAP_PRIVATE),
260-
"Check clear PROT_MTE flags with private mapping and sync error mode and mmap/mprotect memory\n");
487+
ksft_set_plan(ARRAY_SIZE(test_cases));
488+
489+
for (i = 0 ; i < ARRAY_SIZE(test_cases); i++) {
490+
if (test_cases[i].enable_tco)
491+
mte_enable_pstate_tco();
492+
else
493+
mte_disable_pstate_tco();
494+
495+
switch (test_cases[i].check_type) {
496+
case CHECK_ANON_MEM:
497+
evaluate_test(check_anonymous_memory_mapping(test_cases[i].mem_type,
498+
test_cases[i].mte_sync,
499+
test_cases[i].mapping,
500+
test_cases[i].tag_check),
501+
format_test_name(&test_cases[i]));
502+
break;
503+
case CHECK_FILE_MEM:
504+
evaluate_test(check_file_memory_mapping(test_cases[i].mem_type,
505+
test_cases[i].mte_sync,
506+
test_cases[i].mapping,
507+
test_cases[i].tag_check),
508+
format_test_name(&test_cases[i]));
509+
break;
510+
case CHECK_CLEAR_PROT_MTE:
511+
evaluate_test(check_clear_prot_mte_flag(test_cases[i].mem_type,
512+
test_cases[i].mte_sync,
513+
test_cases[i].mapping),
514+
format_test_name(&test_cases[i]));
515+
break;
516+
default:
517+
exit(KSFT_FAIL);
518+
}
519+
}
261520

262521
mte_restore_setup();
263522
ksft_print_cnts();

0 commit comments

Comments
 (0)