Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */
2 : : #ifndef _LINUX_KASAN_H
3 : : #define _LINUX_KASAN_H
4 : :
5 : : #include <linux/types.h>
6 : :
7 : : struct kmem_cache;
8 : : struct page;
9 : : struct vm_struct;
10 : : struct task_struct;
11 : :
12 : : #ifdef CONFIG_KASAN
13 : :
14 : : #include <asm/kasan.h>
15 : : #include <asm/pgtable.h>
16 : :
17 : : extern unsigned char kasan_early_shadow_page[PAGE_SIZE];
18 : : extern pte_t kasan_early_shadow_pte[PTRS_PER_PTE];
19 : : extern pmd_t kasan_early_shadow_pmd[PTRS_PER_PMD];
20 : : extern pud_t kasan_early_shadow_pud[PTRS_PER_PUD];
21 : : extern p4d_t kasan_early_shadow_p4d[MAX_PTRS_PER_P4D];
22 : :
23 : : int kasan_populate_early_shadow(const void *shadow_start,
24 : : const void *shadow_end);
25 : :
26 : 1079149634 : static inline void *kasan_mem_to_shadow(const void *addr)
27 : : {
28 [ + - ]: 992738546 : return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT)
29 [ + + + + : 1059995058 : + KASAN_SHADOW_OFFSET;
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- + + ]
30 : : }
31 : :
32 : : /* Enable reporting bugs after kasan_disable_current() */
33 : : extern void kasan_enable_current(void);
34 : :
35 : : /* Disable reporting bugs for current task */
36 : : extern void kasan_disable_current(void);
37 : :
38 : : void kasan_unpoison_shadow(const void *address, size_t size);
39 : :
40 : : void kasan_unpoison_task_stack(struct task_struct *task);
41 : : void kasan_unpoison_stack_above_sp_to(const void *watermark);
42 : :
43 : : void kasan_alloc_pages(struct page *page, unsigned int order);
44 : : void kasan_free_pages(struct page *page, unsigned int order);
45 : :
46 : : void kasan_cache_create(struct kmem_cache *cache, unsigned int *size,
47 : : slab_flags_t *flags);
48 : :
49 : : void kasan_poison_slab(struct page *page);
50 : : void kasan_unpoison_object_data(struct kmem_cache *cache, void *object);
51 : : void kasan_poison_object_data(struct kmem_cache *cache, void *object);
52 : : void * __must_check kasan_init_slab_obj(struct kmem_cache *cache,
53 : : const void *object);
54 : :
55 : : void * __must_check kasan_kmalloc_large(const void *ptr, size_t size,
56 : : gfp_t flags);
57 : : void kasan_kfree_large(void *ptr, unsigned long ip);
58 : : void kasan_poison_kfree(void *ptr, unsigned long ip);
59 : : void * __must_check kasan_kmalloc(struct kmem_cache *s, const void *object,
60 : : size_t size, gfp_t flags);
61 : : void * __must_check kasan_krealloc(const void *object, size_t new_size,
62 : : gfp_t flags);
63 : :
64 : : void * __must_check kasan_slab_alloc(struct kmem_cache *s, void *object,
65 : : gfp_t flags);
66 : : bool kasan_slab_free(struct kmem_cache *s, void *object, unsigned long ip);
67 : :
68 : : struct kasan_cache {
69 : : int alloc_meta_offset;
70 : : int free_meta_offset;
71 : : };
72 : :
73 : : /*
74 : : * These functions provide a special case to support backing module
75 : : * allocations with real shadow memory. With KASAN vmalloc, the special
76 : : * case is unnecessary, as the work is handled in the generic case.
77 : : */
78 : : #ifndef CONFIG_KASAN_VMALLOC
79 : : int kasan_module_alloc(void *addr, size_t size);
80 : : void kasan_free_shadow(const struct vm_struct *vm);
81 : : #else
82 : : static inline int kasan_module_alloc(void *addr, size_t size) { return 0; }
83 : : static inline void kasan_free_shadow(const struct vm_struct *vm) {}
84 : : #endif
85 : :
86 : : int kasan_add_zero_shadow(void *start, unsigned long size);
87 : : void kasan_remove_zero_shadow(void *start, unsigned long size);
88 : :
89 : : size_t __ksize(const void *);
90 : : static inline void kasan_unpoison_slab(const void *ptr)
91 : : {
92 : : kasan_unpoison_shadow(ptr, __ksize(ptr));
93 : : }
94 : : size_t kasan_metadata_size(struct kmem_cache *cache);
95 : :
96 : : bool kasan_save_enable_multi_shot(void);
97 : : void kasan_restore_multi_shot(bool enabled);
98 : :
99 : : #else /* CONFIG_KASAN */
100 : :
101 : : static inline void kasan_unpoison_shadow(const void *address, size_t size) {}
102 : :
103 : : static inline void kasan_unpoison_task_stack(struct task_struct *task) {}
104 : : static inline void kasan_unpoison_stack_above_sp_to(const void *watermark) {}
105 : :
106 : : static inline void kasan_enable_current(void) {}
107 : : static inline void kasan_disable_current(void) {}
108 : :
109 : : static inline void kasan_alloc_pages(struct page *page, unsigned int order) {}
110 : : static inline void kasan_free_pages(struct page *page, unsigned int order) {}
111 : :
112 : : static inline void kasan_cache_create(struct kmem_cache *cache,
113 : : unsigned int *size,
114 : : slab_flags_t *flags) {}
115 : :
116 : : static inline void kasan_poison_slab(struct page *page) {}
117 : : static inline void kasan_unpoison_object_data(struct kmem_cache *cache,
118 : : void *object) {}
119 : : static inline void kasan_poison_object_data(struct kmem_cache *cache,
120 : : void *object) {}
121 : : static inline void *kasan_init_slab_obj(struct kmem_cache *cache,
122 : : const void *object)
123 : : {
124 : : return (void *)object;
125 : : }
126 : :
127 : : static inline void *kasan_kmalloc_large(void *ptr, size_t size, gfp_t flags)
128 : : {
129 : : return ptr;
130 : : }
131 : : static inline void kasan_kfree_large(void *ptr, unsigned long ip) {}
132 : : static inline void kasan_poison_kfree(void *ptr, unsigned long ip) {}
133 : : static inline void *kasan_kmalloc(struct kmem_cache *s, const void *object,
134 : : size_t size, gfp_t flags)
135 : : {
136 : : return (void *)object;
137 : : }
138 : : static inline void *kasan_krealloc(const void *object, size_t new_size,
139 : : gfp_t flags)
140 : : {
141 : : return (void *)object;
142 : : }
143 : :
144 : : static inline void *kasan_slab_alloc(struct kmem_cache *s, void *object,
145 : : gfp_t flags)
146 : : {
147 : : return object;
148 : : }
149 : : static inline bool kasan_slab_free(struct kmem_cache *s, void *object,
150 : : unsigned long ip)
151 : : {
152 : : return false;
153 : : }
154 : :
155 : : static inline int kasan_module_alloc(void *addr, size_t size) { return 0; }
156 : : static inline void kasan_free_shadow(const struct vm_struct *vm) {}
157 : :
158 : : static inline int kasan_add_zero_shadow(void *start, unsigned long size)
159 : : {
160 : : return 0;
161 : : }
162 : : static inline void kasan_remove_zero_shadow(void *start,
163 : : unsigned long size)
164 : : {}
165 : :
166 : : static inline void kasan_unpoison_slab(const void *ptr) { }
167 : : static inline size_t kasan_metadata_size(struct kmem_cache *cache) { return 0; }
168 : :
169 : : #endif /* CONFIG_KASAN */
170 : :
171 : : #ifdef CONFIG_KASAN_GENERIC
172 : :
173 : : #define KASAN_SHADOW_INIT 0
174 : :
175 : : void kasan_cache_shrink(struct kmem_cache *cache);
176 : : void kasan_cache_shutdown(struct kmem_cache *cache);
177 : :
178 : : #else /* CONFIG_KASAN_GENERIC */
179 : :
180 : : static inline void kasan_cache_shrink(struct kmem_cache *cache) {}
181 : : static inline void kasan_cache_shutdown(struct kmem_cache *cache) {}
182 : :
183 : : #endif /* CONFIG_KASAN_GENERIC */
184 : :
185 : : #ifdef CONFIG_KASAN_SW_TAGS
186 : :
187 : : #define KASAN_SHADOW_INIT 0xFF
188 : :
189 : : void kasan_init_tags(void);
190 : :
191 : : void *kasan_reset_tag(const void *addr);
192 : :
193 : : void kasan_report(unsigned long addr, size_t size,
194 : : bool is_write, unsigned long ip);
195 : :
196 : : #else /* CONFIG_KASAN_SW_TAGS */
197 : :
198 : : static inline void kasan_init_tags(void) { }
199 : :
200 : 22848 : static inline void *kasan_reset_tag(const void *addr)
201 : : {
202 [ + + # # : 22848 : return (void *)addr;
# # # # ]
203 : : }
204 : :
205 : : #endif /* CONFIG_KASAN_SW_TAGS */
206 : :
207 : : #ifdef CONFIG_KASAN_VMALLOC
208 : : int kasan_populate_vmalloc(unsigned long addr, unsigned long size);
209 : : void kasan_poison_vmalloc(const void *start, unsigned long size);
210 : : void kasan_unpoison_vmalloc(const void *start, unsigned long size);
211 : : void kasan_release_vmalloc(unsigned long start, unsigned long end,
212 : : unsigned long free_region_start,
213 : : unsigned long free_region_end);
214 : : #else
215 : : static inline int kasan_populate_vmalloc(unsigned long start,
216 : : unsigned long size)
217 : : {
218 : : return 0;
219 : : }
220 : :
221 : 305346 : static inline void kasan_poison_vmalloc(const void *start, unsigned long size)
222 [ - - ]: 305346 : { }
223 : 309068 : static inline void kasan_unpoison_vmalloc(const void *start, unsigned long size)
224 : 309068 : { }
225 : 84 : static inline void kasan_release_vmalloc(unsigned long start,
226 : : unsigned long end,
227 : : unsigned long free_region_start,
228 : 0 : unsigned long free_region_end) {}
229 : : #endif
230 : :
231 : : #ifdef CONFIG_KASAN_INLINE
232 : : void kasan_non_canonical_hook(unsigned long addr);
233 : : #else /* CONFIG_KASAN_INLINE */
234 : : static inline void kasan_non_canonical_hook(unsigned long addr) { }
235 : : #endif /* CONFIG_KASAN_INLINE */
236 : :
237 : : #endif /* LINUX_KASAN_H */
|