mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.6 KiB
139 lines
3.6 KiB
/* SPDX-License-Identifier: GPL-2.0 */ |
|
|
|
/* |
|
* This header provides generic wrappers for memory access instrumentation that |
|
* the compiler cannot emit for: KASAN, KCSAN. |
|
*/ |
|
#ifndef _LINUX_INSTRUMENTED_H |
|
#define _LINUX_INSTRUMENTED_H |
|
|
|
#include <linux/compiler.h> |
|
#include <linux/kasan-checks.h> |
|
#include <linux/kcsan-checks.h> |
|
#include <linux/types.h> |
|
|
|
/** |
|
* instrument_read - instrument regular read access |
|
* |
|
* Instrument a regular read access. The instrumentation should be inserted |
|
* before the actual read happens. |
|
* |
|
* @ptr address of access |
|
* @size size of access |
|
*/ |
|
static __always_inline void instrument_read(const volatile void *v, size_t size) |
|
{ |
|
kasan_check_read(v, size); |
|
kcsan_check_read(v, size); |
|
} |
|
|
|
/** |
|
* instrument_write - instrument regular write access |
|
* |
|
* Instrument a regular write access. The instrumentation should be inserted |
|
* before the actual write happens. |
|
* |
|
* @ptr address of access |
|
* @size size of access |
|
*/ |
|
static __always_inline void instrument_write(const volatile void *v, size_t size) |
|
{ |
|
kasan_check_write(v, size); |
|
kcsan_check_write(v, size); |
|
} |
|
|
|
/** |
|
* instrument_read_write - instrument regular read-write access |
|
* |
|
* Instrument a regular write access. The instrumentation should be inserted |
|
* before the actual write happens. |
|
* |
|
* @ptr address of access |
|
* @size size of access |
|
*/ |
|
static __always_inline void instrument_read_write(const volatile void *v, size_t size) |
|
{ |
|
kasan_check_write(v, size); |
|
kcsan_check_read_write(v, size); |
|
} |
|
|
|
/** |
|
* instrument_atomic_read - instrument atomic read access |
|
* |
|
* Instrument an atomic read access. The instrumentation should be inserted |
|
* before the actual read happens. |
|
* |
|
* @ptr address of access |
|
* @size size of access |
|
*/ |
|
static __always_inline void instrument_atomic_read(const volatile void *v, size_t size) |
|
{ |
|
kasan_check_read(v, size); |
|
kcsan_check_atomic_read(v, size); |
|
} |
|
|
|
/** |
|
* instrument_atomic_write - instrument atomic write access |
|
* |
|
* Instrument an atomic write access. The instrumentation should be inserted |
|
* before the actual write happens. |
|
* |
|
* @ptr address of access |
|
* @size size of access |
|
*/ |
|
static __always_inline void instrument_atomic_write(const volatile void *v, size_t size) |
|
{ |
|
kasan_check_write(v, size); |
|
kcsan_check_atomic_write(v, size); |
|
} |
|
|
|
/** |
|
* instrument_atomic_read_write - instrument atomic read-write access |
|
* |
|
* Instrument an atomic read-write access. The instrumentation should be |
|
* inserted before the actual write happens. |
|
* |
|
* @ptr address of access |
|
* @size size of access |
|
*/ |
|
static __always_inline void instrument_atomic_read_write(const volatile void *v, size_t size) |
|
{ |
|
kasan_check_write(v, size); |
|
kcsan_check_atomic_read_write(v, size); |
|
} |
|
|
|
/** |
|
* instrument_copy_to_user - instrument reads of copy_to_user |
|
* |
|
* Instrument reads from kernel memory, that are due to copy_to_user (and |
|
* variants). The instrumentation must be inserted before the accesses. |
|
* |
|
* @to destination address |
|
* @from source address |
|
* @n number of bytes to copy |
|
*/ |
|
static __always_inline void |
|
instrument_copy_to_user(void __user *to, const void *from, unsigned long n) |
|
{ |
|
kasan_check_read(from, n); |
|
kcsan_check_read(from, n); |
|
} |
|
|
|
/** |
|
* instrument_copy_from_user - instrument writes of copy_from_user |
|
* |
|
* Instrument writes to kernel memory, that are due to copy_from_user (and |
|
* variants). The instrumentation should be inserted before the accesses. |
|
* |
|
* @to destination address |
|
* @from source address |
|
* @n number of bytes to copy |
|
*/ |
|
static __always_inline void |
|
instrument_copy_from_user(const void *to, const void __user *from, unsigned long n) |
|
{ |
|
kasan_check_write(to, n); |
|
kcsan_check_write(to, n); |
|
} |
|
|
|
#endif /* _LINUX_INSTRUMENTED_H */
|
|
|