]>
git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blob - include/linux/kmemcheck.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef LINUX_KMEMCHECK_H
3 #define LINUX_KMEMCHECK_H
5 #include <linux/mm_types.h>
6 #include <linux/types.h>
8 #ifdef CONFIG_KMEMCHECK
9 extern int kmemcheck_enabled
;
11 /* The slab-related functions. */
12 void kmemcheck_alloc_shadow(struct page
*page
, int order
, gfp_t flags
, int node
);
13 void kmemcheck_free_shadow(struct page
*page
, int order
);
14 void kmemcheck_slab_alloc(struct kmem_cache
*s
, gfp_t gfpflags
, void *object
,
16 void kmemcheck_slab_free(struct kmem_cache
*s
, void *object
, size_t size
);
18 void kmemcheck_pagealloc_alloc(struct page
*p
, unsigned int order
,
21 void kmemcheck_show_pages(struct page
*p
, unsigned int n
);
22 void kmemcheck_hide_pages(struct page
*p
, unsigned int n
);
24 bool kmemcheck_page_is_tracked(struct page
*p
);
26 void kmemcheck_mark_unallocated(void *address
, unsigned int n
);
27 void kmemcheck_mark_uninitialized(void *address
, unsigned int n
);
28 void kmemcheck_mark_initialized(void *address
, unsigned int n
);
29 void kmemcheck_mark_freed(void *address
, unsigned int n
);
31 void kmemcheck_mark_unallocated_pages(struct page
*p
, unsigned int n
);
32 void kmemcheck_mark_uninitialized_pages(struct page
*p
, unsigned int n
);
33 void kmemcheck_mark_initialized_pages(struct page
*p
, unsigned int n
);
35 int kmemcheck_show_addr(unsigned long address
);
36 int kmemcheck_hide_addr(unsigned long address
);
38 bool kmemcheck_is_obj_initialized(unsigned long addr
, size_t size
);
41 * Bitfield annotations
43 * How to use: If you have a struct using bitfields, for example
49 * then this should be rewritten as
52 * kmemcheck_bitfield_begin(flags);
54 * kmemcheck_bitfield_end(flags);
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:
62 * struct a *a = kmalloc(sizeof(struct a), GFP_KERNEL);
63 * kmemcheck_annotate_bitfield(a, flags);
65 #define kmemcheck_bitfield_begin(name) \
68 #define kmemcheck_bitfield_end(name) \
71 #define kmemcheck_annotate_bitfield(ptr, name) \
78 _n = (long) &((ptr)->name##_end) \
79 - (long) &((ptr)->name##_begin); \
80 BUILD_BUG_ON(_n < 0); \
82 kmemcheck_mark_initialized(&((ptr)->name##_begin), _n); \
85 #define kmemcheck_annotate_variable(var) \
87 kmemcheck_mark_initialized(&(var), sizeof(var)); \
91 #define kmemcheck_enabled 0
94 kmemcheck_alloc_shadow(struct page
*page
, int order
, gfp_t flags
, int node
)
99 kmemcheck_free_shadow(struct page
*page
, int order
)
104 kmemcheck_slab_alloc(struct kmem_cache
*s
, gfp_t gfpflags
, void *object
,
109 static inline void kmemcheck_slab_free(struct kmem_cache
*s
, void *object
,
114 static inline void kmemcheck_pagealloc_alloc(struct page
*p
,
115 unsigned int order
, gfp_t gfpflags
)
119 static inline bool kmemcheck_page_is_tracked(struct page
*p
)
124 static inline void kmemcheck_mark_unallocated(void *address
, unsigned int n
)
128 static inline void kmemcheck_mark_uninitialized(void *address
, unsigned int n
)
132 static inline void kmemcheck_mark_initialized(void *address
, unsigned int n
)
136 static inline void kmemcheck_mark_freed(void *address
, unsigned int n
)
140 static inline void kmemcheck_mark_unallocated_pages(struct page
*p
,
145 static inline void kmemcheck_mark_uninitialized_pages(struct page
*p
,
150 static inline void kmemcheck_mark_initialized_pages(struct page
*p
,
155 static inline bool kmemcheck_is_obj_initialized(unsigned long addr
, size_t size
)
160 #define kmemcheck_bitfield_begin(name)
161 #define kmemcheck_bitfield_end(name)
162 #define kmemcheck_annotate_bitfield(ptr, name) \
166 #define kmemcheck_annotate_variable(var) \
170 #endif /* CONFIG_KMEMCHECK */
172 #endif /* LINUX_KMEMCHECK_H */