1#ifndef LINUX_KMEMCHECK_H
2#define LINUX_KMEMCHECK_H
3
4#include <linux/mm_types.h>
5#include <linux/types.h>
6
7#ifdef CONFIG_KMEMCHECK
8extern int kmemcheck_enabled;
9
10
11void kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node);
12void kmemcheck_free_shadow(struct page *page, int order);
13void kmemcheck_slab_alloc(struct kmem_cache *s, gfp_t gfpflags, void *object,
14 size_t size);
15void kmemcheck_slab_free(struct kmem_cache *s, void *object, size_t size);
16
17void kmemcheck_pagealloc_alloc(struct page *p, unsigned int order,
18 gfp_t gfpflags);
19
20void kmemcheck_show_pages(struct page *p, unsigned int n);
21void kmemcheck_hide_pages(struct page *p, unsigned int n);
22
23bool kmemcheck_page_is_tracked(struct page *p);
24
25void kmemcheck_mark_unallocated(void *address, unsigned int n);
26void kmemcheck_mark_uninitialized(void *address, unsigned int n);
27void kmemcheck_mark_initialized(void *address, unsigned int n);
28void kmemcheck_mark_freed(void *address, unsigned int n);
29
30void kmemcheck_mark_unallocated_pages(struct page *p, unsigned int n);
31void kmemcheck_mark_uninitialized_pages(struct page *p, unsigned int n);
32void kmemcheck_mark_initialized_pages(struct page *p, unsigned int n);
33
34int kmemcheck_show_addr(unsigned long address);
35int kmemcheck_hide_addr(unsigned long address);
36
37bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size);
38
39#else
40#define kmemcheck_enabled 0
41
42static inline void
43kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node)
44{
45}
46
47static inline void
48kmemcheck_free_shadow(struct page *page, int order)
49{
50}
51
52static inline void
53kmemcheck_slab_alloc(struct kmem_cache *s, gfp_t gfpflags, void *object,
54 size_t size)
55{
56}
57
58static inline void kmemcheck_slab_free(struct kmem_cache *s, void *object,
59 size_t size)
60{
61}
62
63static inline void kmemcheck_pagealloc_alloc(struct page *p,
64 unsigned int order, gfp_t gfpflags)
65{
66}
67
68static inline bool kmemcheck_page_is_tracked(struct page *p)
69{
70 return false;
71}
72
73static inline void kmemcheck_mark_unallocated(void *address, unsigned int n)
74{
75}
76
77static inline void kmemcheck_mark_uninitialized(void *address, unsigned int n)
78{
79}
80
81static inline void kmemcheck_mark_initialized(void *address, unsigned int n)
82{
83}
84
85static inline void kmemcheck_mark_freed(void *address, unsigned int n)
86{
87}
88
89static inline void kmemcheck_mark_unallocated_pages(struct page *p,
90 unsigned int n)
91{
92}
93
94static inline void kmemcheck_mark_uninitialized_pages(struct page *p,
95 unsigned int n)
96{
97}
98
99static inline void kmemcheck_mark_initialized_pages(struct page *p,
100 unsigned int n)
101{
102}
103
104static inline bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size)
105{
106 return true;
107}
108
109#endif
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140#define kmemcheck_bitfield_begin(name) \
141 int name##_begin[0];
142
143#define kmemcheck_bitfield_end(name) \
144 int name##_end[0];
145
146#define kmemcheck_annotate_bitfield(ptr, name) \
147 do { \
148 int _n; \
149 \
150 if (!ptr) \
151 break; \
152 \
153 _n = (long) &((ptr)->name##_end) \
154 - (long) &((ptr)->name##_begin); \
155 MAYBE_BUILD_BUG_ON(_n < 0); \
156 \
157 kmemcheck_mark_initialized(&((ptr)->name##_begin), _n); \
158 } while (0)
159
160#define kmemcheck_annotate_variable(var) \
161 do { \
162 kmemcheck_mark_initialized(&(var), sizeof(var)); \
163 } while (0) \
164
165#endif
166