diff options
Diffstat (limited to 'include/linux/kasan.h')
| -rw-r--r-- | include/linux/kasan.h | 101 | 
1 files changed, 76 insertions, 25 deletions
diff --git a/include/linux/kasan.h b/include/linux/kasan.h index 46aae129917c..b40ea104dd36 100644 --- a/include/linux/kasan.h +++ b/include/linux/kasan.h @@ -14,13 +14,13 @@ struct task_struct;  #include <asm/kasan.h>  #include <asm/pgtable.h> -extern unsigned char kasan_zero_page[PAGE_SIZE]; -extern pte_t kasan_zero_pte[PTRS_PER_PTE]; -extern pmd_t kasan_zero_pmd[PTRS_PER_PMD]; -extern pud_t kasan_zero_pud[PTRS_PER_PUD]; -extern p4d_t kasan_zero_p4d[MAX_PTRS_PER_P4D]; +extern unsigned char kasan_early_shadow_page[PAGE_SIZE]; +extern pte_t kasan_early_shadow_pte[PTRS_PER_PTE]; +extern pmd_t kasan_early_shadow_pmd[PTRS_PER_PMD]; +extern pud_t kasan_early_shadow_pud[PTRS_PER_PUD]; +extern p4d_t kasan_early_shadow_p4d[MAX_PTRS_PER_P4D]; -int kasan_populate_zero_shadow(const void *shadow_start, +int kasan_populate_early_shadow(const void *shadow_start,  				const void *shadow_end);  static inline void *kasan_mem_to_shadow(const void *addr) @@ -45,22 +45,24 @@ void kasan_free_pages(struct page *page, unsigned int order);  void kasan_cache_create(struct kmem_cache *cache, unsigned int *size,  			slab_flags_t *flags); -void kasan_cache_shrink(struct kmem_cache *cache); -void kasan_cache_shutdown(struct kmem_cache *cache);  void kasan_poison_slab(struct page *page);  void kasan_unpoison_object_data(struct kmem_cache *cache, void *object);  void kasan_poison_object_data(struct kmem_cache *cache, void *object); -void kasan_init_slab_obj(struct kmem_cache *cache, const void *object); +void * __must_check kasan_init_slab_obj(struct kmem_cache *cache, +					const void *object); -void kasan_kmalloc_large(const void *ptr, size_t size, gfp_t flags); +void * __must_check kasan_kmalloc_large(const void *ptr, size_t size, +						gfp_t flags);  void kasan_kfree_large(void *ptr, unsigned long ip);  void kasan_poison_kfree(void *ptr, unsigned long ip); -void kasan_kmalloc(struct kmem_cache *s, const void *object, size_t size, -		  gfp_t flags); -void kasan_krealloc(const void *object, size_t new_size, gfp_t flags); +void * __must_check kasan_kmalloc(struct kmem_cache *s, const void *object, +					size_t size, gfp_t flags); +void * __must_check kasan_krealloc(const void *object, size_t new_size, +					gfp_t flags); -void kasan_slab_alloc(struct kmem_cache *s, void *object, gfp_t flags); +void * __must_check kasan_slab_alloc(struct kmem_cache *s, void *object, +					gfp_t flags);  bool kasan_slab_free(struct kmem_cache *s, void *object, unsigned long ip);  struct kasan_cache { @@ -97,27 +99,40 @@ static inline void kasan_free_pages(struct page *page, unsigned int order) {}  static inline void kasan_cache_create(struct kmem_cache *cache,  				      unsigned int *size,  				      slab_flags_t *flags) {} -static inline void kasan_cache_shrink(struct kmem_cache *cache) {} -static inline void kasan_cache_shutdown(struct kmem_cache *cache) {}  static inline void kasan_poison_slab(struct page *page) {}  static inline void kasan_unpoison_object_data(struct kmem_cache *cache,  					void *object) {}  static inline void kasan_poison_object_data(struct kmem_cache *cache,  					void *object) {} -static inline void kasan_init_slab_obj(struct kmem_cache *cache, -				const void *object) {} +static inline void *kasan_init_slab_obj(struct kmem_cache *cache, +				const void *object) +{ +	return (void *)object; +} -static inline void kasan_kmalloc_large(void *ptr, size_t size, gfp_t flags) {} +static inline void *kasan_kmalloc_large(void *ptr, size_t size, gfp_t flags) +{ +	return ptr; +}  static inline void kasan_kfree_large(void *ptr, unsigned long ip) {}  static inline void kasan_poison_kfree(void *ptr, unsigned long ip) {} -static inline void kasan_kmalloc(struct kmem_cache *s, const void *object, -				size_t size, gfp_t flags) {} -static inline void kasan_krealloc(const void *object, size_t new_size, -				 gfp_t flags) {} +static inline void *kasan_kmalloc(struct kmem_cache *s, const void *object, +				size_t size, gfp_t flags) +{ +	return (void *)object; +} +static inline void *kasan_krealloc(const void *object, size_t new_size, +				 gfp_t flags) +{ +	return (void *)object; +} -static inline void kasan_slab_alloc(struct kmem_cache *s, void *object, -				   gfp_t flags) {} +static inline void *kasan_slab_alloc(struct kmem_cache *s, void *object, +				   gfp_t flags) +{ +	return object; +}  static inline bool kasan_slab_free(struct kmem_cache *s, void *object,  				   unsigned long ip)  { @@ -140,4 +155,40 @@ static inline size_t kasan_metadata_size(struct kmem_cache *cache) { return 0; }  #endif /* CONFIG_KASAN */ +#ifdef CONFIG_KASAN_GENERIC + +#define KASAN_SHADOW_INIT 0 + +void kasan_cache_shrink(struct kmem_cache *cache); +void kasan_cache_shutdown(struct kmem_cache *cache); + +#else /* CONFIG_KASAN_GENERIC */ + +static inline void kasan_cache_shrink(struct kmem_cache *cache) {} +static inline void kasan_cache_shutdown(struct kmem_cache *cache) {} + +#endif /* CONFIG_KASAN_GENERIC */ + +#ifdef CONFIG_KASAN_SW_TAGS + +#define KASAN_SHADOW_INIT 0xFF + +void kasan_init_tags(void); + +void *kasan_reset_tag(const void *addr); + +void kasan_report(unsigned long addr, size_t size, +		bool is_write, unsigned long ip); + +#else /* CONFIG_KASAN_SW_TAGS */ + +static inline void kasan_init_tags(void) { } + +static inline void *kasan_reset_tag(const void *addr) +{ +	return (void *)addr; +} + +#endif /* CONFIG_KASAN_SW_TAGS */ +  #endif /* LINUX_KASAN_H */  |