]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blame - include/linux/instrumented.h
Merge existing fixes from spi/for-5.10
[mirror_ubuntu-hirsute-kernel.git] / include / linux / instrumented.h
CommitLineData
36e4d4dd
ME
1/* SPDX-License-Identifier: GPL-2.0 */
2
3/*
4 * This header provides generic wrappers for memory access instrumentation that
5 * the compiler cannot emit for: KASAN, KCSAN.
6 */
7#ifndef _LINUX_INSTRUMENTED_H
8#define _LINUX_INSTRUMENTED_H
9
10#include <linux/compiler.h>
11#include <linux/kasan-checks.h>
12#include <linux/kcsan-checks.h>
13#include <linux/types.h>
14
15/**
16 * instrument_read - instrument regular read access
17 *
18 * Instrument a regular read access. The instrumentation should be inserted
19 * before the actual read happens.
20 *
21 * @ptr address of access
22 * @size size of access
23 */
24static __always_inline void instrument_read(const volatile void *v, size_t size)
25{
26 kasan_check_read(v, size);
27 kcsan_check_read(v, size);
28}
29
30/**
31 * instrument_write - instrument regular write access
32 *
33 * Instrument a regular write access. The instrumentation should be inserted
34 * before the actual write happens.
35 *
36 * @ptr address of access
37 * @size size of access
38 */
39static __always_inline void instrument_write(const volatile void *v, size_t size)
40{
41 kasan_check_write(v, size);
42 kcsan_check_write(v, size);
43}
44
00047c2e
ME
45/**
46 * instrument_read_write - instrument regular read-write access
47 *
48 * Instrument a regular write access. The instrumentation should be inserted
49 * before the actual write happens.
50 *
51 * @ptr address of access
52 * @size size of access
53 */
54static __always_inline void instrument_read_write(const volatile void *v, size_t size)
55{
56 kasan_check_write(v, size);
57 kcsan_check_read_write(v, size);
58}
59
36e4d4dd
ME
60/**
61 * instrument_atomic_read - instrument atomic read access
62 *
63 * Instrument an atomic read access. The instrumentation should be inserted
64 * before the actual read happens.
65 *
66 * @ptr address of access
67 * @size size of access
68 */
69static __always_inline void instrument_atomic_read(const volatile void *v, size_t size)
70{
71 kasan_check_read(v, size);
72 kcsan_check_atomic_read(v, size);
73}
74
75/**
76 * instrument_atomic_write - instrument atomic write access
77 *
78 * Instrument an atomic write access. The instrumentation should be inserted
79 * before the actual write happens.
80 *
81 * @ptr address of access
82 * @size size of access
83 */
84static __always_inline void instrument_atomic_write(const volatile void *v, size_t size)
85{
86 kasan_check_write(v, size);
87 kcsan_check_atomic_write(v, size);
88}
89
00047c2e
ME
90/**
91 * instrument_atomic_read_write - instrument atomic read-write access
92 *
93 * Instrument an atomic read-write access. The instrumentation should be
94 * inserted before the actual write happens.
95 *
96 * @ptr address of access
97 * @size size of access
98 */
99static __always_inline void instrument_atomic_read_write(const volatile void *v, size_t size)
100{
101 kasan_check_write(v, size);
102 kcsan_check_atomic_read_write(v, size);
103}
104
36e4d4dd
ME
105/**
106 * instrument_copy_to_user - instrument reads of copy_to_user
107 *
108 * Instrument reads from kernel memory, that are due to copy_to_user (and
109 * variants). The instrumentation must be inserted before the accesses.
110 *
111 * @to destination address
112 * @from source address
113 * @n number of bytes to copy
114 */
115static __always_inline void
116instrument_copy_to_user(void __user *to, const void *from, unsigned long n)
117{
118 kasan_check_read(from, n);
119 kcsan_check_read(from, n);
120}
121
122/**
123 * instrument_copy_from_user - instrument writes of copy_from_user
124 *
125 * Instrument writes to kernel memory, that are due to copy_from_user (and
126 * variants). The instrumentation should be inserted before the accesses.
127 *
128 * @to destination address
129 * @from source address
130 * @n number of bytes to copy
131 */
132static __always_inline void
133instrument_copy_from_user(const void *to, const void __user *from, unsigned long n)
134{
135 kasan_check_write(to, n);
136 kcsan_check_write(to, n);
137}
138
139#endif /* _LINUX_INSTRUMENTED_H */