33
44#define _GNU_SOURCE
55
6+ #include <assert.h>
67#include <errno.h>
78#include <fcntl.h>
89#include <signal.h>
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+
2745static size_t page_size ;
2846static 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+
186287int 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