Merge branch 'stable/for-linus-4.11' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-block.git] / include / linux / kasan.h
CommitLineData
0b24becc
AR
1#ifndef _LINUX_KASAN_H
2#define _LINUX_KASAN_H
3
4#include <linux/types.h>
5
6struct kmem_cache;
7struct page;
a5af5aa8 8struct vm_struct;
0b24becc
AR
9
10#ifdef CONFIG_KASAN
11
12#define KASAN_SHADOW_SCALE_SHIFT 3
0b24becc
AR
13
14#include <asm/kasan.h>
69786cdb 15#include <asm/pgtable.h>
0b24becc 16
69786cdb
AR
17extern unsigned char kasan_zero_page[PAGE_SIZE];
18extern pte_t kasan_zero_pte[PTRS_PER_PTE];
19extern pmd_t kasan_zero_pmd[PTRS_PER_PMD];
20extern pud_t kasan_zero_pud[PTRS_PER_PUD];
21
22void kasan_populate_zero_shadow(const void *shadow_start,
23 const void *shadow_end);
24
0b24becc
AR
25static inline void *kasan_mem_to_shadow(const void *addr)
26{
27 return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT)
28 + KASAN_SHADOW_OFFSET;
29}
30
31/* Enable reporting bugs after kasan_disable_current() */
af8601ad 32extern void kasan_enable_current(void);
0b24becc
AR
33
34/* Disable reporting bugs for current task */
af8601ad 35extern void kasan_disable_current(void);
0b24becc
AR
36
37void kasan_unpoison_shadow(const void *address, size_t size);
38
e3ae1163 39void kasan_unpoison_task_stack(struct task_struct *task);
9f7d416c 40void kasan_unpoison_stack_above_sp_to(const void *watermark);
e3ae1163 41
b8c73fc2
AR
42void kasan_alloc_pages(struct page *page, unsigned int order);
43void kasan_free_pages(struct page *page, unsigned int order);
44
7ed2f9e6
AP
45void kasan_cache_create(struct kmem_cache *cache, size_t *size,
46 unsigned long *flags);
55834c59 47void kasan_cache_shrink(struct kmem_cache *cache);
f9fa1d91 48void kasan_cache_shutdown(struct kmem_cache *cache);
7ed2f9e6 49
0316bec2
AR
50void kasan_poison_slab(struct page *page);
51void kasan_unpoison_object_data(struct kmem_cache *cache, void *object);
52void kasan_poison_object_data(struct kmem_cache *cache, void *object);
b3cbd9bf 53void kasan_init_slab_obj(struct kmem_cache *cache, const void *object);
0316bec2 54
505f5dcb 55void kasan_kmalloc_large(const void *ptr, size_t size, gfp_t flags);
0316bec2 56void kasan_kfree_large(const void *ptr);
9b75a867 57void kasan_poison_kfree(void *ptr);
505f5dcb
AP
58void kasan_kmalloc(struct kmem_cache *s, const void *object, size_t size,
59 gfp_t flags);
60void kasan_krealloc(const void *object, size_t new_size, gfp_t flags);
0316bec2 61
505f5dcb 62void kasan_slab_alloc(struct kmem_cache *s, void *object, gfp_t flags);
55834c59 63bool kasan_slab_free(struct kmem_cache *s, void *object);
0316bec2 64
7ed2f9e6
AP
65struct kasan_cache {
66 int alloc_meta_offset;
67 int free_meta_offset;
68};
69
bebf56a1 70int kasan_module_alloc(void *addr, size_t size);
a5af5aa8 71void kasan_free_shadow(const struct vm_struct *vm);
bebf56a1 72
9b75a867
AR
73size_t ksize(const void *);
74static inline void kasan_unpoison_slab(const void *ptr) { ksize(ptr); }
80a9201a 75size_t kasan_metadata_size(struct kmem_cache *cache);
9b75a867 76
0b24becc
AR
77#else /* CONFIG_KASAN */
78
79static inline void kasan_unpoison_shadow(const void *address, size_t size) {}
80
e3ae1163 81static inline void kasan_unpoison_task_stack(struct task_struct *task) {}
9f7d416c 82static inline void kasan_unpoison_stack_above_sp_to(const void *watermark) {}
e3ae1163 83
0b24becc
AR
84static inline void kasan_enable_current(void) {}
85static inline void kasan_disable_current(void) {}
86
b8c73fc2
AR
87static inline void kasan_alloc_pages(struct page *page, unsigned int order) {}
88static inline void kasan_free_pages(struct page *page, unsigned int order) {}
89
7ed2f9e6
AP
90static inline void kasan_cache_create(struct kmem_cache *cache,
91 size_t *size,
92 unsigned long *flags) {}
55834c59 93static inline void kasan_cache_shrink(struct kmem_cache *cache) {}
f9fa1d91 94static inline void kasan_cache_shutdown(struct kmem_cache *cache) {}
7ed2f9e6 95
0316bec2
AR
96static inline void kasan_poison_slab(struct page *page) {}
97static inline void kasan_unpoison_object_data(struct kmem_cache *cache,
98 void *object) {}
99static inline void kasan_poison_object_data(struct kmem_cache *cache,
100 void *object) {}
b3cbd9bf
AR
101static inline void kasan_init_slab_obj(struct kmem_cache *cache,
102 const void *object) {}
0316bec2 103
505f5dcb 104static inline void kasan_kmalloc_large(void *ptr, size_t size, gfp_t flags) {}
0316bec2 105static inline void kasan_kfree_large(const void *ptr) {}
9b75a867 106static inline void kasan_poison_kfree(void *ptr) {}
0316bec2 107static inline void kasan_kmalloc(struct kmem_cache *s, const void *object,
505f5dcb
AP
108 size_t size, gfp_t flags) {}
109static inline void kasan_krealloc(const void *object, size_t new_size,
110 gfp_t flags) {}
0316bec2 111
505f5dcb
AP
112static inline void kasan_slab_alloc(struct kmem_cache *s, void *object,
113 gfp_t flags) {}
55834c59
AP
114static inline bool kasan_slab_free(struct kmem_cache *s, void *object)
115{
116 return false;
117}
0316bec2 118
bebf56a1 119static inline int kasan_module_alloc(void *addr, size_t size) { return 0; }
a5af5aa8 120static inline void kasan_free_shadow(const struct vm_struct *vm) {}
bebf56a1 121
9b75a867 122static inline void kasan_unpoison_slab(const void *ptr) { }
80a9201a 123static inline size_t kasan_metadata_size(struct kmem_cache *cache) { return 0; }
9b75a867 124
0b24becc
AR
125#endif /* CONFIG_KASAN */
126
127#endif /* LINUX_KASAN_H */