Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at master 134 lines 3.8 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* Copyright (C) 2020 ARM Limited */ 3 4#ifndef _MTE_COMMON_UTIL_H 5#define _MTE_COMMON_UTIL_H 6 7#include <signal.h> 8#include <stdbool.h> 9#include <stdlib.h> 10#include <sys/auxv.h> 11#include <sys/mman.h> 12#include <sys/prctl.h> 13#include "mte_def.h" 14#include "kselftest.h" 15 16enum mte_mem_type { 17 USE_MALLOC, 18 USE_MMAP, 19 USE_MPROTECT, 20}; 21 22enum mte_mode { 23 MTE_NONE_ERR, 24 MTE_SYNC_ERR, 25 MTE_ASYNC_ERR, 26}; 27 28struct mte_fault_cxt { 29 /* Address start which triggers mte tag fault */ 30 unsigned long trig_addr; 31 /* Address range for mte tag fault and negative value means underflow */ 32 ssize_t trig_range; 33 /* siginfo si code */ 34 unsigned long trig_si_code; 35 /* Flag to denote if correct fault caught */ 36 bool fault_valid; 37}; 38 39extern struct mte_fault_cxt cur_mte_cxt; 40extern bool mtefar_support; 41extern bool mtestonly_support; 42 43/* MTE utility functions */ 44void mte_default_handler(int signum, siginfo_t *si, void *uc); 45void mte_register_signal(int signal, void (*handler)(int, siginfo_t *, void *), 46 bool export_tags); 47void mte_wait_after_trig(void); 48void *mte_allocate_memory(size_t size, int mem_type, int mapping, bool tags); 49void *mte_allocate_memory_tag_range(size_t size, int mem_type, int mapping, 50 size_t range_before, size_t range_after); 51void *mte_allocate_file_memory(size_t size, int mem_type, int mapping, 52 bool tags, int fd); 53void *mte_allocate_file_memory_tag_range(size_t size, int mem_type, int mapping, 54 size_t range_before, size_t range_after, int fd); 55void mte_free_memory(void *ptr, size_t size, int mem_type, bool tags); 56void mte_free_memory_tag_range(void *ptr, size_t size, int mem_type, 57 size_t range_before, size_t range_after); 58void *mte_insert_tags(void *ptr, size_t size); 59void mte_clear_tags(void *ptr, size_t size); 60void *mte_insert_atag(void *ptr); 61void *mte_clear_atag(void *ptr); 62int mte_default_setup(void); 63void mte_restore_setup(void); 64int mte_switch_mode(int mte_option, unsigned long incl_mask, bool stonly); 65void mte_initialize_current_context(int mode, uintptr_t ptr, ssize_t range); 66 67/* Common utility functions */ 68int create_temp_file(void); 69 70/* Assembly MTE utility functions */ 71void *mte_insert_random_tag(void *ptr); 72void *mte_insert_new_tag(void *ptr); 73void *mte_get_tag_address(void *ptr); 74void mte_set_tag_address_range(void *ptr, int range); 75void mte_clear_tag_address_range(void *ptr, int range); 76void mte_disable_pstate_tco(void); 77void mte_enable_pstate_tco(void); 78unsigned int mte_get_pstate_tco(void); 79 80/* Test framework static inline functions/macros */ 81static inline void evaluate_test(int err, const char *msg) 82{ 83 switch (err) { 84 case KSFT_PASS: 85 ksft_test_result_pass("%s", msg); 86 break; 87 case KSFT_FAIL: 88 ksft_test_result_fail("%s", msg); 89 break; 90 case KSFT_SKIP: 91 ksft_test_result_skip("%s", msg); 92 break; 93 default: 94 ksft_test_result_error("Unknown return code %d from %s", 95 err, msg); 96 break; 97 } 98} 99 100static inline int check_allocated_memory(void *ptr, size_t size, 101 int mem_type, bool tags) 102{ 103 if (ptr == NULL) { 104 ksft_print_msg("FAIL: memory allocation\n"); 105 return KSFT_FAIL; 106 } 107 108 if (tags && !MT_FETCH_TAG((uintptr_t)ptr)) { 109 ksft_print_msg("FAIL: tag not found at addr(%p)\n", ptr); 110 mte_free_memory((void *)ptr, size, mem_type, false); 111 return KSFT_FAIL; 112 } 113 114 return KSFT_PASS; 115} 116 117static inline int check_allocated_memory_range(void *ptr, size_t size, int mem_type, 118 size_t range_before, size_t range_after) 119{ 120 if (ptr == NULL) { 121 ksft_print_msg("FAIL: memory allocation\n"); 122 return KSFT_FAIL; 123 } 124 125 if (!MT_FETCH_TAG((uintptr_t)ptr)) { 126 ksft_print_msg("FAIL: tag not found at addr(%p)\n", ptr); 127 mte_free_memory_tag_range((void *)ptr, size, mem_type, range_before, 128 range_after); 129 return KSFT_FAIL; 130 } 131 return KSFT_PASS; 132} 133 134#endif /* _MTE_COMMON_UTIL_H */