forked from mirrors/linux
		
	kasan: introduce CONFIG_KASAN_HW_TAGS
This patch adds a configuration option for a new KASAN mode called hardware tag-based KASAN. This mode uses the memory tagging approach like the software tag-based mode, but relies on arm64 Memory Tagging Extension feature for tag management and access checking. Link: https://lkml.kernel.org/r/44906a209d3a44f9c6f5a21841e90988e365601e.1606161801.git.andreyknvl@google.com Signed-off-by: Andrey Konovalov <andreyknvl@google.com> Co-developed-by: Vincenzo Frascino <vincenzo.frascino@arm.com> Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com> Reviewed-by: Marco Elver <elver@google.com> Reviewed-by: Alexander Potapenko <glider@google.com> Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com> Cc: Andrey Ryabinin <aryabinin@virtuozzo.com> Cc: Branislav Rankov <Branislav.Rankov@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: Evgenii Stepanov <eugenis@google.com> Cc: Kevin Brodsky <kevin.brodsky@arm.com> Cc: Vasily Gorbik <gor@linux.ibm.com> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									96e0279df6
								
							
						
					
					
						commit
						6a63a63ff1
					
				
					 1 changed files with 44 additions and 17 deletions
				
			
		| 
						 | 
				
			
			@ -6,6 +6,9 @@ config HAVE_ARCH_KASAN
 | 
			
		|||
config HAVE_ARCH_KASAN_SW_TAGS
 | 
			
		||||
	bool
 | 
			
		||||
 | 
			
		||||
config HAVE_ARCH_KASAN_HW_TAGS
 | 
			
		||||
	bool
 | 
			
		||||
 | 
			
		||||
config HAVE_ARCH_KASAN_VMALLOC
 | 
			
		||||
	bool
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -15,16 +18,19 @@ config CC_HAS_KASAN_GENERIC
 | 
			
		|||
config CC_HAS_KASAN_SW_TAGS
 | 
			
		||||
	def_bool $(cc-option, -fsanitize=kernel-hwaddress)
 | 
			
		||||
 | 
			
		||||
# This option is only required for software KASAN modes.
 | 
			
		||||
# Old GCC versions don't have proper support for no_sanitize_address.
 | 
			
		||||
# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89124 for details.
 | 
			
		||||
config CC_HAS_WORKING_NOSANITIZE_ADDRESS
 | 
			
		||||
	def_bool !CC_IS_GCC || GCC_VERSION >= 80300
 | 
			
		||||
 | 
			
		||||
menuconfig KASAN
 | 
			
		||||
	bool "KASAN: runtime memory debugger"
 | 
			
		||||
	depends on (HAVE_ARCH_KASAN && CC_HAS_KASAN_GENERIC) || \
 | 
			
		||||
		   (HAVE_ARCH_KASAN_SW_TAGS && CC_HAS_KASAN_SW_TAGS)
 | 
			
		||||
	depends on (((HAVE_ARCH_KASAN && CC_HAS_KASAN_GENERIC) || \
 | 
			
		||||
		     (HAVE_ARCH_KASAN_SW_TAGS && CC_HAS_KASAN_SW_TAGS)) && \
 | 
			
		||||
		    CC_HAS_WORKING_NOSANITIZE_ADDRESS) || \
 | 
			
		||||
		   HAVE_ARCH_KASAN_HW_TAGS
 | 
			
		||||
	depends on (SLUB && SYSFS) || (SLAB && !DEBUG_SLAB)
 | 
			
		||||
	depends on CC_HAS_WORKING_NOSANITIZE_ADDRESS
 | 
			
		||||
	select CONSTRUCTORS
 | 
			
		||||
	select STACKDEPOT
 | 
			
		||||
	help
 | 
			
		||||
	  Enables KASAN (KernelAddressSANitizer) - runtime memory debugger,
 | 
			
		||||
| 
						 | 
				
			
			@ -37,18 +43,24 @@ choice
 | 
			
		|||
	prompt "KASAN mode"
 | 
			
		||||
	default KASAN_GENERIC
 | 
			
		||||
	help
 | 
			
		||||
	  KASAN has two modes: generic KASAN (similar to userspace ASan,
 | 
			
		||||
	  x86_64/arm64/xtensa, enabled with CONFIG_KASAN_GENERIC) and
 | 
			
		||||
	  software tag-based KASAN (a version based on software memory
 | 
			
		||||
	  tagging, arm64 only, similar to userspace HWASan, enabled with
 | 
			
		||||
	  CONFIG_KASAN_SW_TAGS).
 | 
			
		||||
	  KASAN has three modes:
 | 
			
		||||
	  1. generic KASAN (similar to userspace ASan,
 | 
			
		||||
	     x86_64/arm64/xtensa, enabled with CONFIG_KASAN_GENERIC),
 | 
			
		||||
	  2. software tag-based KASAN (arm64 only, based on software
 | 
			
		||||
	     memory tagging (similar to userspace HWASan), enabled with
 | 
			
		||||
	     CONFIG_KASAN_SW_TAGS), and
 | 
			
		||||
	  3. hardware tag-based KASAN (arm64 only, based on hardware
 | 
			
		||||
	     memory tagging, enabled with CONFIG_KASAN_HW_TAGS).
 | 
			
		||||
 | 
			
		||||
	  Both generic and tag-based KASAN are strictly debugging features.
 | 
			
		||||
	  All KASAN modes are strictly debugging features.
 | 
			
		||||
 | 
			
		||||
	  For better error reports enable CONFIG_STACKTRACE.
 | 
			
		||||
 | 
			
		||||
