3
3
4
4
#define _GNU_SOURCE
5
5
6
+ #include <assert.h>
6
7
#include <errno.h>
7
8
#include <fcntl.h>
8
9
#include <signal.h>
24
25
#define TAG_CHECK_ON 0
25
26
#define TAG_CHECK_OFF 1
26
27
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
+
27
45
static size_t page_size ;
28
46
static int sizes [] = {
29
47
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)
183
201
return KSFT_PASS ;
184
202
}
185
203
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
+
186
287
int main (int argc , char * argv [])
187
288
{
188
- int err ;
289
+ int err , i ;
189
290
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
+ };
190
469
191
470
err = mte_default_setup ();
192
471
if (err )
@@ -205,59 +484,39 @@ int main(int argc, char *argv[])
205
484
mte_register_signal (SIGSEGV , mte_default_handler , false);
206
485
207
486
/* 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
+ }
261
520
262
521
mte_restore_setup ();
263
522
ksft_print_cnts ();
0 commit comments