| 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 |  | 
|---|