config KASAN_GENERIC
 | 
			
		||||
	bool "Generic mode"
 | 
			
		||||
	depends on HAVE_ARCH_KASAN && CC_HAS_KASAN_GENERIC
 | 
			
		||||
	select SLUB_DEBUG if SLUB
 | 
			
		||||
	select CONSTRUCTORS
 | 
			
		||||
	help
 | 
			
		||||
	  Enables generic KASAN mode.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -61,8 +73,6 @@ config KASAN_GENERIC
 | 
			
		|||
	  and introduces an overhead of ~x1.5 for the rest of the allocations.
 | 
			
		||||
	  The performance slowdown is ~x3.
 | 
			
		||||
 | 
			
		||||
	  For better error detection enable CONFIG_STACKTRACE.
 | 
			
		||||
 | 
			
		||||
	  Currently CONFIG_KASAN_GENERIC doesn't work with CONFIG_DEBUG_SLAB
 | 
			
		||||
	  (the resulting kernel does not boot).
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -70,11 +80,15 @@ config KASAN_SW_TAGS
 | 
			
		|||
	bool "Software tag-based mode"
 | 
			
		||||
	depends on HAVE_ARCH_KASAN_SW_TAGS && CC_HAS_KASAN_SW_TAGS
 | 
			
		||||
	select SLUB_DEBUG if SLUB
 | 
			
		||||
	select CONSTRUCTORS
 | 
			
		||||
	help
 | 
			
		||||
	  Enables software tag-based KASAN mode.
 | 
			
		||||
 | 
			
		||||
	  This mode requires Top Byte Ignore support by the CPU and therefore
 | 
			
		||||
	  is only supported for arm64. This mode requires Clang.
 | 
			
		||||
	  This mode require software memory tagging support in the form of
 | 
			
		||||
	  HWASan-like compiler instrumentation.
 | 
			
		||||
 | 
			
		||||
	  Currently this mode is only implemented for arm64 CPUs and relies on
 | 
			
		||||
	  Top Byte Ignore. This mode requires Clang.
 | 
			
		||||
 | 
			
		||||
	  This mode consumes about 1/16th of available memory at kernel start
 | 
			
		||||
	  and introduces an overhead of ~20% for the rest of the allocations.
 | 
			
		||||
| 
						 | 
				
			
			@ -82,15 +96,27 @@ config KASAN_SW_TAGS
 | 
			
		|||
	  casting and comparison, as it embeds tags into the top byte of each
 | 
			
		||||
	  pointer.
 | 
			
		||||
 | 
			
		||||
	  For better error detection enable CONFIG_STACKTRACE.
 | 
			
		||||
 | 
			
		||||
	  Currently CONFIG_KASAN_SW_TAGS doesn't work with CONFIG_DEBUG_SLAB
 | 
			
		||||
	  (the resulting kernel does not boot).
 | 
			
		||||
 | 
			
		||||
config KASAN_HW_TAGS
 | 
			
		||||
	bool "Hardware tag-based mode"
 | 
			
		||||
	depends on HAVE_ARCH_KASAN_HW_TAGS
 | 
			
		||||
	depends on SLUB
 | 
			
		||||
	help
 | 
			
		||||
	  Enables hardware tag-based KASAN mode.
 | 
			
		||||
 | 
			
		||||
	  This mode requires hardware memory tagging support, and can be used
 | 
			
		||||
	  by any architecture that provides it.
 | 
			
		||||
 | 
			
		||||
	  Currently this mode is only implemented for arm64 CPUs starting from
 | 
			
		||||
	  ARMv8.5 and relies on Memory Tagging Extension and Top Byte Ignore.
 | 
			
		||||
 | 
			
		||||
endchoice
 | 
			
		||||
 | 
			
		||||
choice
 | 
			
		||||
	prompt "Instrumentation type"
 | 
			
		||||
	depends on KASAN_GENERIC || KASAN_SW_TAGS
 | 
			
		||||
	default KASAN_OUTLINE
 | 
			
		||||
 | 
			
		||||
config KASAN_OUTLINE
 | 
			
		||||
| 
						 | 
				
			
			@ -114,6 +140,7 @@ endchoice
 | 
			
		|||
 | 
			
		||||
config KASAN_STACK_ENABLE
 | 
			
		||||
	bool "Enable stack instrumentation (unsafe)" if CC_IS_CLANG && !COMPILE_TEST
 | 
			
		||||
	depends on KASAN_GENERIC || KASAN_SW_TAGS
 | 
			
		||||
	help
 | 
			
		||||
	  The LLVM stack address sanitizer has a know problem that
 | 
			
		||||
	  causes excessive stack usage in a lot of functions, see
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue