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