10b24beccSAndrey Ryabinin #ifndef _LINUX_KASAN_H 20b24beccSAndrey Ryabinin #define _LINUX_KASAN_H 30b24beccSAndrey Ryabinin 40b24beccSAndrey Ryabinin #include <linux/types.h> 50b24beccSAndrey Ryabinin 60b24beccSAndrey Ryabinin struct kmem_cache; 70b24beccSAndrey Ryabinin struct page; 8a5af5aa8SAndrey Ryabinin struct vm_struct; 90b24beccSAndrey Ryabinin 100b24beccSAndrey Ryabinin #ifdef CONFIG_KASAN 110b24beccSAndrey Ryabinin 120b24beccSAndrey Ryabinin #define KASAN_SHADOW_SCALE_SHIFT 3 130b24beccSAndrey Ryabinin 140b24beccSAndrey Ryabinin #include <asm/kasan.h> 15*69786cdbSAndrey Ryabinin #include <asm/pgtable.h> 160b24beccSAndrey Ryabinin #include <linux/sched.h> 170b24beccSAndrey Ryabinin 18*69786cdbSAndrey Ryabinin extern unsigned char kasan_zero_page[PAGE_SIZE]; 19*69786cdbSAndrey Ryabinin extern pte_t kasan_zero_pte[PTRS_PER_PTE]; 20*69786cdbSAndrey Ryabinin extern pmd_t kasan_zero_pmd[PTRS_PER_PMD]; 21*69786cdbSAndrey Ryabinin extern pud_t kasan_zero_pud[PTRS_PER_PUD]; 22*69786cdbSAndrey Ryabinin 23*69786cdbSAndrey Ryabinin void kasan_populate_zero_shadow(const void *shadow_start, 24*69786cdbSAndrey Ryabinin const void *shadow_end); 25*69786cdbSAndrey Ryabinin 260b24beccSAndrey Ryabinin static inline void *kasan_mem_to_shadow(const void *addr) 270b24beccSAndrey Ryabinin { 280b24beccSAndrey Ryabinin return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT) 290b24beccSAndrey Ryabinin + KASAN_SHADOW_OFFSET; 300b24beccSAndrey Ryabinin } 310b24beccSAndrey Ryabinin 320b24beccSAndrey Ryabinin /* Enable reporting bugs after kasan_disable_current() */ 330b24beccSAndrey Ryabinin static inline void kasan_enable_current(void) 340b24beccSAndrey Ryabinin { 350b24beccSAndrey Ryabinin current->kasan_depth++; 360b24beccSAndrey Ryabinin } 370b24beccSAndrey Ryabinin 380b24beccSAndrey Ryabinin /* Disable reporting bugs for current task */ 390b24beccSAndrey Ryabinin static inline void kasan_disable_current(void) 400b24beccSAndrey Ryabinin { 410b24beccSAndrey Ryabinin current->kasan_depth--; 420b24beccSAndrey Ryabinin } 430b24beccSAndrey Ryabinin 440b24beccSAndrey Ryabinin void kasan_unpoison_shadow(const void *address, size_t size); 450b24beccSAndrey Ryabinin 46b8c73fc2SAndrey Ryabinin void kasan_alloc_pages(struct page *page, unsigned int order); 47b8c73fc2SAndrey Ryabinin void kasan_free_pages(struct page *page, unsigned int order); 48b8c73fc2SAndrey Ryabinin 490316bec2SAndrey Ryabinin void kasan_poison_slab(struct page *page); 500316bec2SAndrey Ryabinin void kasan_unpoison_object_data(struct kmem_cache *cache, void *object); 510316bec2SAndrey Ryabinin void kasan_poison_object_data(struct kmem_cache *cache, void *object); 520316bec2SAndrey Ryabinin 530316bec2SAndrey Ryabinin void kasan_kmalloc_large(const void *ptr, size_t size); 540316bec2SAndrey Ryabinin void kasan_kfree_large(const void *ptr); 5592393615SAndrey Ryabinin void kasan_kfree(void *ptr); 560316bec2SAndrey Ryabinin void kasan_kmalloc(struct kmem_cache *s, const void *object, size_t size); 570316bec2SAndrey Ryabinin void kasan_krealloc(const void *object, size_t new_size); 580316bec2SAndrey Ryabinin 590316bec2SAndrey Ryabinin void kasan_slab_alloc(struct kmem_cache *s, void *object); 600316bec2SAndrey Ryabinin void kasan_slab_free(struct kmem_cache *s, void *object); 610316bec2SAndrey Ryabinin 62bebf56a1SAndrey Ryabinin int kasan_module_alloc(void *addr, size_t size); 63a5af5aa8SAndrey Ryabinin void kasan_free_shadow(const struct vm_struct *vm); 64bebf56a1SAndrey Ryabinin 650b24beccSAndrey Ryabinin #else /* CONFIG_KASAN */ 660b24beccSAndrey Ryabinin 670b24beccSAndrey Ryabinin static inline void kasan_unpoison_shadow(const void *address, size_t size) {} 680b24beccSAndrey Ryabinin 690b24beccSAndrey Ryabinin static inline void kasan_enable_current(void) {} 700b24beccSAndrey Ryabinin static inline void kasan_disable_current(void) {} 710b24beccSAndrey Ryabinin 72b8c73fc2SAndrey Ryabinin static inline void kasan_alloc_pages(struct page *page, unsigned int order) {} 73b8c73fc2SAndrey Ryabinin static inline void kasan_free_pages(struct page *page, unsigned int order) {} 74b8c73fc2SAndrey Ryabinin 750316bec2SAndrey Ryabinin static inline void kasan_poison_slab(struct page *page) {} 760316bec2SAndrey Ryabinin static inline void kasan_unpoison_object_data(struct kmem_cache *cache, 770316bec2SAndrey Ryabinin void *object) {} 780316bec2SAndrey Ryabinin static inline void kasan_poison_object_data(struct kmem_cache *cache, 790316bec2SAndrey Ryabinin void *object) {} 800316bec2SAndrey Ryabinin 810316bec2SAndrey Ryabinin static inline void kasan_kmalloc_large(void *ptr, size_t size) {} 820316bec2SAndrey Ryabinin static inline void kasan_kfree_large(const void *ptr) {} 8392393615SAndrey Ryabinin static inline void kasan_kfree(void *ptr) {} 840316bec2SAndrey Ryabinin static inline void kasan_kmalloc(struct kmem_cache *s, const void *object, 850316bec2SAndrey Ryabinin size_t size) {} 860316bec2SAndrey Ryabinin static inline void kasan_krealloc(const void *object, size_t new_size) {} 870316bec2SAndrey Ryabinin 880316bec2SAndrey Ryabinin static inline void kasan_slab_alloc(struct kmem_cache *s, void *object) {} 890316bec2SAndrey Ryabinin static inline void kasan_slab_free(struct kmem_cache *s, void *object) {} 900316bec2SAndrey Ryabinin 91bebf56a1SAndrey Ryabinin static inline int kasan_module_alloc(void *addr, size_t size) { return 0; } 92a5af5aa8SAndrey Ryabinin static inline void kasan_free_shadow(const struct vm_struct *vm) {} 93bebf56a1SAndrey Ryabinin 940b24beccSAndrey Ryabinin #endif /* CONFIG_KASAN */ 950b24beccSAndrey Ryabinin 960b24beccSAndrey Ryabinin #endif /* LINUX_KASAN_H */ 97