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