Path: blob/main/contrib/arm-optimized-routines/string/test/mte.h
39534 views
/*1* Memory tagging testing code.2*3* Copyright (c) 2020, Arm Limited.4* SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception5*/67#ifndef __TEST_MTE_H8#define __TEST_MTE_H910#include <stdlib.h>1112#if __ARM_FEATURE_MEMORY_TAGGING && WANT_MTE_TEST13#include <arm_acle.h>14#include <sys/mman.h>15#include <sys/prctl.h>1617// These depend on a not yet merged kernel ABI.18#define PR_SET_TAGGED_ADDR_CTRL 5519#define PR_TAGGED_ADDR_ENABLE (1UL << 0)20#define PR_MTE_TCF_SHIFT 121#define PR_MTE_TCF_SYNC (1UL << PR_MTE_TCF_SHIFT)22#define PR_MTE_TAG_SHIFT 323#define PROT_MTE 0x202425#define MTE_GRANULE_SIZE 162627int28mte_enabled ()29{30static int enabled = -1;31if (enabled == -1)32{33int res = prctl (PR_SET_TAGGED_ADDR_CTRL,34PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_SYNC35| (0xfffe << PR_MTE_TAG_SHIFT),360, 0, 0);37enabled = (res == 0);38}39return enabled;40}4142static void *43mte_mmap (size_t size)44{45if (mte_enabled ())46{47return mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_MTE,48MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);49}50else51{52return malloc (size);53}54}5556void *57alignup_mte (void *p)58{59return (void *) (((uintptr_t) p + MTE_GRANULE_SIZE - 1)60& ~(MTE_GRANULE_SIZE - 1));61}6263void *64aligndown_mte (void *p)65{66return (void *) ((uintptr_t) p & ~(MTE_GRANULE_SIZE - 1));67}6869void *70untag_pointer (void *p)71{72return (void *) ((unsigned long long) p & (~0ULL >> 8));73}7475void76tag_buffer_helper (void *p, int len)77{78char *ptr = p;79char *end = alignup_mte (ptr + len);80ptr = aligndown_mte (p);81for (; ptr < end; ptr += MTE_GRANULE_SIZE)82{83__arm_mte_set_tag (ptr);84}85}8687void *88tag_buffer (void *p, int len, int test_mte)89{90if (test_mte && mte_enabled ())91{92p = __arm_mte_increment_tag (p, 1);93tag_buffer_helper (p, len);94}95return p;96}9798void *99untag_buffer (void *p, int len, int test_mte)100{101p = untag_pointer (p);102if (test_mte && mte_enabled ())103{104tag_buffer_helper (p, len);105}106return p;107}108109#else // __ARM_FEATURE_MEMORY_TAGGING110int111mte_enabled ()112{113return 0;114}115static void *116mte_mmap (size_t size)117{118return malloc (size);119}120void *121tag_buffer (void *p, int len, int test_mte)122{123(void) len;124(void) test_mte;125return p;126}127void *128untag_buffer (void *p, int len, int test_mte)129{130(void) len;131(void) test_mte;132return p;133}134void *135untag_pointer (void *p)136{137return p;138}139#endif // __ARM_FEATURE_MEMORY_TAGGING140141#endif142143144