Linux 6.14-rc1
[linux.git] / include / linux / kmsan-checks.h
blobe1082dc40abc2ccd6b3ddab91c9f462b3f4725a1
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3 * KMSAN checks to be used for one-off annotations in subsystems.
5 * Copyright (C) 2017-2022 Google LLC
6 * Author: Alexander Potapenko <glider@google.com>
8 */
10 #ifndef _LINUX_KMSAN_CHECKS_H
11 #define _LINUX_KMSAN_CHECKS_H
13 #include <linux/types.h>
15 #ifdef CONFIG_KMSAN
17 /**
18 * kmsan_poison_memory() - Mark the memory range as uninitialized.
19 * @address: address to start with.
20 * @size: size of buffer to poison.
21 * @flags: GFP flags for allocations done by this function.
23 * Until other data is written to this range, KMSAN will treat it as
24 * uninitialized. Error reports for this memory will reference the call site of
25 * kmsan_poison_memory() as origin.
27 void kmsan_poison_memory(const void *address, size_t size, gfp_t flags);
29 /**
30 * kmsan_unpoison_memory() - Mark the memory range as initialized.
31 * @address: address to start with.
32 * @size: size of buffer to unpoison.
34 * Until other data is written to this range, KMSAN will treat it as
35 * initialized.
37 void kmsan_unpoison_memory(const void *address, size_t size);
39 /**
40 * kmsan_check_memory() - Check the memory range for being initialized.
41 * @address: address to start with.
42 * @size: size of buffer to check.
44 * If any piece of the given range is marked as uninitialized, KMSAN will report
45 * an error.
47 void kmsan_check_memory(const void *address, size_t size);
49 /**
50 * kmsan_copy_to_user() - Notify KMSAN about a data transfer to userspace.
51 * @to: destination address in the userspace.
52 * @from: source address in the kernel.
53 * @to_copy: number of bytes to copy.
54 * @left: number of bytes not copied.
56 * If this is a real userspace data transfer, KMSAN checks the bytes that were
57 * actually copied to ensure there was no information leak. If @to belongs to
58 * the kernel space (which is possible for compat syscalls), KMSAN just copies
59 * the metadata.
61 void kmsan_copy_to_user(void __user *to, const void *from, size_t to_copy,
62 size_t left);
64 /**
65 * kmsan_memmove() - Notify KMSAN about a data copy within kernel.
66 * @to: destination address in the kernel.
67 * @from: source address in the kernel.
68 * @size: number of bytes to copy.
70 * Invoked after non-instrumented version (e.g. implemented using assembly
71 * code) of memmove()/memcpy() is called, in order to copy KMSAN's metadata.
73 void kmsan_memmove(void *to, const void *from, size_t to_copy);
75 #else
77 static inline void kmsan_poison_memory(const void *address, size_t size,
78 gfp_t flags)
81 static inline void kmsan_unpoison_memory(const void *address, size_t size)
84 static inline void kmsan_check_memory(const void *address, size_t size)
87 static inline void kmsan_copy_to_user(void __user *to, const void *from,
88 size_t to_copy, size_t left)
92 static inline void kmsan_memmove(void *to, const void *from, size_t to_copy)
96 #endif
98 #endif /* _LINUX_KMSAN_CHECKS_H */