Path: blob/master/tools/testing/selftests/arm64/mte/check_mmap_options.c
26296 views
// SPDX-License-Identifier: GPL-2.01// Copyright (C) 2020 ARM Limited23#define _GNU_SOURCE45#include <assert.h>6#include <errno.h>7#include <fcntl.h>8#include <signal.h>9#include <stdio.h>10#include <stdlib.h>11#include <string.h>12#include <ucontext.h>13#include <sys/mman.h>14#include <sys/stat.h>15#include <sys/types.h>1617#include "kselftest.h"18#include "mte_common_util.h"19#include "mte_def.h"2021#define RUNS (MT_TAG_COUNT)22#define UNDERFLOW MT_GRANULE_SIZE23#define OVERFLOW MT_GRANULE_SIZE24#define TAG_CHECK_ON 025#define TAG_CHECK_OFF 126#define ATAG_CHECK_ON 127#define ATAG_CHECK_OFF 02829#define TEST_NAME_MAX 2563031enum mte_mem_check_type {32CHECK_ANON_MEM = 0,33CHECK_FILE_MEM = 1,34CHECK_CLEAR_PROT_MTE = 2,35};3637enum mte_tag_op_type {38TAG_OP_ALL = 0,39TAG_OP_STONLY = 1,40};4142struct check_mmap_testcase {43int check_type;44int mem_type;45int mte_sync;46int mapping;47int tag_check;48int atag_check;49int tag_op;50bool enable_tco;51};5253#define TAG_OP_ALL 054#define TAG_OP_STONLY 15556static size_t page_size;57static int sizes[] = {581, 537, 989, 1269, MT_GRANULE_SIZE - 1, MT_GRANULE_SIZE,59/* page size - 1*/ 0, /* page_size */ 0, /* page size + 1 */ 060};6162static int check_mte_memory(char *ptr, int size, int mode,63int tag_check,int atag_check, int tag_op)64{65char buf[MT_GRANULE_SIZE];6667if (!mtefar_support && atag_check == ATAG_CHECK_ON)68return KSFT_SKIP;6970if (atag_check == ATAG_CHECK_ON)71ptr = mte_insert_atag(ptr);7273mte_initialize_current_context(mode, (uintptr_t)ptr, size);74memset(ptr, '1', size);75mte_wait_after_trig();76if (cur_mte_cxt.fault_valid == true)77return KSFT_FAIL;7879mte_initialize_current_context(mode, (uintptr_t)ptr, -UNDERFLOW);80memset(ptr - UNDERFLOW, '2', UNDERFLOW);81mte_wait_after_trig();82if (cur_mte_cxt.fault_valid == false && tag_check == TAG_CHECK_ON)83return KSFT_FAIL;84if (cur_mte_cxt.fault_valid == true && tag_check == TAG_CHECK_OFF)85return KSFT_FAIL;8687mte_initialize_current_context(mode, (uintptr_t)ptr, size + OVERFLOW);88memset(ptr + size, '3', OVERFLOW);89mte_wait_after_trig();90if (cur_mte_cxt.fault_valid == false && tag_check == TAG_CHECK_ON)91return KSFT_FAIL;92if (cur_mte_cxt.fault_valid == true && tag_check == TAG_CHECK_OFF)93return KSFT_FAIL;9495if (tag_op == TAG_OP_STONLY) {96mte_initialize_current_context(mode, (uintptr_t)ptr, -UNDERFLOW);97memcpy(buf, ptr - UNDERFLOW, MT_GRANULE_SIZE);98mte_wait_after_trig();99if (cur_mte_cxt.fault_valid == true)100return KSFT_FAIL;101102mte_initialize_current_context(mode, (uintptr_t)ptr, size + OVERFLOW);103memcpy(buf, ptr + size, MT_GRANULE_SIZE);104mte_wait_after_trig();105if (cur_mte_cxt.fault_valid == true)106return KSFT_FAIL;107}108109return KSFT_PASS;110}111112static int check_anonymous_memory_mapping(int mem_type, int mode, int mapping,113int tag_check, int atag_check, int tag_op)114{115char *ptr, *map_ptr;116int run, result, map_size;117int item = ARRAY_SIZE(sizes);118119if (tag_op == TAG_OP_STONLY && !mtestonly_support)120return KSFT_SKIP;121122mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, tag_op);123for (run = 0; run < item; run++) {124map_size = sizes[run] + OVERFLOW + UNDERFLOW;125map_ptr = (char *)mte_allocate_memory(map_size, mem_type, mapping, false);126if (check_allocated_memory(map_ptr, map_size, mem_type, false) != KSFT_PASS)127return KSFT_FAIL;128129ptr = map_ptr + UNDERFLOW;130mte_initialize_current_context(mode, (uintptr_t)ptr, sizes[run]);131/* Only mte enabled memory will allow tag insertion */132ptr = mte_insert_tags((void *)ptr, sizes[run]);133if (!ptr || cur_mte_cxt.fault_valid == true) {134ksft_print_msg("FAIL: Insert tags on anonymous mmap memory\n");135munmap((void *)map_ptr, map_size);136return KSFT_FAIL;137}138result = check_mte_memory(ptr, sizes[run], mode, tag_check, atag_check, tag_op);139mte_clear_tags((void *)ptr, sizes[run]);140mte_free_memory((void *)map_ptr, map_size, mem_type, false);141if (result != KSFT_PASS)142return result;143}144return KSFT_PASS;145}146147static int check_file_memory_mapping(int mem_type, int mode, int mapping,148int tag_check, int atag_check, int tag_op)149{150char *ptr, *map_ptr;151int run, fd, map_size;152int total = ARRAY_SIZE(sizes);153int result = KSFT_PASS;154155if (tag_op == TAG_OP_STONLY && !mtestonly_support)156return KSFT_SKIP;157158mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, tag_op);159for (run = 0; run < total; run++) {160fd = create_temp_file();161if (fd == -1)162return KSFT_FAIL;163164map_size = sizes[run] + UNDERFLOW + OVERFLOW;165map_ptr = (char *)mte_allocate_file_memory(map_size, mem_type, mapping, false, fd);166if (check_allocated_memory(map_ptr, map_size, mem_type, false) != KSFT_PASS) {167close(fd);168return KSFT_FAIL;169}170ptr = map_ptr + UNDERFLOW;171mte_initialize_current_context(mode, (uintptr_t)ptr, sizes[run]);172/* Only mte enabled memory will allow tag insertion */173ptr = mte_insert_tags((void *)ptr, sizes[run]);174if (!ptr || cur_mte_cxt.fault_valid == true) {175ksft_print_msg("FAIL: Insert tags on file based memory\n");176munmap((void *)map_ptr, map_size);177close(fd);178return KSFT_FAIL;179}180result = check_mte_memory(ptr, sizes[run], mode, tag_check, atag_check, tag_op);181mte_clear_tags((void *)ptr, sizes[run]);182munmap((void *)map_ptr, map_size);183close(fd);184if (result != KSFT_PASS)185return result;186}187return KSFT_PASS;188}189190static int check_clear_prot_mte_flag(int mem_type, int mode, int mapping, int atag_check)191{192char *ptr, *map_ptr;193int run, prot_flag, result, fd, map_size;194int total = ARRAY_SIZE(sizes);195196prot_flag = PROT_READ | PROT_WRITE;197mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, false);198for (run = 0; run < total; run++) {199map_size = sizes[run] + OVERFLOW + UNDERFLOW;200ptr = (char *)mte_allocate_memory_tag_range(sizes[run], mem_type, mapping,201UNDERFLOW, OVERFLOW);202if (check_allocated_memory_range(ptr, sizes[run], mem_type,203UNDERFLOW, OVERFLOW) != KSFT_PASS)204return KSFT_FAIL;205map_ptr = ptr - UNDERFLOW;206/* Try to clear PROT_MTE property and verify it by tag checking */207if (mprotect(map_ptr, map_size, prot_flag)) {208mte_free_memory_tag_range((void *)ptr, sizes[run], mem_type,209UNDERFLOW, OVERFLOW);210ksft_print_msg("FAIL: mprotect not ignoring clear PROT_MTE property\n");211return KSFT_FAIL;212}213result = check_mte_memory(ptr, sizes[run], mode, TAG_CHECK_ON, atag_check, TAG_OP_ALL);214mte_free_memory_tag_range((void *)ptr, sizes[run], mem_type, UNDERFLOW, OVERFLOW);215if (result != KSFT_PASS)216return result;217218fd = create_temp_file();219if (fd == -1)220return KSFT_FAIL;221ptr = (char *)mte_allocate_file_memory_tag_range(sizes[run], mem_type, mapping,222UNDERFLOW, OVERFLOW, fd);223if (check_allocated_memory_range(ptr, sizes[run], mem_type,224UNDERFLOW, OVERFLOW) != KSFT_PASS) {225close(fd);226return KSFT_FAIL;227}228map_ptr = ptr - UNDERFLOW;229/* Try to clear PROT_MTE property and verify it by tag checking */230if (mprotect(map_ptr, map_size, prot_flag)) {231ksft_print_msg("FAIL: mprotect not ignoring clear PROT_MTE property\n");232mte_free_memory_tag_range((void *)ptr, sizes[run], mem_type,233UNDERFLOW, OVERFLOW);234close(fd);235return KSFT_FAIL;236}237result = check_mte_memory(ptr, sizes[run], mode, TAG_CHECK_ON, atag_check, TAG_OP_ALL);238mte_free_memory_tag_range((void *)ptr, sizes[run], mem_type, UNDERFLOW, OVERFLOW);239close(fd);240if (result != KSFT_PASS)241return result;242}243return KSFT_PASS;244}245246const char *format_test_name(struct check_mmap_testcase *tc)247{248static char test_name[TEST_NAME_MAX];249const char *check_type_str;250const char *mem_type_str;251const char *sync_str;252const char *mapping_str;253const char *tag_check_str;254const char *atag_check_str;255const char *tag_op_str;256257switch (tc->check_type) {258case CHECK_ANON_MEM:259check_type_str = "anonymous memory";260break;261case CHECK_FILE_MEM:262check_type_str = "file memory";263break;264case CHECK_CLEAR_PROT_MTE:265check_type_str = "clear PROT_MTE flags";266break;267default:268assert(0);269break;270}271272switch (tc->mem_type) {273case USE_MMAP:274mem_type_str = "mmap";275break;276case USE_MPROTECT:277mem_type_str = "mmap/mprotect";278break;279default:280assert(0);281break;282}283284switch (tc->mte_sync) {285case MTE_NONE_ERR:286sync_str = "no error";287break;288case MTE_SYNC_ERR:289sync_str = "sync error";290break;291case MTE_ASYNC_ERR:292sync_str = "async error";293break;294default:295assert(0);296break;297}298299switch (tc->mapping) {300case MAP_SHARED:301mapping_str = "shared";302break;303case MAP_PRIVATE:304mapping_str = "private";305break;306default:307assert(0);308break;309}310311switch (tc->tag_check) {312case TAG_CHECK_ON:313tag_check_str = "tag check on";314break;315case TAG_CHECK_OFF:316tag_check_str = "tag check off";317break;318default:319assert(0);320break;321}322323switch (tc->atag_check) {324case ATAG_CHECK_ON:325atag_check_str = "with address tag [63:60]";326break;327case ATAG_CHECK_OFF:328atag_check_str = "without address tag [63:60]";329break;330default:331assert(0);332break;333}334335snprintf(test_name, sizeof(test_name),336"Check %s with %s mapping, %s mode, %s memory and %s (%s)\n",337check_type_str, mapping_str, sync_str, mem_type_str,338tag_check_str, atag_check_str);339340switch (tc->tag_op) {341case TAG_OP_ALL:342tag_op_str = "";343break;344case TAG_OP_STONLY:345tag_op_str = " / store-only";346break;347default:348assert(0);349break;350}351352snprintf(test_name, TEST_NAME_MAX,353"Check %s with %s mapping, %s mode, %s memory and %s (%s%s)\n",354check_type_str, mapping_str, sync_str, mem_type_str,355tag_check_str, atag_check_str, tag_op_str);356357return test_name;358}359360int main(int argc, char *argv[])361{362int err, i;363int item = ARRAY_SIZE(sizes);364struct check_mmap_testcase test_cases[]= {365{366.check_type = CHECK_ANON_MEM,367.mem_type = USE_MMAP,368.mte_sync = MTE_SYNC_ERR,369.mapping = MAP_PRIVATE,370.tag_check = TAG_CHECK_OFF,371.atag_check = ATAG_CHECK_OFF,372.tag_op = TAG_OP_ALL,373.enable_tco = true,374},375{376.check_type = CHECK_FILE_MEM,377.mem_type = USE_MPROTECT,378.mte_sync = MTE_SYNC_ERR,379.mapping = MAP_PRIVATE,380.tag_check = TAG_CHECK_OFF,381.atag_check = ATAG_CHECK_OFF,382.tag_op = TAG_OP_ALL,383.enable_tco = true,384},385{386.check_type = CHECK_ANON_MEM,387.mem_type = USE_MMAP,388.mte_sync = MTE_NONE_ERR,389.mapping = MAP_PRIVATE,390.tag_check = TAG_CHECK_OFF,391.atag_check = ATAG_CHECK_OFF,392.tag_op = TAG_OP_ALL,393.enable_tco = false,394},395{396.check_type = CHECK_FILE_MEM,397.mem_type = USE_MPROTECT,398.mte_sync = MTE_NONE_ERR,399.mapping = MAP_PRIVATE,400.tag_check = TAG_CHECK_OFF,401.atag_check = ATAG_CHECK_OFF,402.tag_op = TAG_OP_ALL,403.enable_tco = false,404},405{406.check_type = CHECK_ANON_MEM,407.mem_type = USE_MMAP,408.mte_sync = MTE_SYNC_ERR,409.mapping = MAP_PRIVATE,410.tag_check = TAG_CHECK_ON,411.atag_check = ATAG_CHECK_OFF,412.tag_op = TAG_OP_ALL,413.enable_tco = false,414},415{416.check_type = CHECK_ANON_MEM,417.mem_type = USE_MPROTECT,418.mte_sync = MTE_SYNC_ERR,419.mapping = MAP_PRIVATE,420.tag_check = TAG_CHECK_ON,421.atag_check = ATAG_CHECK_OFF,422.tag_op = TAG_OP_ALL,423.enable_tco = false,424},425{426.check_type = CHECK_ANON_MEM,427.mem_type = USE_MMAP,428.mte_sync = MTE_SYNC_ERR,429.mapping = MAP_SHARED,430.tag_check = TAG_CHECK_ON,431.atag_check = ATAG_CHECK_OFF,432.tag_op = TAG_OP_ALL,433.enable_tco = false,434},435{436.check_type = CHECK_ANON_MEM,437.mem_type = USE_MPROTECT,438.mte_sync = MTE_SYNC_ERR,439.mapping = MAP_SHARED,440.tag_check = TAG_CHECK_ON,441.atag_check = ATAG_CHECK_OFF,442.tag_op = TAG_OP_ALL,443.enable_tco = false,444},445{446.check_type = CHECK_ANON_MEM,447.mem_type = USE_MMAP,448.mte_sync = MTE_ASYNC_ERR,449.mapping = MAP_PRIVATE,450.tag_check = TAG_CHECK_ON,451.atag_check = ATAG_CHECK_OFF,452.tag_op = TAG_OP_ALL,453.enable_tco = false,454},455{456.check_type = CHECK_ANON_MEM,457.mem_type = USE_MPROTECT,458.mte_sync = MTE_ASYNC_ERR,459.mapping = MAP_PRIVATE,460.tag_check = TAG_CHECK_ON,461.atag_check = ATAG_CHECK_OFF,462.tag_op = TAG_OP_ALL,463.enable_tco = false,464},465{466.check_type = CHECK_ANON_MEM,467.mem_type = USE_MMAP,468.mte_sync = MTE_ASYNC_ERR,469.mapping = MAP_SHARED,470.tag_check = TAG_CHECK_ON,471.atag_check = ATAG_CHECK_OFF,472.tag_op = TAG_OP_ALL,473.enable_tco = false,474},475{476.check_type = CHECK_ANON_MEM,477.mem_type = USE_MPROTECT,478.mte_sync = MTE_ASYNC_ERR,479.mapping = MAP_SHARED,480.tag_check = TAG_CHECK_ON,481.atag_check = ATAG_CHECK_OFF,482.tag_op = TAG_OP_ALL,483.enable_tco = false,484},485{486.check_type = CHECK_FILE_MEM,487.mem_type = USE_MMAP,488.mte_sync = MTE_SYNC_ERR,489.mapping = MAP_PRIVATE,490.tag_check = TAG_CHECK_ON,491.atag_check = ATAG_CHECK_OFF,492.tag_op = TAG_OP_ALL,493.enable_tco = false,494},495{496.check_type = CHECK_FILE_MEM,497.mem_type = USE_MPROTECT,498.mte_sync = MTE_SYNC_ERR,499.mapping = MAP_PRIVATE,500.tag_check = TAG_CHECK_ON,501.atag_check = ATAG_CHECK_OFF,502.tag_op = TAG_OP_ALL,503.enable_tco = false,504},505{506.check_type = CHECK_FILE_MEM,507.mem_type = USE_MMAP,508.mte_sync = MTE_SYNC_ERR,509.mapping = MAP_SHARED,510.tag_check = TAG_CHECK_ON,511.atag_check = ATAG_CHECK_OFF,512.tag_op = TAG_OP_ALL,513.enable_tco = false,514},515{516.check_type = CHECK_FILE_MEM,517.mem_type = USE_MPROTECT,518.mte_sync = MTE_SYNC_ERR,519.mapping = MAP_SHARED,520.tag_check = TAG_CHECK_ON,521.atag_check = ATAG_CHECK_OFF,522.tag_op = TAG_OP_ALL,523.enable_tco = false,524},525{526.check_type = CHECK_FILE_MEM,527.mem_type = USE_MMAP,528.mte_sync = MTE_ASYNC_ERR,529.mapping = MAP_PRIVATE,530.tag_check = TAG_CHECK_ON,531.atag_check = ATAG_CHECK_OFF,532.tag_op = TAG_OP_ALL,533.enable_tco = false,534},535{536.check_type = CHECK_FILE_MEM,537.mem_type = USE_MPROTECT,538.mte_sync = MTE_ASYNC_ERR,539.mapping = MAP_PRIVATE,540.tag_check = TAG_CHECK_ON,541.atag_check = ATAG_CHECK_OFF,542.tag_op = TAG_OP_ALL,543.enable_tco = false,544},545{546.check_type = CHECK_FILE_MEM,547.mem_type = USE_MMAP,548.mte_sync = MTE_ASYNC_ERR,549.mapping = MAP_SHARED,550.tag_check = TAG_CHECK_ON,551.atag_check = ATAG_CHECK_OFF,552.tag_op = TAG_OP_ALL,553.enable_tco = false,554},555{556.check_type = CHECK_FILE_MEM,557.mem_type = USE_MPROTECT,558.mte_sync = MTE_ASYNC_ERR,559.mapping = MAP_SHARED,560.tag_check = TAG_CHECK_ON,561.atag_check = ATAG_CHECK_OFF,562.tag_op = TAG_OP_ALL,563.enable_tco = false,564},565{566.check_type = CHECK_CLEAR_PROT_MTE,567.mem_type = USE_MMAP,568.mte_sync = MTE_SYNC_ERR,569.mapping = MAP_PRIVATE,570.tag_check = TAG_CHECK_ON,571.atag_check = ATAG_CHECK_OFF,572.tag_op = TAG_OP_ALL,573.enable_tco = false,574},575{576.check_type = CHECK_CLEAR_PROT_MTE,577.mem_type = USE_MPROTECT,578.mte_sync = MTE_SYNC_ERR,579.mapping = MAP_PRIVATE,580.tag_check = TAG_CHECK_ON,581.atag_check = ATAG_CHECK_OFF,582.tag_op = TAG_OP_ALL,583.enable_tco = false,584},585{586.check_type = CHECK_ANON_MEM,587.mem_type = USE_MMAP,588.mte_sync = MTE_SYNC_ERR,589.mapping = MAP_PRIVATE,590.tag_check = TAG_CHECK_ON,591.atag_check = ATAG_CHECK_ON,592.tag_op = TAG_OP_ALL,593.enable_tco = false,594},595{596.check_type = CHECK_ANON_MEM,597.mem_type = USE_MPROTECT,598.mte_sync = MTE_SYNC_ERR,599.mapping = MAP_PRIVATE,600.tag_check = TAG_CHECK_ON,601.atag_check = ATAG_CHECK_ON,602.tag_op = TAG_OP_ALL,603.enable_tco = false,604},605{606.check_type = CHECK_ANON_MEM,607.mem_type = USE_MMAP,608.mte_sync = MTE_SYNC_ERR,609.mapping = MAP_SHARED,610.tag_check = TAG_CHECK_ON,611.atag_check = ATAG_CHECK_ON,612.tag_op = TAG_OP_ALL,613.enable_tco = false,614},615{616.check_type = CHECK_ANON_MEM,617.mem_type = USE_MPROTECT,618.mte_sync = MTE_SYNC_ERR,619.mapping = MAP_SHARED,620.tag_check = TAG_CHECK_ON,621.atag_check = ATAG_CHECK_ON,622.tag_op = TAG_OP_ALL,623.enable_tco = false,624},625{626.check_type = CHECK_FILE_MEM,627.mem_type = USE_MMAP,628.mte_sync = MTE_SYNC_ERR,629.mapping = MAP_PRIVATE,630.tag_check = TAG_CHECK_ON,631.atag_check = ATAG_CHECK_ON,632.tag_op = TAG_OP_ALL,633.enable_tco = false,634},635{636.check_type = CHECK_FILE_MEM,637.mem_type = USE_MPROTECT,638.mte_sync = MTE_SYNC_ERR,639.mapping = MAP_PRIVATE,640.tag_check = TAG_CHECK_ON,641.atag_check = ATAG_CHECK_ON,642.tag_op = TAG_OP_ALL,643.enable_tco = false,644},645{646.check_type = CHECK_FILE_MEM,647.mem_type = USE_MMAP,648.mte_sync = MTE_SYNC_ERR,649.mapping = MAP_SHARED,650.tag_check = TAG_CHECK_ON,651.atag_check = ATAG_CHECK_ON,652.tag_op = TAG_OP_ALL,653.enable_tco = false,654},655{656.check_type = CHECK_FILE_MEM,657.mem_type = USE_MPROTECT,658.mte_sync = MTE_SYNC_ERR,659.mapping = MAP_SHARED,660.tag_check = TAG_CHECK_ON,661.atag_check = ATAG_CHECK_ON,662.tag_op = TAG_OP_ALL,663.enable_tco = false,664},665{666.check_type = CHECK_FILE_MEM,667.mem_type = USE_MMAP,668.mte_sync = MTE_ASYNC_ERR,669.mapping = MAP_PRIVATE,670.tag_check = TAG_CHECK_ON,671.atag_check = ATAG_CHECK_ON,672.tag_op = TAG_OP_ALL,673.enable_tco = false,674},675{676.check_type = CHECK_ANON_MEM,677.mem_type = USE_MMAP,678.mte_sync = MTE_SYNC_ERR,679.mapping = MAP_PRIVATE,680.tag_check = TAG_CHECK_ON,681.atag_check = ATAG_CHECK_OFF,682.tag_op = TAG_OP_STONLY,683.enable_tco = false,684},685{686.check_type = CHECK_ANON_MEM,687.mem_type = USE_MPROTECT,688.mte_sync = MTE_SYNC_ERR,689.mapping = MAP_PRIVATE,690.tag_check = TAG_CHECK_ON,691.atag_check = ATAG_CHECK_OFF,692.tag_op = TAG_OP_STONLY,693.enable_tco = false,694},695{696.check_type = CHECK_ANON_MEM,697.mem_type = USE_MMAP,698.mte_sync = MTE_SYNC_ERR,699.mapping = MAP_SHARED,700.tag_check = TAG_CHECK_ON,701.atag_check = ATAG_CHECK_OFF,702.tag_op = TAG_OP_STONLY,703.enable_tco = false,704},705{706.check_type = CHECK_ANON_MEM,707.mem_type = USE_MPROTECT,708.mte_sync = MTE_SYNC_ERR,709.mapping = MAP_SHARED,710.tag_check = TAG_CHECK_ON,711.atag_check = ATAG_CHECK_OFF,712.tag_op = TAG_OP_STONLY,713.enable_tco = false,714},715{716.check_type = CHECK_ANON_MEM,717.mem_type = USE_MMAP,718.mte_sync = MTE_ASYNC_ERR,719.mapping = MAP_PRIVATE,720.tag_check = TAG_CHECK_ON,721.atag_check = ATAG_CHECK_OFF,722.tag_op = TAG_OP_STONLY,723.enable_tco = false,724},725{726.check_type = CHECK_ANON_MEM,727.mem_type = USE_MPROTECT,728.mte_sync = MTE_ASYNC_ERR,729.mapping = MAP_PRIVATE,730.tag_check = TAG_CHECK_ON,731.atag_check = ATAG_CHECK_OFF,732.tag_op = TAG_OP_STONLY,733.enable_tco = false,734},735{736.check_type = CHECK_ANON_MEM,737.mem_type = USE_MMAP,738.mte_sync = MTE_ASYNC_ERR,739.mapping = MAP_SHARED,740.tag_check = TAG_CHECK_ON,741.atag_check = ATAG_CHECK_OFF,742.tag_op = TAG_OP_STONLY,743.enable_tco = false,744},745{746.check_type = CHECK_ANON_MEM,747.mem_type = USE_MPROTECT,748.mte_sync = MTE_ASYNC_ERR,749.mapping = MAP_SHARED,750.tag_check = TAG_CHECK_ON,751.atag_check = ATAG_CHECK_OFF,752.tag_op = TAG_OP_STONLY,753.enable_tco = false,754},755{756.check_type = CHECK_FILE_MEM,757.mem_type = USE_MMAP,758.mte_sync = MTE_SYNC_ERR,759.mapping = MAP_PRIVATE,760.tag_check = TAG_CHECK_ON,761.atag_check = ATAG_CHECK_OFF,762.tag_op = TAG_OP_STONLY,763.enable_tco = false,764},765{766.check_type = CHECK_FILE_MEM,767.mem_type = USE_MPROTECT,768.mte_sync = MTE_SYNC_ERR,769.mapping = MAP_PRIVATE,770.tag_check = TAG_CHECK_ON,771.atag_check = ATAG_CHECK_OFF,772.tag_op = TAG_OP_STONLY,773.enable_tco = false,774},775{776.check_type = CHECK_FILE_MEM,777.mem_type = USE_MMAP,778.mte_sync = MTE_SYNC_ERR,779.mapping = MAP_SHARED,780.tag_check = TAG_CHECK_ON,781.atag_check = ATAG_CHECK_OFF,782.tag_op = TAG_OP_STONLY,783.enable_tco = false,784},785{786.check_type = CHECK_FILE_MEM,787.mem_type = USE_MPROTECT,788.mte_sync = MTE_SYNC_ERR,789.mapping = MAP_SHARED,790.tag_check = TAG_CHECK_ON,791.atag_check = ATAG_CHECK_OFF,792.tag_op = TAG_OP_STONLY,793.enable_tco = false,794},795{796.check_type = CHECK_FILE_MEM,797.mem_type = USE_MMAP,798.mte_sync = MTE_ASYNC_ERR,799.mapping = MAP_PRIVATE,800.tag_check = TAG_CHECK_ON,801.atag_check = ATAG_CHECK_OFF,802.tag_op = TAG_OP_STONLY,803.enable_tco = false,804},805{806.check_type = CHECK_FILE_MEM,807.mem_type = USE_MPROTECT,808.mte_sync = MTE_ASYNC_ERR,809.mapping = MAP_PRIVATE,810.tag_check = TAG_CHECK_ON,811.atag_check = ATAG_CHECK_OFF,812.tag_op = TAG_OP_STONLY,813.enable_tco = false,814},815{816.check_type = CHECK_FILE_MEM,817.mem_type = USE_MMAP,818.mte_sync = MTE_ASYNC_ERR,819.mapping = MAP_SHARED,820.tag_check = TAG_CHECK_ON,821.atag_check = ATAG_CHECK_OFF,822.tag_op = TAG_OP_STONLY,823.enable_tco = false,824},825{826.check_type = CHECK_FILE_MEM,827.mem_type = USE_MPROTECT,828.mte_sync = MTE_ASYNC_ERR,829.mapping = MAP_SHARED,830.tag_check = TAG_CHECK_ON,831.atag_check = ATAG_CHECK_OFF,832.tag_op = TAG_OP_STONLY,833.enable_tco = false,834},835{836.check_type = CHECK_ANON_MEM,837.mem_type = USE_MMAP,838.mte_sync = MTE_SYNC_ERR,839.mapping = MAP_PRIVATE,840.tag_check = TAG_CHECK_ON,841.atag_check = ATAG_CHECK_ON,842.tag_op = TAG_OP_STONLY,843.enable_tco = false,844},845{846.check_type = CHECK_ANON_MEM,847.mem_type = USE_MPROTECT,848.mte_sync = MTE_SYNC_ERR,849.mapping = MAP_PRIVATE,850.tag_check = TAG_CHECK_ON,851.atag_check = ATAG_CHECK_ON,852.tag_op = TAG_OP_STONLY,853.enable_tco = false,854},855{856.check_type = CHECK_ANON_MEM,857.mem_type = USE_MMAP,858.mte_sync = MTE_SYNC_ERR,859.mapping = MAP_SHARED,860.tag_check = TAG_CHECK_ON,861.atag_check = ATAG_CHECK_ON,862.tag_op = TAG_OP_STONLY,863.enable_tco = false,864},865{866.check_type = CHECK_ANON_MEM,867.mem_type = USE_MPROTECT,868.mte_sync = MTE_SYNC_ERR,869.mapping = MAP_SHARED,870.tag_check = TAG_CHECK_ON,871.atag_check = ATAG_CHECK_ON,872.tag_op = TAG_OP_STONLY,873.enable_tco = false,874},875{876.check_type = CHECK_FILE_MEM,877.mem_type = USE_MMAP,878.mte_sync = MTE_SYNC_ERR,879.mapping = MAP_PRIVATE,880.tag_check = TAG_CHECK_ON,881.atag_check = ATAG_CHECK_ON,882.tag_op = TAG_OP_STONLY,883.enable_tco = false,884},885{886.check_type = CHECK_FILE_MEM,887.mem_type = USE_MPROTECT,888.mte_sync = MTE_SYNC_ERR,889.mapping = MAP_PRIVATE,890.tag_check = TAG_CHECK_ON,891.atag_check = ATAG_CHECK_ON,892.tag_op = TAG_OP_STONLY,893.enable_tco = false,894},895{896.check_type = CHECK_FILE_MEM,897.mem_type = USE_MMAP,898.mte_sync = MTE_SYNC_ERR,899.mapping = MAP_SHARED,900.tag_check = TAG_CHECK_ON,901.atag_check = ATAG_CHECK_ON,902.tag_op = TAG_OP_STONLY,903.enable_tco = false,904},905{906.check_type = CHECK_FILE_MEM,907.mem_type = USE_MPROTECT,908.mte_sync = MTE_SYNC_ERR,909.mapping = MAP_SHARED,910.tag_check = TAG_CHECK_ON,911.atag_check = ATAG_CHECK_ON,912.tag_op = TAG_OP_STONLY,913.enable_tco = false,914},915{916.check_type = CHECK_FILE_MEM,917.mem_type = USE_MMAP,918.mte_sync = MTE_ASYNC_ERR,919.mapping = MAP_PRIVATE,920.tag_check = TAG_CHECK_ON,921.atag_check = ATAG_CHECK_ON,922.tag_op = TAG_OP_STONLY,923.enable_tco = false,924},925{926.check_type = CHECK_CLEAR_PROT_MTE,927.mem_type = USE_MMAP,928.mte_sync = MTE_SYNC_ERR,929.mapping = MAP_PRIVATE,930.tag_check = TAG_CHECK_ON,931.atag_check = ATAG_CHECK_ON,932.tag_op = TAG_OP_ALL,933.enable_tco = false,934},935{936.check_type = CHECK_CLEAR_PROT_MTE,937.mem_type = USE_MPROTECT,938.mte_sync = MTE_SYNC_ERR,939.mapping = MAP_PRIVATE,940.tag_check = TAG_CHECK_ON,941.atag_check = ATAG_CHECK_ON,942.tag_op = TAG_OP_ALL,943.enable_tco = false,944},945};946947err = mte_default_setup();948if (err)949return err;950page_size = getpagesize();951if (!page_size) {952ksft_print_msg("ERR: Unable to get page size\n");953return KSFT_FAIL;954}955sizes[item - 3] = page_size - 1;956sizes[item - 2] = page_size;957sizes[item - 1] = page_size + 1;958959/* Set test plan */960ksft_set_plan(ARRAY_SIZE(test_cases));961962for (i = 0 ; i < ARRAY_SIZE(test_cases); i++) {963/* Register signal handlers */964mte_register_signal(SIGBUS, mte_default_handler,965test_cases[i].atag_check == ATAG_CHECK_ON);966mte_register_signal(SIGSEGV, mte_default_handler,967test_cases[i].atag_check == ATAG_CHECK_ON);968969if (test_cases[i].enable_tco)970mte_enable_pstate_tco();971else972mte_disable_pstate_tco();973974switch (test_cases[i].check_type) {975case CHECK_ANON_MEM:976evaluate_test(check_anonymous_memory_mapping(test_cases[i].mem_type,977test_cases[i].mte_sync,978test_cases[i].mapping,979test_cases[i].tag_check,980test_cases[i].atag_check,981test_cases[i].tag_op),982format_test_name(&test_cases[i]));983break;984case CHECK_FILE_MEM:985evaluate_test(check_file_memory_mapping(test_cases[i].mem_type,986test_cases[i].mte_sync,987test_cases[i].mapping,988test_cases[i].tag_check,989test_cases[i].atag_check,990test_cases[i].tag_op),991format_test_name(&test_cases[i]));992break;993case CHECK_CLEAR_PROT_MTE:994evaluate_test(check_clear_prot_mte_flag(test_cases[i].mem_type,995test_cases[i].mte_sync,996test_cases[i].mapping,997test_cases[i].atag_check),998format_test_name(&test_cases[i]));999break;1000default:1001exit(KSFT_FAIL);1002}1003}10041005mte_restore_setup();1006ksft_print_cnts();1007return ksft_get_fail_cnt() == 0 ? KSFT_PASS : KSFT_FAIL;1008}100910101011