at v4.14 4.4 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef LINUX_KMEMCHECK_H 3#define LINUX_KMEMCHECK_H 4 5#include <linux/mm_types.h> 6#include <linux/types.h> 7 8#ifdef CONFIG_KMEMCHECK 9extern int kmemcheck_enabled; 10 11/* The slab-related functions. */ 12void kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node); 13void kmemcheck_free_shadow(struct page *page, int order); 14void kmemcheck_slab_alloc(struct kmem_cache *s, gfp_t gfpflags, void *object, 15 size_t size); 16void kmemcheck_slab_free(struct kmem_cache *s, void *object, size_t size); 17 18void kmemcheck_pagealloc_alloc(struct page *p, unsigned int order, 19 gfp_t gfpflags); 20 21void kmemcheck_show_pages(struct page *p, unsigned int n); 22void kmemcheck_hide_pages(struct page *p, unsigned int n); 23 24bool kmemcheck_page_is_tracked(struct page *p); 25 26void kmemcheck_mark_unallocated(void *address, unsigned int n); 27void kmemcheck_mark_uninitialized(void *address, unsigned int n); 28void kmemcheck_mark_initialized(void *address, unsigned int n); 29void kmemcheck_mark_freed(void *address, unsigned int n); 30 31void kmemcheck_mark_unallocated_pages(struct page *p, unsigned int n); 32void kmemcheck_mark_uninitialized_pages(struct page *p, unsigned int n); 33void kmemcheck_mark_initialized_pages(struct page *p, unsigned int n); 34 35int kmemcheck_show_addr(unsigned long address); 36int kmemcheck_hide_addr(unsigned long address); 37 38bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size); 39 40/* 41 * Bitfield annotations 42 * 43 * How to use: If you have a struct using bitfields, for example 44 * 45 * struct a { 46 * int x:8, y:8; 47 * }; 48 * 49 * then this should be rewritten as 50 * 51 * struct a { 52 * kmemcheck_bitfield_begin(flags); 53 * int x:8, y:8; 54 * kmemcheck_bitfield_end(flags); 55 * }; 56 * 57 * Now the "flags_begin" and "flags_end" members may be used to refer to the 58 * beginning and end, respectively, of the bitfield (and things like 59 * &x.flags_begin is allowed). As soon as the struct is allocated, the bit- 60 * fields should be annotated: 61 * 62 * struct a *a = kmalloc(sizeof(struct a), GFP_KERNEL); 63 * kmemcheck_annotate_bitfield(a, flags); 64 */ 65#define kmemcheck_bitfield_begin(name) \ 66 int name##_begin[0]; 67 68#define kmemcheck_bitfield_end(name) \ 69 int name##_end[0]; 70 71#define kmemcheck_annotate_bitfield(ptr, name) \ 72 do { \ 73 int _n; \ 74 \ 75 if (!ptr) \ 76 break; \ 77 \ 78 _n = (long) &((ptr)->name##_end) \ 79 - (long) &((ptr)->name##_begin); \ 80 BUILD_BUG_ON(_n < 0); \ 81 \ 82 kmemcheck_mark_initialized(&((ptr)->name##_begin), _n); \ 83 } while (0) 84 85#define kmemcheck_annotate_variable(var) \ 86 do { \ 87 kmemcheck_mark_initialized(&(var), sizeof(var)); \ 88 } while (0) \ 89 90#else 91#define kmemcheck_enabled 0 92 93static inline void 94kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node) 95{ 96} 97 98static inline void 99kmemcheck_free_shadow(struct page *page, int order) 100{ 101} 102 103static inline void 104kmemcheck_slab_alloc(struct kmem_cache *s, gfp_t gfpflags, void *object, 105 size_t size) 106{ 107} 108 109static inline void kmemcheck_slab_free(struct kmem_cache *s, void *object, 110 size_t size) 111{ 112} 113 114static inline void kmemcheck_pagealloc_alloc(struct page *p, 115 unsigned int order, gfp_t gfpflags) 116{ 117} 118 119static inline bool kmemcheck_page_is_tracked(struct page *p) 120{ 121 return false; 122} 123 124static inline void kmemcheck_mark_unallocated(void *address, unsigned int n) 125{ 126} 127 128static inline void kmemcheck_mark_uninitialized(void *address, unsigned int n) 129{ 130} 131 132static inline void kmemcheck_mark_initialized(void *address, unsigned int n) 133{ 134} 135 136static inline void kmemcheck_mark_freed(void *address, unsigned int n) 137{ 138} 139 140static inline void kmemcheck_mark_unallocated_pages(struct page *p, 141 unsigned int n) 142{ 143} 144 145static inline void kmemcheck_mark_uninitialized_pages(struct page *p, 146 unsigned int n) 147{ 148} 149 150static inline void kmemcheck_mark_initialized_pages(struct page *p, 151 unsigned int n) 152{ 153} 154 155static inline bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size) 156{ 157 return true; 158} 159 160#define kmemcheck_bitfield_begin(name) 161#define kmemcheck_bitfield_end(name) 162#define kmemcheck_annotate_bitfield(ptr, name) \ 163 do { \ 164 } while (0) 165 166#define kmemcheck_annotate_variable(var) \ 167 do { \ 168 } while (0) 169 170#endif /* CONFIG_KMEMCHECK */ 171 172#endif /* LINUX_KMEMCHECK_H */