master
h 64 lines 1.54 KB
Raw
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_STORE_ONLY
24 # define PR_MTE_STORE_ONLY (1UL << 19)
25 #endif
26 #ifndef PR_MTE_TCF_SHIFT
27 # define PR_MTE_TCF_SHIFT 1
28 # define PR_MTE_TCF_NONE (0UL << PR_MTE_TCF_SHIFT)
29 # define PR_MTE_TCF_SYNC (1UL << PR_MTE_TCF_SHIFT)
30 # define PR_MTE_TCF_ASYNC (2UL << PR_MTE_TCF_SHIFT)
31 # define PR_MTE_TAG_SHIFT 3
32 #endif
33
34 #ifndef PROT_MTE
35 # define PROT_MTE 0x20
36 #endif
37
38 #ifndef SEGV_MTEAERR
39 # define SEGV_MTEAERR 8
40 # define SEGV_MTESERR 9
41 #endif
42
43 static void enable_mte(int flags)
44 {
45 int r = prctl(PR_SET_TAGGED_ADDR_CTRL,
46 PR_TAGGED_ADDR_ENABLE | flags | (0xfffe << PR_MTE_TAG_SHIFT),
47 0, 0, 0);
48 if (r < 0) {
49 perror("PR_SET_TAGGED_ADDR_CTRL");
50 exit(2);
51 }
52 }
53
54 static void * alloc_mte_mem(size_t size) __attribute__((unused));
55 static void * alloc_mte_mem(size_t size)
56 {
57 void *p = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_MTE,
58 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
59 if (p == MAP_FAILED) {
60 perror("mmap PROT_MTE");
61 exit(2);
62 }
63 return p;
64 }