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 77 static inline void kmsan_poison_memory(const void *address, size_t size, 78 gfp_t flags) 79 { 80 } 81 static inline void kmsan_unpoison_memory(const void *address, size_t size) 82 { 83 } 84 static inline void kmsan_check_memory(const void *address, size_t size) 85 { 86 } 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 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
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.