mte.h (1494B)
1/* 2 * Linux kernel fallback API definitions for MTE and test helpers. 3 * 4 * Copyright (c) 2021 Linaro Ltd 5 * SPDX-License-Identifier: GPL-2.0-or-later 6 */ 7 8#include <assert.h> 9#include <string.h> 10#include <stdlib.h> 11#include <stdio.h> 12#include <unistd.h> 13#include <signal.h> 14#include <sys/mman.h> 15#include <sys/prctl.h> 16 17#ifndef PR_SET_TAGGED_ADDR_CTRL 18# define PR_SET_TAGGED_ADDR_CTRL 55 19#endif 20#ifndef PR_TAGGED_ADDR_ENABLE 21# define PR_TAGGED_ADDR_ENABLE (1UL << 0) 22#endif 23#ifndef PR_MTE_TCF_SHIFT 24# define PR_MTE_TCF_SHIFT 1 25# define PR_MTE_TCF_NONE (0UL << PR_MTE_TCF_SHIFT) 26# define PR_MTE_TCF_SYNC (1UL << PR_MTE_TCF_SHIFT) 27# define PR_MTE_TCF_ASYNC (2UL << PR_MTE_TCF_SHIFT) 28# define PR_MTE_TAG_SHIFT 3 29#endif 30 31#ifndef PROT_MTE 32# define PROT_MTE 0x20 33#endif 34 35#ifndef SEGV_MTEAERR 36# define SEGV_MTEAERR 8 37# define SEGV_MTESERR 9 38#endif 39 40static void enable_mte(int tcf) 41{ 42 int r = prctl(PR_SET_TAGGED_ADDR_CTRL, 43 PR_TAGGED_ADDR_ENABLE | tcf | (0xfffe << PR_MTE_TAG_SHIFT), 44 0, 0, 0); 45 if (r < 0) { 46 perror("PR_SET_TAGGED_ADDR_CTRL"); 47 exit(2); 48 } 49} 50 51static void * alloc_mte_mem(size_t size) __attribute__((unused)); 52static void * alloc_mte_mem(size_t size) 53{ 54 void *p = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_MTE, 55 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 56 if (p == MAP_FAILED) { 57 perror("mmap PROT_MTE"); 58 exit(2); 59 } 60 return p; 61}