Message ID | 91b3defa17748a61d1432929a80890043ca8dcda.1605046192.git.andreyknvl@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v9,01/44] kasan: drop unnecessary GPL text from comment headers | expand |
On Tue, Nov 10, 2020 at 11:11 PM Andrey Konovalov <andreyknvl@google.com> wrote: > > This is a preparatory commit for the upcoming addition of a new hardware > tag-based (MTE-based) KASAN mode. > > Hardware tag-based KASAN won't use kasan_depth. Only define and use it > when one of the software KASAN modes are enabled. > > 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: Catalin Marinas <catalin.marinas@arm.com> Reviewed-by: Alexander Potapenko <glider@google.com> > --- > Change-Id: I6109ea96c8df41ef6d75ad71bf22c1c8fa234a9a > --- > arch/arm64/mm/kasan_init.c | 11 ++++++++--- > include/linux/kasan.h | 18 +++++++++--------- > include/linux/sched.h | 2 +- > init/init_task.c | 2 +- > mm/kasan/common.c | 2 ++ > mm/kasan/report.c | 2 ++ > 6 files changed, 23 insertions(+), 14 deletions(-) > > diff --git a/arch/arm64/mm/kasan_init.c b/arch/arm64/mm/kasan_init.c > index ffeb80d5aa8d..5172799f831f 100644 > --- a/arch/arm64/mm/kasan_init.c > +++ b/arch/arm64/mm/kasan_init.c > @@ -273,17 +273,22 @@ static void __init kasan_init_shadow(void) > cpu_replace_ttbr1(lm_alias(swapper_pg_dir)); > } > > +static void __init kasan_init_depth(void) > +{ > + init_task.kasan_depth = 0; > +} > + > #else /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS) */ > > static inline void __init kasan_init_shadow(void) { } > > +static inline void __init kasan_init_depth(void) { } > + > #endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ > > void __init kasan_init(void) > { > kasan_init_shadow(); > - > - /* At this point kasan is fully initialized. Enable error messages */ > - init_task.kasan_depth = 0; > + kasan_init_depth(); > pr_info("KernelAddressSanitizer initialized\n"); > } > diff --git a/include/linux/kasan.h b/include/linux/kasan.h > index f6435b9f889c..979d598e1c30 100644 > --- a/include/linux/kasan.h > +++ b/include/linux/kasan.h > @@ -51,6 +51,12 @@ static inline void *kasan_mem_to_shadow(const void *addr) > int kasan_add_zero_shadow(void *start, unsigned long size); > void kasan_remove_zero_shadow(void *start, unsigned long size); > > +/* Enable reporting bugs after kasan_disable_current() */ > +extern void kasan_enable_current(void); > + > +/* Disable reporting bugs for current task */ > +extern void kasan_disable_current(void); > + > #else /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ > > static inline int kasan_add_zero_shadow(void *start, unsigned long size) > @@ -61,16 +67,13 @@ static inline void kasan_remove_zero_shadow(void *start, > unsigned long size) > {} > > +static inline void kasan_enable_current(void) {} > +static inline void kasan_disable_current(void) {} > + > #endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ > > #ifdef CONFIG_KASAN > > -/* Enable reporting bugs after kasan_disable_current() */ > -extern void kasan_enable_current(void); > - > -/* Disable reporting bugs for current task */ > -extern void kasan_disable_current(void); > - > void kasan_unpoison_memory(const void *address, size_t size); > > void kasan_unpoison_task_stack(struct task_struct *task); > @@ -121,9 +124,6 @@ static inline void kasan_unpoison_memory(const void *address, size_t size) {} > > static inline void kasan_unpoison_task_stack(struct task_struct *task) {} > > -static inline void kasan_enable_current(void) {} > -static inline void kasan_disable_current(void) {} > - > static inline void kasan_alloc_pages(struct page *page, unsigned int order) {} > static inline void kasan_free_pages(struct page *page, unsigned int order) {} > > diff --git a/include/linux/sched.h b/include/linux/sched.h > index 063cd120b459..81b09bd31186 100644 > --- a/include/linux/sched.h > +++ b/include/linux/sched.h > @@ -1197,7 +1197,7 @@ struct task_struct { > u64 timer_slack_ns; > u64 default_timer_slack_ns; > > -#ifdef CONFIG_KASAN > +#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) > unsigned int kasan_depth; > #endif > > diff --git a/init/init_task.c b/init/init_task.c > index a56f0abb63e9..39703b4ef1f1 100644 > --- a/init/init_task.c > +++ b/init/init_task.c > @@ -176,7 +176,7 @@ struct task_struct init_task > .numa_group = NULL, > .numa_faults = NULL, > #endif > -#ifdef CONFIG_KASAN > +#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) > .kasan_depth = 1, > #endif > #ifdef CONFIG_KCSAN > diff --git a/mm/kasan/common.c b/mm/kasan/common.c > index 543e6bf2168f..d0b3ff410b0c 100644 > --- a/mm/kasan/common.c > +++ b/mm/kasan/common.c > @@ -46,6 +46,7 @@ void kasan_set_track(struct kasan_track *track, gfp_t flags) > track->stack = kasan_save_stack(flags); > } > > +#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) > void kasan_enable_current(void) > { > current->kasan_depth++; > @@ -55,6 +56,7 @@ void kasan_disable_current(void) > { > current->kasan_depth--; > } > +#endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ > > static void __kasan_unpoison_stack(struct task_struct *task, const void *sp) > { > diff --git a/mm/kasan/report.c b/mm/kasan/report.c > index b18d193f7f58..af9138ea54ad 100644 > --- a/mm/kasan/report.c > +++ b/mm/kasan/report.c > @@ -292,8 +292,10 @@ static void print_shadow_for_address(const void *addr) > > static bool report_enabled(void) > { > +#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) > if (current->kasan_depth) > return false; > +#endif > if (test_bit(KASAN_BIT_MULTI_SHOT, &kasan_flags)) > return true; > return !test_and_set_bit(KASAN_BIT_REPORTED, &kasan_flags); > -- > 2.29.2.222.g5d2a92d10f8-goog >
diff --git a/arch/arm64/mm/kasan_init.c b/arch/arm64/mm/kasan_init.c index ffeb80d5aa8d..5172799f831f 100644 --- a/arch/arm64/mm/kasan_init.c +++ b/arch/arm64/mm/kasan_init.c @@ -273,17 +273,22 @@ static void __init kasan_init_shadow(void) cpu_replace_ttbr1(lm_alias(swapper_pg_dir)); } +static void __init kasan_init_depth(void) +{ + init_task.kasan_depth = 0; +} + #else /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS) */ static inline void __init kasan_init_shadow(void) { } +static inline void __init kasan_init_depth(void) { } + #endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ void __init kasan_init(void) { kasan_init_shadow(); - - /* At this point kasan is fully initialized. Enable error messages */ - init_task.kasan_depth = 0; + kasan_init_depth(); pr_info("KernelAddressSanitizer initialized\n"); } diff --git a/include/linux/kasan.h b/include/linux/kasan.h index f6435b9f889c..979d598e1c30 100644 --- a/include/linux/kasan.h +++ b/include/linux/kasan.h @@ -51,6 +51,12 @@ static inline void *kasan_mem_to_shadow(const void *addr) int kasan_add_zero_shadow(void *start, unsigned long size); void kasan_remove_zero_shadow(void *start, unsigned long size); +/* Enable reporting bugs after kasan_disable_current() */ +extern void kasan_enable_current(void); + +/* Disable reporting bugs for current task */ +extern void kasan_disable_current(void); + #else /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ static inline int kasan_add_zero_shadow(void *start, unsigned long size) @@ -61,16 +67,13 @@ static inline void kasan_remove_zero_shadow(void *start, unsigned long size) {} +static inline void kasan_enable_current(void) {} +static inline void kasan_disable_current(void) {} + #endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ #ifdef CONFIG_KASAN -/* Enable reporting bugs after kasan_disable_current() */ -extern void kasan_enable_current(void); - -/* Disable reporting bugs for current task */ -extern void kasan_disable_current(void); - void kasan_unpoison_memory(const void *address, size_t size); void kasan_unpoison_task_stack(struct task_struct *task); @@ -121,9 +124,6 @@ static inline void kasan_unpoison_memory(const void *address, size_t size) {} static inline void kasan_unpoison_task_stack(struct task_struct *task) {} -static inline void kasan_enable_current(void) {} -static inline void kasan_disable_current(void) {} - static inline void kasan_alloc_pages(struct page *page, unsigned int order) {} static inline void kasan_free_pages(struct page *page, unsigned int order) {} diff --git a/include/linux/sched.h b/include/linux/sched.h index 063cd120b459..81b09bd31186 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1197,7 +1197,7 @@ struct task_struct { u64 timer_slack_ns; u64 default_timer_slack_ns; -#ifdef CONFIG_KASAN +#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) unsigned int kasan_depth; #endif diff --git a/init/init_task.c b/init/init_task.c index a56f0abb63e9..39703b4ef1f1 100644 --- a/init/init_task.c +++ b/init/init_task.c @@ -176,7 +176,7 @@ struct task_struct init_task .numa_group = NULL, .numa_faults = NULL, #endif -#ifdef CONFIG_KASAN +#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) .kasan_depth = 1, #endif #ifdef CONFIG_KCSAN diff --git a/mm/kasan/common.c b/mm/kasan/common.c index 543e6bf2168f..d0b3ff410b0c 100644 --- a/mm/kasan/common.c +++ b/mm/kasan/common.c @@ -46,6 +46,7 @@ void kasan_set_track(struct kasan_track *track, gfp_t flags) track->stack = kasan_save_stack(flags); } +#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) void kasan_enable_current(void) { current->kasan_depth++; @@ -55,6 +56,7 @@ void kasan_disable_current(void) { current->kasan_depth--; } +#endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ static void __kasan_unpoison_stack(struct task_struct *task, const void *sp) { diff --git a/mm/kasan/report.c b/mm/kasan/report.c index b18d193f7f58..af9138ea54ad 100644 --- a/mm/kasan/report.c +++ b/mm/kasan/report.c @@ -292,8 +292,10 @@ static void print_shadow_for_address(const void *addr) static bool report_enabled(void) { +#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) if (current->kasan_depth) return false; +#endif if (test_bit(KASAN_BIT_MULTI_SHOT, &kasan_flags)) return true; return !test_and_set_bit(KASAN_BIT_REPORTED, &kasan_flags);