Message ID | 9de4c3b360444c66fcf454e0880fc655c5d80395.1600987622.git.andreyknvl@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | kasan: add hardware tag-based mode for arm64 | expand |
On Fri, Sep 25, 2020 at 12:50AM +0200, Andrey Konovalov wrote: > This is a preparatory commit for the upcoming addition of a new hardware > tag-based (MTE-based) KASAN mode. > > Group shadow-related KASAN function declarations and only define them > for the two existing software modes. > > No functional changes for software modes. > > Signed-off-by: Andrey Konovalov <andreyknvl@google.com> > Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com> Reviewed-by: Marco Elver <elver@google.com> > --- > Change-Id: I864be75a88b91b443c55e9c2042865e15703e164 > --- > include/linux/kasan.h | 44 ++++++++++++++++++++++++++----------------- > 1 file changed, 27 insertions(+), 17 deletions(-) > > diff --git a/include/linux/kasan.h b/include/linux/kasan.h > index bd5b4965a269..44a9aae44138 100644 > --- a/include/linux/kasan.h > +++ b/include/linux/kasan.h > @@ -3,16 +3,24 @@ > #define _LINUX_KASAN_H > > #include <linux/types.h> > +#include <asm/kasan.h> > > struct kmem_cache; > struct page; > struct vm_struct; > struct task_struct; > > -#ifdef CONFIG_KASAN > +#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) > > #include <linux/pgtable.h> > -#include <asm/kasan.h> > + > +/* Software KASAN implementations use shadow memory. */ > + > +#ifdef CONFIG_KASAN_SW_TAGS > +#define KASAN_SHADOW_INIT 0xFF > +#else > +#define KASAN_SHADOW_INIT 0 > +#endif > > extern unsigned char kasan_early_shadow_page[PAGE_SIZE]; > extern pte_t kasan_early_shadow_pte[PTRS_PER_PTE]; > @@ -29,6 +37,23 @@ static inline void *kasan_mem_to_shadow(const void *addr) > + KASAN_SHADOW_OFFSET; > } > > +int kasan_add_zero_shadow(void *start, unsigned long size); > +void kasan_remove_zero_shadow(void *start, unsigned long size); > + > +#else /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ > + > +static inline int kasan_add_zero_shadow(void *start, unsigned long size) > +{ > + return 0; > +} > +static inline void kasan_remove_zero_shadow(void *start, > + unsigned long size) > +{} > + > +#endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ > + > +#ifdef CONFIG_KASAN > + > /* Enable reporting bugs after kasan_disable_current() */ > extern void kasan_enable_current(void); > > @@ -69,9 +94,6 @@ struct kasan_cache { > int free_meta_offset; > }; > > -int kasan_add_zero_shadow(void *start, unsigned long size); > -void kasan_remove_zero_shadow(void *start, unsigned long size); > - > size_t __ksize(const void *); > static inline void kasan_unpoison_slab(const void *ptr) > { > @@ -137,14 +159,6 @@ static inline bool kasan_slab_free(struct kmem_cache *s, void *object, > return false; > } > > -static inline int kasan_add_zero_shadow(void *start, unsigned long size) > -{ > - return 0; > -} > -static inline void kasan_remove_zero_shadow(void *start, > - unsigned long size) > -{} > - > static inline void kasan_unpoison_slab(const void *ptr) { } > static inline size_t kasan_metadata_size(struct kmem_cache *cache) { return 0; } > > @@ -152,8 +166,6 @@ static inline size_t kasan_metadata_size(struct kmem_cache *cache) { return 0; } > > #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); > void kasan_record_aux_stack(void *ptr); > @@ -168,8 +180,6 @@ static inline void kasan_record_aux_stack(void *ptr) {} > > #ifdef CONFIG_KASAN_SW_TAGS > > -#define KASAN_SHADOW_INIT 0xFF > - > void kasan_init_tags(void); > > void *kasan_reset_tag(const void *addr); > -- > 2.28.0.681.g6f77f65b4e-goog >
diff --git a/include/linux/kasan.h b/include/linux/kasan.h index bd5b4965a269..44a9aae44138 100644 --- a/include/linux/kasan.h +++ b/include/linux/kasan.h @@ -3,16 +3,24 @@ #define _LINUX_KASAN_H #include <linux/types.h> +#include <asm/kasan.h> struct kmem_cache; struct page; struct vm_struct; struct task_struct; -#ifdef CONFIG_KASAN +#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) #include <linux/pgtable.h> -#include <asm/kasan.h> + +/* Software KASAN implementations use shadow memory. */ + +#ifdef CONFIG_KASAN_SW_TAGS +#define KASAN_SHADOW_INIT 0xFF +#else +#define KASAN_SHADOW_INIT 0 +#endif extern unsigned char kasan_early_shadow_page[PAGE_SIZE]; extern pte_t kasan_early_shadow_pte[PTRS_PER_PTE]; @@ -29,6 +37,23 @@ static inline void *kasan_mem_to_shadow(const void *addr) + KASAN_SHADOW_OFFSET; } +int kasan_add_zero_shadow(void *start, unsigned long size); +void kasan_remove_zero_shadow(void *start, unsigned long size); + +#else /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ + +static inline int kasan_add_zero_shadow(void *start, unsigned long size) +{ + return 0; +} +static inline void kasan_remove_zero_shadow(void *start, + unsigned long size) +{} + +#endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ + +#ifdef CONFIG_KASAN + /* Enable reporting bugs after kasan_disable_current() */ extern void kasan_enable_current(void); @@ -69,9 +94,6 @@ struct kasan_cache { int free_meta_offset; }; -int kasan_add_zero_shadow(void *start, unsigned long size); -void kasan_remove_zero_shadow(void *start, unsigned long size); - size_t __ksize(const void *); static inline void kasan_unpoison_slab(const void *ptr) { @@ -137,14 +159,6 @@ static inline bool kasan_slab_free(struct kmem_cache *s, void *object, return false; } -static inline int kasan_add_zero_shadow(void *start, unsigned long size) -{ - return 0; -} -static inline void kasan_remove_zero_shadow(void *start, - unsigned long size) -{} - static inline void kasan_unpoison_slab(const void *ptr) { } static inline size_t kasan_metadata_size(struct kmem_cache *cache) { return 0; } @@ -152,8 +166,6 @@ static inline size_t kasan_metadata_size(struct kmem_cache *cache) { return 0; } #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); void kasan_record_aux_stack(void *ptr); @@ -168,8 +180,6 @@ static inline void kasan_record_aux_stack(void *ptr) {} #ifdef CONFIG_KASAN_SW_TAGS -#define KASAN_SHADOW_INIT 0xFF - void kasan_init_tags(void); void *kasan_reset_tag(const void *addr);