1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 20b24beccSAndrey Ryabinin #ifndef _LINUX_KASAN_H 30b24beccSAndrey Ryabinin #define _LINUX_KASAN_H 40b24beccSAndrey Ryabinin 534303244SAndrey Konovalov #include <linux/static_key.h> 60b24beccSAndrey Ryabinin #include <linux/types.h> 70b24beccSAndrey Ryabinin 80b24beccSAndrey Ryabinin struct kmem_cache; 90b24beccSAndrey Ryabinin struct page; 10a5af5aa8SAndrey Ryabinin struct vm_struct; 115be9b730SMasami Hiramatsu struct task_struct; 120b24beccSAndrey Ryabinin 130b24beccSAndrey Ryabinin #ifdef CONFIG_KASAN 140b24beccSAndrey Ryabinin 15d5750edfSAndrey Konovalov #include <linux/linkage.h> 1665fddcfcSMike Rapoport #include <asm/kasan.h> 170b24beccSAndrey Ryabinin 1883c4e7a0SPatricia Alfonso /* kasan_data struct is used in KUnit tests for KASAN expected failures */ 1983c4e7a0SPatricia Alfonso struct kunit_kasan_expectation { 2083c4e7a0SPatricia Alfonso bool report_expected; 2183c4e7a0SPatricia Alfonso bool report_found; 2283c4e7a0SPatricia Alfonso }; 2383c4e7a0SPatricia Alfonso 24d5750edfSAndrey Konovalov #endif 25d5750edfSAndrey Konovalov 26d5750edfSAndrey Konovalov #if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) 27d5750edfSAndrey Konovalov 28d5750edfSAndrey Konovalov #include <linux/pgtable.h> 29d5750edfSAndrey Konovalov 30d5750edfSAndrey Konovalov /* Software KASAN implementations use shadow memory. */ 31d5750edfSAndrey Konovalov 32d5750edfSAndrey Konovalov #ifdef CONFIG_KASAN_SW_TAGS 33d5750edfSAndrey Konovalov #define KASAN_SHADOW_INIT 0xFF 34d5750edfSAndrey Konovalov #else 35d5750edfSAndrey Konovalov #define KASAN_SHADOW_INIT 0 36d5750edfSAndrey Konovalov #endif 37d5750edfSAndrey Konovalov 389577dd74SAndrey Konovalov extern unsigned char kasan_early_shadow_page[PAGE_SIZE]; 399577dd74SAndrey Konovalov extern pte_t kasan_early_shadow_pte[PTRS_PER_PTE]; 409577dd74SAndrey Konovalov extern pmd_t kasan_early_shadow_pmd[PTRS_PER_PMD]; 419577dd74SAndrey Konovalov extern pud_t kasan_early_shadow_pud[PTRS_PER_PUD]; 429577dd74SAndrey Konovalov extern p4d_t kasan_early_shadow_p4d[MAX_PTRS_PER_P4D]; 4369786cdbSAndrey Ryabinin 449577dd74SAndrey Konovalov int kasan_populate_early_shadow(const void *shadow_start, 4569786cdbSAndrey Ryabinin const void *shadow_end); 4669786cdbSAndrey Ryabinin 470b24beccSAndrey Ryabinin static inline void *kasan_mem_to_shadow(const void *addr) 480b24beccSAndrey Ryabinin { 490b24beccSAndrey Ryabinin return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT) 500b24beccSAndrey Ryabinin + KASAN_SHADOW_OFFSET; 510b24beccSAndrey Ryabinin } 520b24beccSAndrey Ryabinin 53d5750edfSAndrey Konovalov int kasan_add_zero_shadow(void *start, unsigned long size); 54d5750edfSAndrey Konovalov void kasan_remove_zero_shadow(void *start, unsigned long size); 55d5750edfSAndrey Konovalov 56d73b4936SAndrey Konovalov /* Enable reporting bugs after kasan_disable_current() */ 57d73b4936SAndrey Konovalov extern void kasan_enable_current(void); 58d73b4936SAndrey Konovalov 59d73b4936SAndrey Konovalov /* Disable reporting bugs for current task */ 60d73b4936SAndrey Konovalov extern void kasan_disable_current(void); 61d73b4936SAndrey Konovalov 62d5750edfSAndrey Konovalov #else /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ 63d5750edfSAndrey Konovalov 64d5750edfSAndrey Konovalov static inline int kasan_add_zero_shadow(void *start, unsigned long size) 65d5750edfSAndrey Konovalov { 66d5750edfSAndrey Konovalov return 0; 67d5750edfSAndrey Konovalov } 68d5750edfSAndrey Konovalov static inline void kasan_remove_zero_shadow(void *start, 69d5750edfSAndrey Konovalov unsigned long size) 70d5750edfSAndrey Konovalov {} 71d5750edfSAndrey Konovalov 72d73b4936SAndrey Konovalov static inline void kasan_enable_current(void) {} 73d73b4936SAndrey Konovalov static inline void kasan_disable_current(void) {} 74d73b4936SAndrey Konovalov 75d5750edfSAndrey Konovalov #endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ 76d5750edfSAndrey Konovalov 77d5750edfSAndrey Konovalov #ifdef CONFIG_KASAN 78d5750edfSAndrey Konovalov 797ed2f9e6SAlexander Potapenko struct kasan_cache { 807ed2f9e6SAlexander Potapenko int alloc_meta_offset; 817ed2f9e6SAlexander Potapenko int free_meta_offset; 827ed2f9e6SAlexander Potapenko }; 837ed2f9e6SAlexander Potapenko 8434303244SAndrey Konovalov #ifdef CONFIG_KASAN_HW_TAGS 85*e86f8b09SAndrey Konovalov 8634303244SAndrey Konovalov DECLARE_STATIC_KEY_FALSE(kasan_flag_enabled); 87*e86f8b09SAndrey Konovalov 8834303244SAndrey Konovalov static __always_inline bool kasan_enabled(void) 8934303244SAndrey Konovalov { 9034303244SAndrey Konovalov return static_branch_likely(&kasan_flag_enabled); 9134303244SAndrey Konovalov } 92*e86f8b09SAndrey Konovalov 93*e86f8b09SAndrey Konovalov #else /* CONFIG_KASAN_HW_TAGS */ 94*e86f8b09SAndrey Konovalov 9534303244SAndrey Konovalov static inline bool kasan_enabled(void) 9634303244SAndrey Konovalov { 9734303244SAndrey Konovalov return true; 9834303244SAndrey Konovalov } 99*e86f8b09SAndrey Konovalov 100*e86f8b09SAndrey Konovalov #endif /* CONFIG_KASAN_HW_TAGS */ 101*e86f8b09SAndrey Konovalov 102*e86f8b09SAndrey Konovalov slab_flags_t __kasan_never_merge(void); 103*e86f8b09SAndrey Konovalov static __always_inline slab_flags_t kasan_never_merge(void) 104*e86f8b09SAndrey Konovalov { 105*e86f8b09SAndrey Konovalov if (kasan_enabled()) 106*e86f8b09SAndrey Konovalov return __kasan_never_merge(); 107*e86f8b09SAndrey Konovalov return 0; 108*e86f8b09SAndrey Konovalov } 10934303244SAndrey Konovalov 11034303244SAndrey Konovalov void __kasan_unpoison_range(const void *addr, size_t size); 11134303244SAndrey Konovalov static __always_inline void kasan_unpoison_range(const void *addr, size_t size) 11234303244SAndrey Konovalov { 11334303244SAndrey Konovalov if (kasan_enabled()) 11434303244SAndrey Konovalov __kasan_unpoison_range(addr, size); 11534303244SAndrey Konovalov } 11634303244SAndrey Konovalov 11734303244SAndrey Konovalov void __kasan_alloc_pages(struct page *page, unsigned int order); 11834303244SAndrey Konovalov static __always_inline void kasan_alloc_pages(struct page *page, 11934303244SAndrey Konovalov unsigned int order) 12034303244SAndrey Konovalov { 12134303244SAndrey Konovalov if (kasan_enabled()) 12234303244SAndrey Konovalov __kasan_alloc_pages(page, order); 12334303244SAndrey Konovalov } 12434303244SAndrey Konovalov 12534303244SAndrey Konovalov void __kasan_free_pages(struct page *page, unsigned int order); 12634303244SAndrey Konovalov static __always_inline void kasan_free_pages(struct page *page, 12734303244SAndrey Konovalov unsigned int order) 12834303244SAndrey Konovalov { 12934303244SAndrey Konovalov if (kasan_enabled()) 13034303244SAndrey Konovalov __kasan_free_pages(page, order); 13134303244SAndrey Konovalov } 13234303244SAndrey Konovalov 13334303244SAndrey Konovalov void __kasan_cache_create(struct kmem_cache *cache, unsigned int *size, 13434303244SAndrey Konovalov slab_flags_t *flags); 13534303244SAndrey Konovalov static __always_inline void kasan_cache_create(struct kmem_cache *cache, 13634303244SAndrey Konovalov unsigned int *size, slab_flags_t *flags) 13734303244SAndrey Konovalov { 13834303244SAndrey Konovalov if (kasan_enabled()) 13934303244SAndrey Konovalov __kasan_cache_create(cache, size, flags); 14034303244SAndrey Konovalov } 14134303244SAndrey Konovalov 14234303244SAndrey Konovalov size_t __kasan_metadata_size(struct kmem_cache *cache); 14334303244SAndrey Konovalov static __always_inline size_t kasan_metadata_size(struct kmem_cache *cache) 14434303244SAndrey Konovalov { 14534303244SAndrey Konovalov if (kasan_enabled()) 14634303244SAndrey Konovalov return __kasan_metadata_size(cache); 14734303244SAndrey Konovalov return 0; 14834303244SAndrey Konovalov } 14934303244SAndrey Konovalov 15034303244SAndrey Konovalov void __kasan_poison_slab(struct page *page); 15134303244SAndrey Konovalov static __always_inline void kasan_poison_slab(struct page *page) 15234303244SAndrey Konovalov { 15334303244SAndrey Konovalov if (kasan_enabled()) 15434303244SAndrey Konovalov __kasan_poison_slab(page); 15534303244SAndrey Konovalov } 15634303244SAndrey Konovalov 15734303244SAndrey Konovalov void __kasan_unpoison_object_data(struct kmem_cache *cache, void *object); 15834303244SAndrey Konovalov static __always_inline void kasan_unpoison_object_data(struct kmem_cache *cache, 15934303244SAndrey Konovalov void *object) 16034303244SAndrey Konovalov { 16134303244SAndrey Konovalov if (kasan_enabled()) 16234303244SAndrey Konovalov __kasan_unpoison_object_data(cache, object); 16334303244SAndrey Konovalov } 16434303244SAndrey Konovalov 16534303244SAndrey Konovalov void __kasan_poison_object_data(struct kmem_cache *cache, void *object); 16634303244SAndrey Konovalov static __always_inline void kasan_poison_object_data(struct kmem_cache *cache, 16734303244SAndrey Konovalov void *object) 16834303244SAndrey Konovalov { 16934303244SAndrey Konovalov if (kasan_enabled()) 17034303244SAndrey Konovalov __kasan_poison_object_data(cache, object); 17134303244SAndrey Konovalov } 17234303244SAndrey Konovalov 17334303244SAndrey Konovalov void * __must_check __kasan_init_slab_obj(struct kmem_cache *cache, 17434303244SAndrey Konovalov const void *object); 17534303244SAndrey Konovalov static __always_inline void * __must_check kasan_init_slab_obj( 17634303244SAndrey Konovalov struct kmem_cache *cache, const void *object) 17734303244SAndrey Konovalov { 17834303244SAndrey Konovalov if (kasan_enabled()) 17934303244SAndrey Konovalov return __kasan_init_slab_obj(cache, object); 18034303244SAndrey Konovalov return (void *)object; 18134303244SAndrey Konovalov } 18234303244SAndrey Konovalov 18334303244SAndrey Konovalov bool __kasan_slab_free(struct kmem_cache *s, void *object, unsigned long ip); 18434303244SAndrey Konovalov static __always_inline bool kasan_slab_free(struct kmem_cache *s, void *object, 18534303244SAndrey Konovalov unsigned long ip) 18634303244SAndrey Konovalov { 18734303244SAndrey Konovalov if (kasan_enabled()) 18834303244SAndrey Konovalov return __kasan_slab_free(s, object, ip); 18934303244SAndrey Konovalov return false; 19034303244SAndrey Konovalov } 19134303244SAndrey Konovalov 192eeb3160cSAndrey Konovalov void __kasan_slab_free_mempool(void *ptr, unsigned long ip); 193eeb3160cSAndrey Konovalov static __always_inline void kasan_slab_free_mempool(void *ptr, unsigned long ip) 194eeb3160cSAndrey Konovalov { 195eeb3160cSAndrey Konovalov if (kasan_enabled()) 196eeb3160cSAndrey Konovalov __kasan_slab_free_mempool(ptr, ip); 197eeb3160cSAndrey Konovalov } 198eeb3160cSAndrey Konovalov 19934303244SAndrey Konovalov void * __must_check __kasan_slab_alloc(struct kmem_cache *s, 20034303244SAndrey Konovalov void *object, gfp_t flags); 20134303244SAndrey Konovalov static __always_inline void * __must_check kasan_slab_alloc( 20234303244SAndrey Konovalov struct kmem_cache *s, void *object, gfp_t flags) 20334303244SAndrey Konovalov { 20434303244SAndrey Konovalov if (kasan_enabled()) 20534303244SAndrey Konovalov return __kasan_slab_alloc(s, object, flags); 20634303244SAndrey Konovalov return object; 20734303244SAndrey Konovalov } 20834303244SAndrey Konovalov 20934303244SAndrey Konovalov void * __must_check __kasan_kmalloc(struct kmem_cache *s, const void *object, 21034303244SAndrey Konovalov size_t size, gfp_t flags); 21134303244SAndrey Konovalov static __always_inline void * __must_check kasan_kmalloc(struct kmem_cache *s, 21234303244SAndrey Konovalov const void *object, size_t size, gfp_t flags) 21334303244SAndrey Konovalov { 21434303244SAndrey Konovalov if (kasan_enabled()) 21534303244SAndrey Konovalov return __kasan_kmalloc(s, object, size, flags); 21634303244SAndrey Konovalov return (void *)object; 21734303244SAndrey Konovalov } 21834303244SAndrey Konovalov 21934303244SAndrey Konovalov void * __must_check __kasan_kmalloc_large(const void *ptr, 22034303244SAndrey Konovalov size_t size, gfp_t flags); 22134303244SAndrey Konovalov static __always_inline void * __must_check kasan_kmalloc_large(const void *ptr, 22234303244SAndrey Konovalov size_t size, gfp_t flags) 22334303244SAndrey Konovalov { 22434303244SAndrey Konovalov if (kasan_enabled()) 22534303244SAndrey Konovalov return __kasan_kmalloc_large(ptr, size, flags); 22634303244SAndrey Konovalov return (void *)ptr; 22734303244SAndrey Konovalov } 22834303244SAndrey Konovalov 22934303244SAndrey Konovalov void * __must_check __kasan_krealloc(const void *object, 23034303244SAndrey Konovalov size_t new_size, gfp_t flags); 23134303244SAndrey Konovalov static __always_inline void * __must_check kasan_krealloc(const void *object, 23234303244SAndrey Konovalov size_t new_size, gfp_t flags) 23334303244SAndrey Konovalov { 23434303244SAndrey Konovalov if (kasan_enabled()) 23534303244SAndrey Konovalov return __kasan_krealloc(object, new_size, flags); 23634303244SAndrey Konovalov return (void *)object; 23734303244SAndrey Konovalov } 23834303244SAndrey Konovalov 23934303244SAndrey Konovalov void __kasan_kfree_large(void *ptr, unsigned long ip); 24034303244SAndrey Konovalov static __always_inline void kasan_kfree_large(void *ptr, unsigned long ip) 24134303244SAndrey Konovalov { 24234303244SAndrey Konovalov if (kasan_enabled()) 24334303244SAndrey Konovalov __kasan_kfree_large(ptr, ip); 24434303244SAndrey Konovalov } 2459b75a867SAndrey Ryabinin 246b0845ce5SMark Rutland bool kasan_save_enable_multi_shot(void); 247b0845ce5SMark Rutland void kasan_restore_multi_shot(bool enabled); 248b0845ce5SMark Rutland 2490b24beccSAndrey Ryabinin #else /* CONFIG_KASAN */ 2500b24beccSAndrey Ryabinin 25134303244SAndrey Konovalov static inline bool kasan_enabled(void) 25234303244SAndrey Konovalov { 25334303244SAndrey Konovalov return false; 25434303244SAndrey Konovalov } 255*e86f8b09SAndrey Konovalov static inline slab_flags_t kasan_never_merge(void) 256*e86f8b09SAndrey Konovalov { 257*e86f8b09SAndrey Konovalov return 0; 258*e86f8b09SAndrey Konovalov } 259cebd0eb2SAndrey Konovalov static inline void kasan_unpoison_range(const void *address, size_t size) {} 260b8c73fc2SAndrey Ryabinin static inline void kasan_alloc_pages(struct page *page, unsigned int order) {} 261b8c73fc2SAndrey Ryabinin static inline void kasan_free_pages(struct page *page, unsigned int order) {} 2627ed2f9e6SAlexander Potapenko static inline void kasan_cache_create(struct kmem_cache *cache, 263be4a7988SAlexey Dobriyan unsigned int *size, 264d50112edSAlexey Dobriyan slab_flags_t *flags) {} 26534303244SAndrey Konovalov static inline size_t kasan_metadata_size(struct kmem_cache *cache) { return 0; } 2660316bec2SAndrey Ryabinin static inline void kasan_poison_slab(struct page *page) {} 2670316bec2SAndrey Ryabinin static inline void kasan_unpoison_object_data(struct kmem_cache *cache, 2680316bec2SAndrey Ryabinin void *object) {} 2690316bec2SAndrey Ryabinin static inline void kasan_poison_object_data(struct kmem_cache *cache, 2700316bec2SAndrey Ryabinin void *object) {} 2710116523cSAndrey Konovalov static inline void *kasan_init_slab_obj(struct kmem_cache *cache, 2720116523cSAndrey Konovalov const void *object) 2730116523cSAndrey Konovalov { 2740116523cSAndrey Konovalov return (void *)object; 2750116523cSAndrey Konovalov } 27634303244SAndrey Konovalov static inline bool kasan_slab_free(struct kmem_cache *s, void *object, 27734303244SAndrey Konovalov unsigned long ip) 2780116523cSAndrey Konovalov { 27934303244SAndrey Konovalov return false; 2800116523cSAndrey Konovalov } 281eeb3160cSAndrey Konovalov static inline void kasan_slab_free_mempool(void *ptr, unsigned long ip) {} 28234303244SAndrey Konovalov static inline void *kasan_slab_alloc(struct kmem_cache *s, void *object, 28334303244SAndrey Konovalov gfp_t flags) 28434303244SAndrey Konovalov { 28534303244SAndrey Konovalov return object; 28634303244SAndrey Konovalov } 2870116523cSAndrey Konovalov static inline void *kasan_kmalloc(struct kmem_cache *s, const void *object, 2880116523cSAndrey Konovalov size_t size, gfp_t flags) 2890116523cSAndrey Konovalov { 2900116523cSAndrey Konovalov return (void *)object; 2910116523cSAndrey Konovalov } 29234303244SAndrey Konovalov static inline void *kasan_kmalloc_large(const void *ptr, size_t size, gfp_t flags) 29334303244SAndrey Konovalov { 29434303244SAndrey Konovalov return (void *)ptr; 29534303244SAndrey Konovalov } 2960116523cSAndrey Konovalov static inline void *kasan_krealloc(const void *object, size_t new_size, 2970116523cSAndrey Konovalov gfp_t flags) 2980116523cSAndrey Konovalov { 2990116523cSAndrey Konovalov return (void *)object; 3000116523cSAndrey Konovalov } 30134303244SAndrey Konovalov static inline void kasan_kfree_large(void *ptr, unsigned long ip) {} 3029b75a867SAndrey Ryabinin 3030b24beccSAndrey Ryabinin #endif /* CONFIG_KASAN */ 3040b24beccSAndrey Ryabinin 305d56a9ef8SAndrey Konovalov #if defined(CONFIG_KASAN) && CONFIG_KASAN_STACK 306d56a9ef8SAndrey Konovalov void kasan_unpoison_task_stack(struct task_struct *task); 307d56a9ef8SAndrey Konovalov #else 308d56a9ef8SAndrey Konovalov static inline void kasan_unpoison_task_stack(struct task_struct *task) {} 309d56a9ef8SAndrey Konovalov #endif 310d56a9ef8SAndrey Konovalov 3112bd926b4SAndrey Konovalov #ifdef CONFIG_KASAN_GENERIC 3122bd926b4SAndrey Konovalov 3132bd926b4SAndrey Konovalov void kasan_cache_shrink(struct kmem_cache *cache); 3142bd926b4SAndrey Konovalov void kasan_cache_shutdown(struct kmem_cache *cache); 31526e760c9SWalter Wu void kasan_record_aux_stack(void *ptr); 3162bd926b4SAndrey Konovalov 3172bd926b4SAndrey Konovalov #else /* CONFIG_KASAN_GENERIC */ 3182bd926b4SAndrey Konovalov 3192bd926b4SAndrey Konovalov static inline void kasan_cache_shrink(struct kmem_cache *cache) {} 3202bd926b4SAndrey Konovalov static inline void kasan_cache_shutdown(struct kmem_cache *cache) {} 32126e760c9SWalter Wu static inline void kasan_record_aux_stack(void *ptr) {} 3222bd926b4SAndrey Konovalov 3232bd926b4SAndrey Konovalov #endif /* CONFIG_KASAN_GENERIC */ 3242bd926b4SAndrey Konovalov 3252e903b91SAndrey Konovalov #if defined(CONFIG_KASAN_SW_TAGS) || defined(CONFIG_KASAN_HW_TAGS) 3263c9e3aa1SAndrey Konovalov 327c0054c56SAndrey Konovalov static inline void *kasan_reset_tag(const void *addr) 328c0054c56SAndrey Konovalov { 329c0054c56SAndrey Konovalov return (void *)arch_kasan_reset_tag(addr); 330c0054c56SAndrey Konovalov } 3313c9e3aa1SAndrey Konovalov 3328cceeff4SWalter Wu bool kasan_report(unsigned long addr, size_t size, 33341eea9cdSAndrey Konovalov bool is_write, unsigned long ip); 33441eea9cdSAndrey Konovalov 3352e903b91SAndrey Konovalov #else /* CONFIG_KASAN_SW_TAGS || CONFIG_KASAN_HW_TAGS */ 3363c9e3aa1SAndrey Konovalov 3373c9e3aa1SAndrey Konovalov static inline void *kasan_reset_tag(const void *addr) 3383c9e3aa1SAndrey Konovalov { 3393c9e3aa1SAndrey Konovalov return (void *)addr; 3403c9e3aa1SAndrey Konovalov } 3413c9e3aa1SAndrey Konovalov 3422e903b91SAndrey Konovalov #endif /* CONFIG_KASAN_SW_TAGS || CONFIG_KASAN_HW_TAGS*/ 3432e903b91SAndrey Konovalov 3442e903b91SAndrey Konovalov #ifdef CONFIG_KASAN_SW_TAGS 3452e903b91SAndrey Konovalov void __init kasan_init_sw_tags(void); 3462e903b91SAndrey Konovalov #else 3472e903b91SAndrey Konovalov static inline void kasan_init_sw_tags(void) { } 3482e903b91SAndrey Konovalov #endif 3492e903b91SAndrey Konovalov 3502e903b91SAndrey Konovalov #ifdef CONFIG_KASAN_HW_TAGS 3512e903b91SAndrey Konovalov void kasan_init_hw_tags_cpu(void); 3522e903b91SAndrey Konovalov void __init kasan_init_hw_tags(void); 3532e903b91SAndrey Konovalov #else 3542e903b91SAndrey Konovalov static inline void kasan_init_hw_tags_cpu(void) { } 3552e903b91SAndrey Konovalov static inline void kasan_init_hw_tags(void) { } 3562e903b91SAndrey Konovalov #endif 357080eb83fSAndrey Konovalov 3583c5c3cfbSDaniel Axtens #ifdef CONFIG_KASAN_VMALLOC 3593b1a4a86SAndrey Konovalov 360d98c9e83SAndrey Ryabinin int kasan_populate_vmalloc(unsigned long addr, unsigned long size); 361d98c9e83SAndrey Ryabinin void kasan_poison_vmalloc(const void *start, unsigned long size); 362d98c9e83SAndrey Ryabinin void kasan_unpoison_vmalloc(const void *start, unsigned long size); 3633c5c3cfbSDaniel Axtens void kasan_release_vmalloc(unsigned long start, unsigned long end, 3643c5c3cfbSDaniel Axtens unsigned long free_region_start, 3653c5c3cfbSDaniel Axtens unsigned long free_region_end); 3663b1a4a86SAndrey Konovalov 3673b1a4a86SAndrey Konovalov #else /* CONFIG_KASAN_VMALLOC */ 3683b1a4a86SAndrey Konovalov 369d98c9e83SAndrey Ryabinin static inline int kasan_populate_vmalloc(unsigned long start, 370d98c9e83SAndrey Ryabinin unsigned long size) 3713c5c3cfbSDaniel Axtens { 3723c5c3cfbSDaniel Axtens return 0; 3733c5c3cfbSDaniel Axtens } 3743c5c3cfbSDaniel Axtens 375d98c9e83SAndrey Ryabinin static inline void kasan_poison_vmalloc(const void *start, unsigned long size) 376d98c9e83SAndrey Ryabinin { } 377d98c9e83SAndrey Ryabinin static inline void kasan_unpoison_vmalloc(const void *start, unsigned long size) 378d98c9e83SAndrey Ryabinin { } 3793c5c3cfbSDaniel Axtens static inline void kasan_release_vmalloc(unsigned long start, 3803c5c3cfbSDaniel Axtens unsigned long end, 3813c5c3cfbSDaniel Axtens unsigned long free_region_start, 3823c5c3cfbSDaniel Axtens unsigned long free_region_end) {} 3833b1a4a86SAndrey Konovalov 3843b1a4a86SAndrey Konovalov #endif /* CONFIG_KASAN_VMALLOC */ 3853b1a4a86SAndrey Konovalov 3860fea6e9aSAndrey Konovalov #if (defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)) && \ 3870fea6e9aSAndrey Konovalov !defined(CONFIG_KASAN_VMALLOC) 3883b1a4a86SAndrey Konovalov 3893b1a4a86SAndrey Konovalov /* 3903b1a4a86SAndrey Konovalov * These functions provide a special case to support backing module 3913b1a4a86SAndrey Konovalov * allocations with real shadow memory. With KASAN vmalloc, the special 3923b1a4a86SAndrey Konovalov * case is unnecessary, as the work is handled in the generic case. 3933b1a4a86SAndrey Konovalov */ 3943b1a4a86SAndrey Konovalov int kasan_module_alloc(void *addr, size_t size); 3953b1a4a86SAndrey Konovalov void kasan_free_shadow(const struct vm_struct *vm); 3963b1a4a86SAndrey Konovalov 3970fea6e9aSAndrey Konovalov #else /* (CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS) && !CONFIG_KASAN_VMALLOC */ 3983b1a4a86SAndrey Konovalov 3993b1a4a86SAndrey Konovalov static inline int kasan_module_alloc(void *addr, size_t size) { return 0; } 4003b1a4a86SAndrey Konovalov static inline void kasan_free_shadow(const struct vm_struct *vm) {} 4013b1a4a86SAndrey Konovalov 4020fea6e9aSAndrey Konovalov #endif /* (CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS) && !CONFIG_KASAN_VMALLOC */ 4033c5c3cfbSDaniel Axtens 4042f004eeaSJann Horn #ifdef CONFIG_KASAN_INLINE 4052f004eeaSJann Horn void kasan_non_canonical_hook(unsigned long addr); 4062f004eeaSJann Horn #else /* CONFIG_KASAN_INLINE */ 4072f004eeaSJann Horn static inline void kasan_non_canonical_hook(unsigned long addr) { } 4082f004eeaSJann Horn #endif /* CONFIG_KASAN_INLINE */ 4092f004eeaSJann Horn 4100b24beccSAndrey Ryabinin #endif /* LINUX_KASAN_H */ 411