OLD | NEW |
1 #ifndef _LINUX_KASAN_H | 1 #ifndef _LINUX_KASAN_H |
2 #define _LINUX_KASAN_H | 2 #define _LINUX_KASAN_H |
3 | 3 |
4 #include <linux/types.h> | 4 #include <linux/types.h> |
5 | 5 |
6 struct kmem_cache; | 6 struct kmem_cache; |
7 struct page; | 7 struct page; |
8 struct vm_struct; | 8 struct vm_struct; |
9 struct task_struct; | 9 struct task_struct; |
10 | 10 |
11 #ifdef CONFIG_KASAN | 11 #ifdef CONFIG_KASAN |
12 | 12 |
13 #define KASAN_SHADOW_SCALE_SHIFT 3 | 13 #define KASAN_SHADOW_SCALE_SHIFT 3 |
14 | 14 |
15 #include <asm/kasan.h> | 15 #include <asm/kasan.h> |
16 #include <asm/pgtable.h> | 16 #include <asm/pgtable.h> |
17 | 17 |
| 18 #ifndef KASAN_PSHADOW_SIZE |
| 19 #define KASAN_PSHADOW_SIZE 0 |
| 20 #endif |
| 21 #ifndef KASAN_PSHADOW_START |
| 22 #define KASAN_PSHADOW_START 0 |
| 23 #endif |
| 24 #ifndef KASAN_PSHADOW_END |
| 25 #define KASAN_PSHADOW_END 0 |
| 26 #endif |
| 27 |
| 28 extern unsigned long kasan_pshadow_offset; |
| 29 |
18 extern unsigned char kasan_zero_page[PAGE_SIZE]; | 30 extern unsigned char kasan_zero_page[PAGE_SIZE]; |
19 extern pte_t kasan_zero_pte[PTRS_PER_PTE]; | 31 extern pte_t kasan_zero_pte[PTRS_PER_PTE]; |
20 extern pmd_t kasan_zero_pmd[PTRS_PER_PMD]; | 32 extern pmd_t kasan_zero_pmd[PTRS_PER_PMD]; |
21 extern pud_t kasan_zero_pud[PTRS_PER_PUD]; | 33 extern pud_t kasan_zero_pud[PTRS_PER_PUD]; |
22 extern p4d_t kasan_zero_p4d[PTRS_PER_P4D]; | 34 extern p4d_t kasan_zero_p4d[PTRS_PER_P4D]; |
23 | 35 |
24 void kasan_populate_zero_shadow(const void *shadow_start, | 36 extern unsigned char kasan_black_page[PAGE_SIZE]; |
25 » » » » const void *shadow_end); | 37 extern pte_t kasan_black_pte[PTRS_PER_PTE]; |
| 38 extern pmd_t kasan_black_pmd[PTRS_PER_PMD]; |
| 39 extern pud_t kasan_black_pud[PTRS_PER_PUD]; |
| 40 extern p4d_t kasan_black_p4d[PTRS_PER_P4D]; |
| 41 |
| 42 void kasan_populate_shadow(const void *shadow_start, |
| 43 » » » » const void *shadow_end, |
| 44 » » » » bool zero, bool private); |
| 45 void kasan_early_init_pshadow(void); |
| 46 |
| 47 static inline const void *kasan_shadow_to_mem(const void *shadow_addr) |
| 48 { |
| 49 » return (void *)(((unsigned long)shadow_addr - KASAN_SHADOW_OFFSET) |
| 50 » » << KASAN_SHADOW_SCALE_SHIFT); |
| 51 } |
26 | 52 |
27 static inline void *kasan_mem_to_shadow(const void *addr) | 53 static inline void *kasan_mem_to_shadow(const void *addr) |
28 { | 54 { |
29 return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT) | 55 return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT) |
30 + KASAN_SHADOW_OFFSET; | 56 + KASAN_SHADOW_OFFSET; |
31 } | 57 } |
32 | 58 |
| 59 static inline void *kasan_mem_to_pshadow(const void *addr) |
| 60 { |
| 61 return (void *)((unsigned long)addr >> PAGE_SHIFT) |
| 62 + kasan_pshadow_offset; |
| 63 } |
| 64 |
| 65 static inline void *kasan_shadow_to_pshadow(const void *addr) |
| 66 { |
| 67 /* |
| 68 * KASAN_SHADOW_END needs special handling since |
| 69 * it will overflow in kasan_shadow_to_mem() |
| 70 */ |
| 71 if ((unsigned long)addr == KASAN_SHADOW_END) |
| 72 return (void *)KASAN_PSHADOW_END; |
| 73 |
| 74 return kasan_mem_to_pshadow(kasan_shadow_to_mem(addr)); |
| 75 } |
| 76 |
33 /* Enable reporting bugs after kasan_disable_current() */ | 77 /* Enable reporting bugs after kasan_disable_current() */ |
34 extern void kasan_enable_current(void); | 78 extern void kasan_enable_current(void); |
35 | 79 |
36 /* Disable reporting bugs for current task */ | 80 /* Disable reporting bugs for current task */ |
37 extern void kasan_disable_current(void); | 81 extern void kasan_disable_current(void); |
38 | 82 |
39 void kasan_unpoison_shadow(const void *address, size_t size); | 83 void kasan_unpoison_shadow(const void *address, size_t size); |
| 84 void kasan_poison_pshadow(const void *address, size_t size); |
| 85 void kasan_unpoison_pshadow(const void *address, size_t size); |
| 86 int kasan_stack_alloc(const void *address, size_t size); |
| 87 void kasan_stack_free(const void *addr, size_t size); |
| 88 int kasan_slab_page_alloc(const void *address, size_t size, gfp_t flags); |
| 89 void kasan_slab_page_free(const void *addr, size_t size); |
| 90 bool kasan_free_buddy(struct page *page, unsigned int order, |
| 91 unsigned int max_order); |
40 | 92 |
41 void kasan_unpoison_task_stack(struct task_struct *task); | 93 void kasan_unpoison_task_stack(struct task_struct *task); |
42 void kasan_unpoison_stack_above_sp_to(const void *watermark); | 94 void kasan_unpoison_stack_above_sp_to(const void *watermark); |
43 | 95 |
44 void kasan_alloc_pages(struct page *page, unsigned int order); | 96 void kasan_alloc_pages(struct page *page, unsigned int order); |
45 void kasan_free_pages(struct page *page, unsigned int order); | 97 void kasan_free_pages(struct page *page, unsigned int order); |
46 | 98 |
47 void kasan_cache_create(struct kmem_cache *cache, size_t *size, | 99 void kasan_cache_create(struct kmem_cache *cache, size_t *size, |
48 unsigned long *flags); | 100 unsigned long *flags); |
49 void kasan_cache_shrink(struct kmem_cache *cache); | 101 void kasan_cache_shrink(struct kmem_cache *cache); |
50 void kasan_cache_shutdown(struct kmem_cache *cache); | 102 void kasan_cache_shutdown(struct kmem_cache *cache); |
51 | 103 |
52 void kasan_poison_slab(struct page *page); | 104 void kasan_poison_slab(struct page *page); |
53 void kasan_unpoison_object_data(struct kmem_cache *cache, void *object); | 105 void kasan_unpoison_object_data(struct kmem_cache *cache, void *object); |
54 void kasan_poison_object_data(struct kmem_cache *cache, void *object); | 106 void kasan_poison_object_data(struct kmem_cache *cache, void *object); |
55 void kasan_init_slab_obj(struct kmem_cache *cache, const void *object); | 107 void kasan_init_slab_obj(struct kmem_cache *cache, const void *object); |
56 | 108 |
57 void kasan_kmalloc_large(const void *ptr, size_t size, gfp_t flags); | 109 int kasan_kmalloc_large(const void *ptr, size_t size, gfp_t flags); |
58 void kasan_kfree_large(const void *ptr); | 110 void kasan_kfree_large(const void *ptr); |
59 void kasan_poison_kfree(void *ptr); | 111 void kasan_poison_kfree(void *ptr); |
60 void kasan_kmalloc(struct kmem_cache *s, const void *object, size_t size, | 112 void kasan_kmalloc(struct kmem_cache *s, const void *object, size_t size, |
61 gfp_t flags); | 113 gfp_t flags); |
62 void kasan_krealloc(const void *object, size_t new_size, gfp_t flags); | 114 void kasan_krealloc(const void *object, size_t new_size, gfp_t flags); |
63 | 115 |
64 void kasan_slab_alloc(struct kmem_cache *s, void *object, gfp_t flags); | 116 void kasan_slab_alloc(struct kmem_cache *s, void *object, gfp_t flags); |
65 bool kasan_slab_free(struct kmem_cache *s, void *object); | 117 bool kasan_slab_free(struct kmem_cache *s, void *object); |
66 | 118 |
67 struct kasan_cache { | 119 struct kasan_cache { |
68 int alloc_meta_offset; | 120 int alloc_meta_offset; |
69 int free_meta_offset; | 121 int free_meta_offset; |
70 }; | 122 }; |
71 | 123 |
72 int kasan_module_alloc(void *addr, size_t size); | 124 int kasan_module_alloc(void *addr, size_t size); |
73 void kasan_free_shadow(const struct vm_struct *vm); | 125 void kasan_free_shadow(const struct vm_struct *vm); |
74 | 126 |
75 size_t ksize(const void *); | 127 size_t ksize(const void *); |
76 static inline void kasan_unpoison_slab(const void *ptr) { ksize(ptr); } | 128 static inline void kasan_unpoison_slab(const void *ptr) { ksize(ptr); } |
77 size_t kasan_metadata_size(struct kmem_cache *cache); | 129 size_t kasan_metadata_size(struct kmem_cache *cache); |
78 | 130 |
79 bool kasan_save_enable_multi_shot(void); | 131 bool kasan_save_enable_multi_shot(void); |
80 void kasan_restore_multi_shot(bool enabled); | 132 void kasan_restore_multi_shot(bool enabled); |
81 | 133 |
82 #else /* CONFIG_KASAN */ | 134 #else /* CONFIG_KASAN */ |
83 | 135 |
84 static inline void kasan_unpoison_shadow(const void *address, size_t size) {} | 136 static inline void kasan_unpoison_shadow(const void *address, size_t size) {} |
| 137 static inline void kasan_poison_pshadow(const void *address, size_t size) {} |
| 138 static inline void kasan_unpoison_pshadow(const void *address, size_t size) {} |
| 139 static inline int kasan_stack_alloc(const void *address, |
| 140 size_t size) { return 0; } |
| 141 static inline void kasan_stack_free(const void *addr, size_t size) {} |
| 142 static inline int kasan_slab_page_alloc(const void *address, size_t size, |
| 143 gfp_t flags) { return 0; } |
| 144 static inline void kasan_slab_page_free(const void *addr, size_t size) {} |
| 145 static inline bool kasan_free_buddy(struct page *page, unsigned int order, |
| 146 unsigned int max_order) { return false; } |
85 | 147 |
86 static inline void kasan_unpoison_task_stack(struct task_struct *task) {} | 148 static inline void kasan_unpoison_task_stack(struct task_struct *task) {} |
87 static inline void kasan_unpoison_stack_above_sp_to(const void *watermark) {} | 149 static inline void kasan_unpoison_stack_above_sp_to(const void *watermark) {} |
88 | 150 |
89 static inline void kasan_enable_current(void) {} | 151 static inline void kasan_enable_current(void) {} |
90 static inline void kasan_disable_current(void) {} | 152 static inline void kasan_disable_current(void) {} |
91 | 153 |
92 static inline void kasan_alloc_pages(struct page *page, unsigned int order) {} | 154 static inline void kasan_alloc_pages(struct page *page, unsigned int order) {} |
93 static inline void kasan_free_pages(struct page *page, unsigned int order) {} | 155 static inline void kasan_free_pages(struct page *page, unsigned int order) {} |
94 | 156 |
95 static inline void kasan_cache_create(struct kmem_cache *cache, | 157 static inline void kasan_cache_create(struct kmem_cache *cache, |
96 size_t *size, | 158 size_t *size, |
97 unsigned long *flags) {} | 159 unsigned long *flags) {} |
98 static inline void kasan_cache_shrink(struct kmem_cache *cache) {} | 160 static inline void kasan_cache_shrink(struct kmem_cache *cache) {} |
99 static inline void kasan_cache_shutdown(struct kmem_cache *cache) {} | 161 static inline void kasan_cache_shutdown(struct kmem_cache *cache) {} |
100 | 162 |
101 static inline void kasan_poison_slab(struct page *page) {} | 163 static inline void kasan_poison_slab(struct page *page) {} |
102 static inline void kasan_unpoison_object_data(struct kmem_cache *cache, | 164 static inline void kasan_unpoison_object_data(struct kmem_cache *cache, |
103 void *object) {} | 165 void *object) {} |
104 static inline void kasan_poison_object_data(struct kmem_cache *cache, | 166 static inline void kasan_poison_object_data(struct kmem_cache *cache, |
105 void *object) {} | 167 void *object) {} |
106 static inline void kasan_init_slab_obj(struct kmem_cache *cache, | 168 static inline void kasan_init_slab_obj(struct kmem_cache *cache, |
107 const void *object) {} | 169 const void *object) {} |
108 | 170 |
109 static inline void kasan_kmalloc_large(void *ptr, size_t size, gfp_t flags) {} | 171 static inline int kasan_kmalloc_large(void *ptr, size_t size, |
| 172 » » » » gfp_t flags) { return 0; } |
110 static inline void kasan_kfree_large(const void *ptr) {} | 173 static inline void kasan_kfree_large(const void *ptr) {} |
111 static inline void kasan_poison_kfree(void *ptr) {} | 174 static inline void kasan_poison_kfree(void *ptr) {} |
112 static inline void kasan_kmalloc(struct kmem_cache *s, const void *object, | 175 static inline void kasan_kmalloc(struct kmem_cache *s, const void *object, |
113 size_t size, gfp_t flags) {} | 176 size_t size, gfp_t flags) {} |
114 static inline void kasan_krealloc(const void *object, size_t new_size, | 177 static inline void kasan_krealloc(const void *object, size_t new_size, |
115 gfp_t flags) {} | 178 gfp_t flags) {} |
116 | 179 |
117 static inline void kasan_slab_alloc(struct kmem_cache *s, void *object, | 180 static inline void kasan_slab_alloc(struct kmem_cache *s, void *object, |
118 gfp_t flags) {} | 181 gfp_t flags) {} |
119 static inline bool kasan_slab_free(struct kmem_cache *s, void *object) | 182 static inline bool kasan_slab_free(struct kmem_cache *s, void *object) |
120 { | 183 { |
121 return false; | 184 return false; |
122 } | 185 } |
123 | 186 |
124 static inline int kasan_module_alloc(void *addr, size_t size) { return 0; } | 187 static inline int kasan_module_alloc(void *addr, size_t size) { return 0; } |
125 static inline void kasan_free_shadow(const struct vm_struct *vm) {} | 188 static inline void kasan_free_shadow(const struct vm_struct *vm) {} |
126 | 189 |
127 static inline void kasan_unpoison_slab(const void *ptr) { } | 190 static inline void kasan_unpoison_slab(const void *ptr) { } |
128 static inline size_t kasan_metadata_size(struct kmem_cache *cache) { return 0; } | 191 static inline size_t kasan_metadata_size(struct kmem_cache *cache) { return 0; } |
129 | 192 |
130 #endif /* CONFIG_KASAN */ | 193 #endif /* CONFIG_KASAN */ |
131 | 194 |
132 #endif /* LINUX_KASAN_H */ | 195 #endif /* LINUX_KASAN_H */ |
OLD | NEW |