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 : : static inline void *kasan_mem_to_shadow(const void *addr)
27 : : {
28 : : return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT)
29 : : + 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 : : int kasan_module_alloc(void *addr, size_t size);
74 : : void kasan_free_shadow(const struct vm_struct *vm);
75 : :
76 : : int kasan_add_zero_shadow(void *start, unsigned long size);
77 : : void kasan_remove_zero_shadow(void *start, unsigned long size);
78 : :
79 : : size_t __ksize(const void *);
80 : : static inline void kasan_unpoison_slab(const void *ptr)
81 : : {
82 : : kasan_unpoison_shadow(ptr, __ksize(ptr));
83 : : }
84 : : size_t kasan_metadata_size(struct kmem_cache *cache);
85 : :
86 : : bool kasan_save_enable_multi_shot(void);
87 : : void kasan_restore_multi_shot(bool enabled);
88 : :
89 : : #else /* CONFIG_KASAN */
90 : :
91 : : static inline void kasan_unpoison_shadow(const void *address, size_t size) {}
92 : :
93 : : static inline void kasan_unpoison_task_stack(struct task_struct *task) {}
94 : : static inline void kasan_unpoison_stack_above_sp_to(const void *watermark) {}
95 : :
96 : : static inline void kasan_enable_current(void) {}
97 : : static inline void kasan_disable_current(void) {}
98 : :
99 : : static inline void kasan_alloc_pages(struct page *page, unsigned int order) {}
100 : : static inline void kasan_free_pages(struct page *page, unsigned int order) {}
101 : :
102 : : static inline void kasan_cache_create(struct kmem_cache *cache,
103 : : unsigned int *size,
104 : : slab_flags_t *flags) {}
105 : :
106 : : static inline void kasan_poison_slab(struct page *page) {}
107 : : static inline void kasan_unpoison_object_data(struct kmem_cache *cache,
108 : : void *object) {}
109 : : static inline void kasan_poison_object_data(struct kmem_cache *cache,
110 : : void *object) {}
111 : : static inline void *kasan_init_slab_obj(struct kmem_cache *cache,
112 : : const void *object)
113 : : {
114 : : return (void *)object;
115 : : }
116 : :
117 : : static inline void *kasan_kmalloc_large(void *ptr, size_t size, gfp_t flags)
118 : : {
119 : : return ptr;
120 : : }
121 : : static inline void kasan_kfree_large(void *ptr, unsigned long ip) {}
122 : : static inline void kasan_poison_kfree(void *ptr, unsigned long ip) {}
123 : : static inline void *kasan_kmalloc(struct kmem_cache *s, const void *object,
124 : : size_t size, gfp_t flags)
125 : : {
126 : : return (void *)object;
127 : : }
128 : 123992 : static inline void *kasan_krealloc(const void *object, size_t new_size,
129 : : gfp_t flags)
130 : : {
131 : 123992 : return (void *)object;
132 : : }
133 : :
134 : : static inline void *kasan_slab_alloc(struct kmem_cache *s, void *object,
135 : : gfp_t flags)
136 : : {
137 : : return object;
138 : : }
139 : 174921206 : static inline bool kasan_slab_free(struct kmem_cache *s, void *object,
140 : : unsigned long ip)
141 : : {
142 : 174921206 : return false;
143 : : }
144 : :
145 : : static inline int kasan_module_alloc(void *addr, size_t size) { return 0; }
146 : : static inline void kasan_free_shadow(const struct vm_struct *vm) {}
147 : :
148 : : static inline int kasan_add_zero_shadow(void *start, unsigned long size)
149 : : {
150 : : return 0;
151 : : }
152 : : static inline void kasan_remove_zero_shadow(void *start,
153 : : unsigned long size)
154 : : {}
155 : :
156 : : static inline void kasan_unpoison_slab(const void *ptr) { }
157 : : static inline size_t kasan_metadata_size(struct kmem_cache *cache) { return 0; }
158 : :
159 : : #endif /* CONFIG_KASAN */
160 : :
161 : : #ifdef CONFIG_KASAN_GENERIC
162 : :
163 : : #define KASAN_SHADOW_INIT 0
164 : :
165 : : void kasan_cache_shrink(struct kmem_cache *cache);
166 : : void kasan_cache_shutdown(struct kmem_cache *cache);
167 : :
168 : : #else /* CONFIG_KASAN_GENERIC */
169 : :
170 : : static inline void kasan_cache_shrink(struct kmem_cache *cache) {}
171 : : static inline void kasan_cache_shutdown(struct kmem_cache *cache) {}
172 : :
173 : : #endif /* CONFIG_KASAN_GENERIC */
174 : :
175 : : #ifdef CONFIG_KASAN_SW_TAGS
176 : :
177 : : #define KASAN_SHADOW_INIT 0xFF
178 : :
179 : : void kasan_init_tags(void);
180 : :
181 : : void *kasan_reset_tag(const void *addr);
182 : :
183 : : void kasan_report(unsigned long addr, size_t size,
184 : : bool is_write, unsigned long ip);
185 : :
186 : : #else /* CONFIG_KASAN_SW_TAGS */
187 : :
188 : : static inline void kasan_init_tags(void) { }
189 : :
190 : : static inline void *kasan_reset_tag(const void *addr)
191 : : {
192 : : return (void *)addr;
193 : : }
194 : :
195 : : #endif /* CONFIG_KASAN_SW_TAGS */
196 : :
197 : : #endif /* LINUX_KASAN_H */
|