1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * KMSAN checks to be used for one-off annotations in subsystems.
4  *
5  * Copyright (C) 2017-2022 Google LLC
6  * Author: Alexander Potapenko <glider@google.com>
7  *
8  */
9 
10 #ifndef _LINUX_KMSAN_CHECKS_H
11 #define _LINUX_KMSAN_CHECKS_H
12 
13 #include <linux/types.h>
14 
15 #ifdef CONFIG_KMSAN
16 
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.
22  *
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.
26  */
27 void kmsan_poison_memory(const void *address, size_t size, gfp_t flags);
28 
29 /**
30  * kmsan_unpoison_memory() -  Mark the memory range as initialized.
31  * @address: address to start with.
32  * @size:    size of buffer to unpoison.
33  *
34  * Until other data is written to this range, KMSAN will treat it as
35  * initialized.
36  */
37 void kmsan_unpoison_memory(const void *address, size_t size);
38 
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.
43  *
44  * If any piece of the given range is marked as uninitialized, KMSAN will report
45  * an error.
46  */
47 void kmsan_check_memory(const void *address, size_t size);
48 
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.
55  *
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.
60  */
61 void kmsan_copy_to_user(void __user *to, const void *from, size_t to_copy,
62 			size_t left);
63 
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.
69  *
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.
72  */
73 void kmsan_memmove(void *to, const void *from, size_t to_copy);
74 
75 #else
76 
kmsan_poison_memory(const void * address,size_t size,gfp_t flags)77 static inline void kmsan_poison_memory(const void *address, size_t size,
78 				       gfp_t flags)
79 {
80 }
kmsan_unpoison_memory(const void * address,size_t size)81 static inline void kmsan_unpoison_memory(const void *address, size_t size)
82 {
83 }
kmsan_check_memory(const void * address,size_t size)84 static inline void kmsan_check_memory(const void *address, size_t size)
85 {
86 }
kmsan_copy_to_user(void __user * to,const void * from,size_t to_copy,size_t left)87 static inline void kmsan_copy_to_user(void __user *to, const void *from,
88 				      size_t to_copy, size_t left)
89 {
90 }
91 
kmsan_memmove(void * to,const void * from,size_t to_copy)92 static inline void kmsan_memmove(void *to, const void *from, size_t to_copy)
93 {
94 }
95 
96 #endif
97 
98 #endif /* _LINUX_KMSAN_CHECKS_H */
99