kasan: fix hwasan build for gcc
Subsystems (10)
PATCH 1/1 kasan: fix hwasan build for gcc
From: Arnd Bergmann <[email protected]>
gcc-11 adds support for -fsanitize=kernel-hwaddress, so it becomes possible to enable CONFIG_KASAN_SW_TAGS.
Unfortunately this fails to build at the moment, because the corresponding command line arguments use llvm specific syntax.
Change it to use the cc-param macro instead, which works on both clang and gcc.
--- scripts/Makefile.kasan | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
scripts/Makefile.kasan +4 -4
@@ -36,14 +36,14 @@ endif # CONFIG_KASAN_GENERIC ifdef CONFIG_KASAN_SW_TAGS ifdef CONFIG_KASAN_INLINE - instrumentation_flags := -mllvm -hwasan-mapping-offset=$(KASAN_SHADOW_OFFSET) + instrumentation_flags := $(call cc-param,hwasan-mapping-offset=$(KASAN_SHADOW_OFFSET)) else - instrumentation_flags := -mllvm -hwasan-instrument-with-calls=1 + instrumentation_flags := $(call cc-param,hwasan-instrument-with-calls=1) endif CFLAGS_KASAN := -fsanitize=kernel-hwaddress \ - -mllvm -hwasan-instrument-stack=$(CONFIG_KASAN_STACK) \ - -mllvm -hwasan-use-short-granules=0 \ + $(call cc-param,hwasan-instrument-stack=$(CONFIG_KASAN_STACK)) \ + $(call cc-param,hwasan-use-short-granules=0) \ $(instrumentation_flags) endif # CONFIG_KASAN_SW_TAGS
Signature · 1 line
2.29.2
Quoted 6 lines · Arnd Bergmann
From: Arnd Bergmann <[email protected]>
gcc-11 adds support for -fsanitize=kernel-hwaddress, so it becomes possible to enable
CONFIG_KASAN_SW_TAGS.
Quoted 7 lines
Unfortunately this fails to build at the moment, because the corresponding command line arguments use llvm specific syntax.
Change it to use the cc-param macro instead, which works on both clang and gcc.
Signed-off-by Arnd Bergmann <[email protected]>
Although I think you need to rebase against either -mm or -next, because there have been changes to the CONFIG_KASAN_STACK variable.
Quoted 30 lines
--- scripts/Makefile.kasan | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)scripts/Makefile.kasan +4
-5@@ -36,14 +36,14 @@ endif # CONFIG_KASAN_GENERIC ifdef CONFIG_KASAN_SW_TAGS ifdef CONFIG_KASAN_INLINE - instrumentation_flags := -mllvm -hwasan-mapping-offset=$(KASAN_SHADOW_OFFSET) + instrumentation_flags := $(call cc-param,hwasan-mapping-offset=$(KASAN_SHADOW_OFFSET)) else - instrumentation_flags := -mllvm -hwasan-instrument-with-calls=1 + instrumentation_flags := $(call cc-param,hwasan-instrument-with-calls=1) endif CFLAGS_KASAN := -fsanitize=kernel-hwaddress \ - -mllvm -hwasan-instrument-stack=$(CONFIG_KASAN_STACK) \ - -mllvm -hwasan-use-short-granules=0 \ + $(call cc-param,hwasan-instrument-stack=$(CONFIG_KASAN_STACK)) \ + $(call cc-param,hwasan-use-short-granules=0) \ $(instrumentation_flags) endif # CONFIG_KASAN_SW_TAGS --2.29.2
Andrew Morton
maintainerQuoted 13 lines · On Tue, 23 Mar 2021 13:51:32 +0100 Marco Elver <[email protected]> wrote:
Quoted 12 lines · Arnd Bergmann
From: Arnd Bergmann <[email protected]>
gcc-11 adds support for -fsanitize=kernel-hwaddress, so it becomes possible to enable
CONFIG_KASAN_SW_TAGS.Unfortunately this fails to build at the moment, because the corresponding command line arguments use llvm specific syntax.
Change it to use the cc-param macro instead, which works on both clang and gcc.
Quoted 6 lines
Quoted 1 line
Signed-off-by Arnd Bergmann <[email protected]>Reviewed-by Marco Elver <[email protected]>Although I think you need to rebase against either -mm or -next, because there have been changes to the
CONFIG_KASAN_STACKvariable.
This fix is applicable to 5.12, so it's better than the 5.13 patches in -mm be changed to accomodate this patch.
afaict the only needed change was to update kasan-remove-redundant-config-option.patch as below. The scripts/Makefile.kasan part was changed:
@@ -42,7 +48,7 @@ else
endif
CFLAGS_KASAN := -fsanitize=kernel-hwaddress \
- $(call cc-param,hwasan-instrument-stack=$(CONFIG_KASAN_STACK)) \
+ $(call cc-param,hwasan-instrument-stack=$(stack_enable)) \
$(call cc-param,hwasan-use-short-granules=0) \
$(instrumentation_flags)
Whole patch:
arch/arm64/kernel/sleep.S renamed from arch/arm64/kernel/sleep.S~kasan-remove-redundant-config-option +1 -1
@@ -134,7 +134,7 @@ SYM_FUNC_START(_cpu_resume) */ bl cpu_do_resume -#if defined(CONFIG_KASAN) && CONFIG_KASAN_STACK +#if defined(CONFIG_KASAN) && defined(CONFIG_KASAN_STACK) mov x0, sp bl kasan_unpoison_task_stack_below #endif
arch/x86/kernel/acpi/wakeup_64.S renamed from arch/x86/kernel/acpi/wakeup_64.S~kasan-remove-redundant-config-option +1 -1
@@ -115,7 +115,7 @@ SYM_FUNC_START(do_suspend_lowlevel) movq pt_regs_r14(%rax), %r14 movq pt_regs_r15(%rax), %r15 -#if defined(CONFIG_KASAN) && CONFIG_KASAN_STACK +#if defined(CONFIG_KASAN) && defined(CONFIG_KASAN_STACK) /* * The suspend path may have poisoned some areas deeper in the stack, * which we now need to unpoison.
include/linux/kasan.h renamed from include/linux/kasan.h~kasan-remove-redundant-config-option +1 -1
@@ -330,7 +330,7 @@ static inline bool kasan_check_byte(cons#endif /* CONFIG_KASAN */ -#if defined(CONFIG_KASAN ) &&CONFIG_KASAN_STACK +#if defined(CONFIG_KASAN ) && defined(CONFIG_KASAN_STACK )void kasan_unpoison_task_stack (struct task_struct *task);#else static inline void kasan_unpoison_task_stack (struct task_struct *task) {}
lib/Kconfig.kasan renamed from lib/Kconfig.kasan~kasan-remove-redundant-config-option +3 -2
@@ -138,9 +138,10 @@ config KASAN_INLINE endchoice -config KASAN_STACK_ENABLE +config KASAN_STACK bool "Enable stack instrumentation (unsafe)" if CC_IS_CLANG && !COMPILE_TEST depends on KASAN_GENERIC || KASAN_SW_TAGS + default y if CC_IS_GCC help The LLVM stack address sanitizer has a know problem that causes excessive stack usage in a lot of functions, see
@@ -155,7 +156,7 @@ config KASAN_STACK_ENABLE to use and enabled by default. config KASAN_STACK - int + bool depends on KASAN_GENERIC || KASAN_SW_TAGS default 1 if KASAN_STACK_ENABLE || CC_IS_GCC default 0
mm/kasan/common.c renamed from mm/kasan/common.c~kasan-remove-redundant-config-option +1 -1
@@ -63,7 +63,7 @@ void __kasan_unpoison_range(const void *kasan_unpoison (address, size); } -#if CONFIG_KASAN_STACK +#ifdef CONFIG_KASAN_STACK /* Unpoison the entire stack for a task. */ void kasan_unpoison_task_stack (struct task_struct *task) {
mm/kasan/kasan.h renamed from mm/kasan/kasan.h~kasan-remove-redundant-config-option +1 -1
@@ -231,7 +231,7 @@ void *kasan_find_first_bad_addr(void *adconst char *kasan_get_bug_type (struct kasan_access_info *info);void kasan_metadata_fetch_row (char *buffer,void *row); -#if defined(CONFIG_KASAN_GENERIC ) &&CONFIG_KASAN_STACK +#if defined(CONFIG_KASAN_GENERIC ) && defined(CONFIG_KASAN_STACK )void kasan_print_address_stack_frame (const void *addr);#else static inline void kasan_print_address_stack_frame (const void *addr) { }
mm/kasan/report_generic.c renamed from mm/kasan/report_generic.c~kasan-remove-redundant-config-option +1 -1
@@ -128,7 +128,7 @@ void kasan_metadata_fetch_row(char *buffmemcpy (buffer,kasan_mem_to_shadow (row),META_BYTES_PER_ROW ); } -#if CONFIG_KASAN_STACK +#ifdef CONFIG_KASAN_STACK static bool __must_check tokenize_frame_descr (const char **frame_descr,char *token,size_t max_tok_len,unsigned long *value)
scripts/Makefile.kasan renamed from scripts/Makefile.kasan~kasan-remove-redundant-config-option +8 -2
@@ -2,6 +2,12 @@ CFLAGS_KASAN_NOSANITIZE := -fno-builtin KASAN_SHADOW_OFFSET ?= $(CONFIG_KASAN_SHADOW_OFFSET) +ifdef CONFIG_KASAN_STACK + stack_enable := 1 +else + stack_enable := 0 +endif + ifdef CONFIG_KASAN_GENERIC ifdef CONFIG_KASAN_INLINE
@@ -27,7 +33,7 @@ else CFLAGS_KASAN := $(CFLAGS_KASAN_SHADOW) \ $(call cc-param,asan-globals=1) \ $(call cc-param,asan-instrumentation-with-call-threshold=$(call_threshold)) \ - $(call cc-param,asan-stack=$(CONFIG_KASAN_STACK)) \ + $(call cc-param,asan-stack=$(stack_enable)) \ $(call cc-param,asan-instrument-allocas=1) endif
@@ -42,7 +48,7 @@ else endif CFLAGS_KASAN := -fsanitize=kernel-hwaddress \ - $(call cc-param,hwasan-instrument-stack=$(CONFIG_KASAN_STACK)) \ + $(call cc-param,hwasan-instrument-stack=$(stack_enable)) \ $(call cc-param,hwasan-use-short-granules=0) \ $(instrumentation_flags)
security/Kconfig.hardening renamed from security/Kconfig.hardening~kasan-remove-redundant-config-option +2 -2
@@ -64,7 +64,7 @@ choice config GCC_PLUGIN_STRUCTLEAK_BYREF bool "zero-init structs passed by reference (strong)" depends on GCC_PLUGINS - depends on !(KASAN && KASAN_STACK=1) + depends on !(KASAN && KASAN_STACK) select GCC_PLUGIN_STRUCTLEAK help Zero-initialize any structures on the stack that may
@@ -82,7 +82,7 @@ choice config GCC_PLUGIN_STRUCTLEAK_BYREF_ALL bool "zero-init anything passed by reference (very strong)" depends on GCC_PLUGINS - depends on !(KASAN && KASAN_STACK=1) + depends on !(KASAN && KASAN_STACK) select GCC_PLUGIN_STRUCTLEAK help Zero-initialize any stack variables that may be passed
_
Andrey Konovalov
reviewerQuoted 41 lines · Arnd Bergmann
From: Arnd Bergmann <[email protected]>
gcc-11 adds support for -fsanitize=kernel-hwaddress, so it becomes possible to enable
CONFIG_KASAN_SW_TAGS.Unfortunately this fails to build at the moment, because the corresponding command line arguments use llvm specific syntax.
Change it to use the cc-param macro instead, which works on both clang and gcc.
Signed-off-by Arnd Bergmann <[email protected]>--- scripts/Makefile.kasan | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)scripts/Makefile.kasan +4
-5@@ -36,14 +36,14 @@ endif # CONFIG_KASAN_GENERIC ifdef CONFIG_KASAN_SW_TAGS ifdef CONFIG_KASAN_INLINE - instrumentation_flags := -mllvm -hwasan-mapping-offset=$(KASAN_SHADOW_OFFSET) + instrumentation_flags := $(call cc-param,hwasan-mapping-offset=$(KASAN_SHADOW_OFFSET)) else - instrumentation_flags := -mllvm -hwasan-instrument-with-calls=1 + instrumentation_flags := $(call cc-param,hwasan-instrument-with-calls=1) endif CFLAGS_KASAN := -fsanitize=kernel-hwaddress \ - -mllvm -hwasan-instrument-stack=$(CONFIG_KASAN_STACK) \ - -mllvm -hwasan-use-short-granules=0 \ + $(call cc-param,hwasan-instrument-stack=$(CONFIG_KASAN_STACK)) \ + $(call cc-param,hwasan-use-short-granules=0) \ $(instrumentation_flags) endif # CONFIG_KASAN_SW_TAGS --
Quoted 2 lines
2.29.2
Hi Arnd,
This patch breaks SW_TAGS build with Clang for me with:
arch/arm64/include/asm/current.h:19: undefined reference to `__hwasan_tls'
The reason for this is that cc-param is only defined for KASAN_GENERIC, the definition needs to be moved.
Thanks!