Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/testing/selftests/arm64/mte/mte_common_util.h
26296 views
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
16
enum mte_mem_type {
17
USE_MALLOC,
18
USE_MMAP,
19
USE_MPROTECT,
20
};
21
22
enum mte_mode {
23
MTE_NONE_ERR,
24
MTE_SYNC_ERR,
25
MTE_ASYNC_ERR,
26
};
27
28
struct 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
39
extern struct mte_fault_cxt cur_mte_cxt;
40
extern bool mtefar_support;
41
extern bool mtestonly_support;
42
43
/* MTE utility functions */
44
void mte_default_handler(int signum, siginfo_t *si, void *uc);
45
void mte_register_signal(int signal, void (*handler)(int, siginfo_t *, void *),
46
bool export_tags);
47
void mte_wait_after_trig(void);
48
void *mte_allocate_memory(size_t size, int mem_type, int mapping, bool tags);
49
void *mte_allocate_memory_tag_range(size_t size, int mem_type, int mapping,
50
size_t range_before, size_t range_after);
51
void *mte_allocate_file_memory(size_t size, int mem_type, int mapping,
52
bool tags, int fd);
53
void *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);
55
void mte_free_memory(void *ptr, size_t size, int mem_type, bool tags);
56
void mte_free_memory_tag_range(void *ptr, size_t size, int mem_type,
57
size_t range_before, size_t range_after);
58
void *mte_insert_tags(void *ptr, size_t size);
59
void mte_clear_tags(void *ptr, size_t size);
60
void *mte_insert_atag(void *ptr);
61
void *mte_clear_atag(void *ptr);
62
int mte_default_setup(void);
63
void mte_restore_setup(void);
64
int mte_switch_mode(int mte_option, unsigned long incl_mask, bool stonly);
65
void mte_initialize_current_context(int mode, uintptr_t ptr, ssize_t range);
66
67
/* Common utility functions */
68
int create_temp_file(void);
69
70
/* Assembly MTE utility functions */
71
void *mte_insert_random_tag(void *ptr);
72
void *mte_insert_new_tag(void *ptr);
73
void *mte_get_tag_address(void *ptr);
74
void mte_set_tag_address_range(void *ptr, int range);
75
void mte_clear_tag_address_range(void *ptr, int range);
76
void mte_disable_pstate_tco(void);
77
void mte_enable_pstate_tco(void);
78
unsigned int mte_get_pstate_tco(void);
79
80
/* Test framework static inline functions/macros */
81
static 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
100
static 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
117
static 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 */
135
136