xref: /openbmc/linux/include/linux/kmsan-checks.h (revision 75cf0290)
1f80be457SAlexander Potapenko /* SPDX-License-Identifier: GPL-2.0 */
2f80be457SAlexander Potapenko /*
3f80be457SAlexander Potapenko  * KMSAN checks to be used for one-off annotations in subsystems.
4f80be457SAlexander Potapenko  *
5f80be457SAlexander Potapenko  * Copyright (C) 2017-2022 Google LLC
6f80be457SAlexander Potapenko  * Author: Alexander Potapenko <glider@google.com>
7f80be457SAlexander Potapenko  *
8f80be457SAlexander Potapenko  */
9f80be457SAlexander Potapenko 
10f80be457SAlexander Potapenko #ifndef _LINUX_KMSAN_CHECKS_H
11f80be457SAlexander Potapenko #define _LINUX_KMSAN_CHECKS_H
12f80be457SAlexander Potapenko 
13f80be457SAlexander Potapenko #include <linux/types.h>
14f80be457SAlexander Potapenko 
15f80be457SAlexander Potapenko #ifdef CONFIG_KMSAN
16f80be457SAlexander Potapenko 
17f80be457SAlexander Potapenko /**
18f80be457SAlexander Potapenko  * kmsan_poison_memory() - Mark the memory range as uninitialized.
19f80be457SAlexander Potapenko  * @address: address to start with.
20f80be457SAlexander Potapenko  * @size:    size of buffer to poison.
21f80be457SAlexander Potapenko  * @flags:   GFP flags for allocations done by this function.
22f80be457SAlexander Potapenko  *
23f80be457SAlexander Potapenko  * Until other data is written to this range, KMSAN will treat it as
24f80be457SAlexander Potapenko  * uninitialized. Error reports for this memory will reference the call site of
25f80be457SAlexander Potapenko  * kmsan_poison_memory() as origin.
26f80be457SAlexander Potapenko  */
27f80be457SAlexander Potapenko void kmsan_poison_memory(const void *address, size_t size, gfp_t flags);
28f80be457SAlexander Potapenko 
29f80be457SAlexander Potapenko /**
30f80be457SAlexander Potapenko  * kmsan_unpoison_memory() -  Mark the memory range as initialized.
31f80be457SAlexander Potapenko  * @address: address to start with.
32f80be457SAlexander Potapenko  * @size:    size of buffer to unpoison.
33f80be457SAlexander Potapenko  *
34f80be457SAlexander Potapenko  * Until other data is written to this range, KMSAN will treat it as
35f80be457SAlexander Potapenko  * initialized.
36f80be457SAlexander Potapenko  */
37f80be457SAlexander Potapenko void kmsan_unpoison_memory(const void *address, size_t size);
38f80be457SAlexander Potapenko 
39f80be457SAlexander Potapenko /**
40f80be457SAlexander Potapenko  * kmsan_check_memory() - Check the memory range for being initialized.
41f80be457SAlexander Potapenko  * @address: address to start with.
42f80be457SAlexander Potapenko  * @size:    size of buffer to check.
43f80be457SAlexander Potapenko  *
44f80be457SAlexander Potapenko  * If any piece of the given range is marked as uninitialized, KMSAN will report
45f80be457SAlexander Potapenko  * an error.
46f80be457SAlexander Potapenko  */
47f80be457SAlexander Potapenko void kmsan_check_memory(const void *address, size_t size);
48f80be457SAlexander Potapenko 
49*75cf0290SAlexander Potapenko /**
50*75cf0290SAlexander Potapenko  * kmsan_copy_to_user() - Notify KMSAN about a data transfer to userspace.
51*75cf0290SAlexander Potapenko  * @to:      destination address in the userspace.
52*75cf0290SAlexander Potapenko  * @from:    source address in the kernel.
53*75cf0290SAlexander Potapenko  * @to_copy: number of bytes to copy.
54*75cf0290SAlexander Potapenko  * @left:    number of bytes not copied.
55*75cf0290SAlexander Potapenko  *
56*75cf0290SAlexander Potapenko  * If this is a real userspace data transfer, KMSAN checks the bytes that were
57*75cf0290SAlexander Potapenko  * actually copied to ensure there was no information leak. If @to belongs to
58*75cf0290SAlexander Potapenko  * the kernel space (which is possible for compat syscalls), KMSAN just copies
59*75cf0290SAlexander Potapenko  * the metadata.
60*75cf0290SAlexander Potapenko  */
61*75cf0290SAlexander Potapenko void kmsan_copy_to_user(void __user *to, const void *from, size_t to_copy,
62*75cf0290SAlexander Potapenko 			size_t left);
63*75cf0290SAlexander Potapenko 
64f80be457SAlexander Potapenko #else
65f80be457SAlexander Potapenko 
kmsan_poison_memory(const void * address,size_t size,gfp_t flags)66f80be457SAlexander Potapenko static inline void kmsan_poison_memory(const void *address, size_t size,
67f80be457SAlexander Potapenko 				       gfp_t flags)
68f80be457SAlexander Potapenko {
69f80be457SAlexander Potapenko }
kmsan_unpoison_memory(const void * address,size_t size)70f80be457SAlexander Potapenko static inline void kmsan_unpoison_memory(const void *address, size_t size)
71f80be457SAlexander Potapenko {
72f80be457SAlexander Potapenko }
kmsan_check_memory(const void * address,size_t size)73f80be457SAlexander Potapenko static inline void kmsan_check_memory(const void *address, size_t size)
74f80be457SAlexander Potapenko {
75f80be457SAlexander Potapenko }
kmsan_copy_to_user(void __user * to,const void * from,size_t to_copy,size_t left)76*75cf0290SAlexander Potapenko static inline void kmsan_copy_to_user(void __user *to, const void *from,
77*75cf0290SAlexander Potapenko 				      size_t to_copy, size_t left)
78*75cf0290SAlexander Potapenko {
79*75cf0290SAlexander Potapenko }
80f80be457SAlexander Potapenko 
81f80be457SAlexander Potapenko #endif
82f80be457SAlexander Potapenko 
83f80be457SAlexander Potapenko #endif /* _LINUX_KMSAN_CHECKS_H */
84