mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
kasan: add CONFIG_KASAN_GENERIC and CONFIG_KASAN_SW_TAGS
This commit splits the current CONFIG_KASAN config option into two: 1. CONFIG_KASAN_GENERIC, that enables the generic KASAN mode (the one that exists now); 2. CONFIG_KASAN_SW_TAGS, that enables the software tag-based KASAN mode. The name CONFIG_KASAN_SW_TAGS is chosen as in the future we will have another hardware tag-based KASAN mode, that will rely on hardware memory tagging support in arm64. With CONFIG_KASAN_SW_TAGS enabled, compiler options are changed to instrument kernel files with -fsantize=kernel-hwaddress (except the ones for which KASAN_SANITIZE := n is set). Both CONFIG_KASAN_GENERIC and CONFIG_KASAN_SW_TAGS support both CONFIG_KASAN_INLINE and CONFIG_KASAN_OUTLINE instrumentation modes. This commit also adds empty placeholder (for now) implementation of tag-based KASAN specific hooks inserted by the compiler and adjusts common hooks implementation. While this commit adds the CONFIG_KASAN_SW_TAGS config option, this option is not selectable, as it depends on HAVE_ARCH_KASAN_SW_TAGS, which we will enable once all the infrastracture code has been added. Link: http://lkml.kernel.org/r/b2550106eb8a68b10fefbabce820910b115aa853.1544099024.git.andreyknvl@google.com Signed-off-by: Andrey Konovalov <[email protected]> Reviewed-by: Andrey Ryabinin <[email protected]> Reviewed-by: Dmitry Vyukov <[email protected]> Cc: Christoph Lameter <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Will Deacon <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
b938fcf427
commit
2bd926b439
11 changed files with 214 additions and 66 deletions
|
|
@ -1,36 +1,92 @@
|
|||
# This config refers to the generic KASAN mode.
|
||||
config HAVE_ARCH_KASAN
|
||||
bool
|
||||
|
||||
if HAVE_ARCH_KASAN
|
||||
config HAVE_ARCH_KASAN_SW_TAGS
|
||||
bool
|
||||
|
||||
config CC_HAS_KASAN_GENERIC
|
||||
def_bool $(cc-option, -fsanitize=kernel-address)
|
||||
|
||||
config CC_HAS_KASAN_SW_TAGS
|
||||
def_bool $(cc-option, -fsanitize=kernel-hwaddress)
|
||||
|
||||
config KASAN
|
||||
bool "KASan: runtime memory debugger"
|
||||
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 (SLUB && SYSFS) || (SLAB && !DEBUG_SLAB)
|
||||
help
|
||||
Enables KASAN (KernelAddressSANitizer) - runtime memory debugger,
|
||||
designed to find out-of-bounds accesses and use-after-free bugs.
|
||||
See Documentation/dev-tools/kasan.rst for details.
|
||||
|
||||
choice
|
||||
prompt "KASAN mode"
|
||||
depends on KASAN
|
||||
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).
|
||||
Both generic and tag-based KASAN are strictly debugging features.
|
||||
|
||||
config KASAN_GENERIC
|
||||
bool "Generic mode"
|
||||
depends on HAVE_ARCH_KASAN && CC_HAS_KASAN_GENERIC
|
||||
depends on (SLUB && SYSFS) || (SLAB && !DEBUG_SLAB)
|
||||
select SLUB_DEBUG if SLUB
|
||||
select CONSTRUCTORS
|
||||
select STACKDEPOT
|
||||
help
|
||||
Enables kernel address sanitizer - runtime memory debugger,
|
||||
designed to find out-of-bounds accesses and use-after-free bugs.
|
||||
This is strictly a debugging feature and it requires a gcc version
|
||||
of 4.9.2 or later. Detection of out of bounds accesses to stack or
|
||||
global variables requires gcc 5.0 or later.
|
||||
This feature consumes about 1/8 of available memory and brings about
|
||||
~x3 performance slowdown.
|
||||
Enables generic KASAN mode.
|
||||
Supported in both GCC and Clang. With GCC it requires version 4.9.2
|
||||
or later for basic support and version 5.0 or later for detection of
|
||||
out-of-bounds accesses for stack and global variables and for inline
|
||||
instrumentation mode (CONFIG_KASAN_INLINE). With Clang it requires
|
||||
version 3.7.0 or later and it doesn't support detection of
|
||||
out-of-bounds accesses for global variables yet.
|
||||
This mode consumes about 1/8th of available memory at kernel start
|
||||
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 doesn't work with CONFIG_DEBUG_SLAB
|
||||
Currently CONFIG_KASAN_GENERIC doesn't work with CONFIG_DEBUG_SLAB
|
||||
(the resulting kernel does not boot).
|
||||
|
||||
config KASAN_EXTRA
|
||||
bool "KAsan: extra checks"
|
||||
depends on KASAN && DEBUG_KERNEL && !COMPILE_TEST
|
||||
config KASAN_SW_TAGS
|
||||
bool "Software tag-based mode"
|
||||
depends on HAVE_ARCH_KASAN_SW_TAGS && CC_HAS_KASAN_SW_TAGS
|
||||
depends on (SLUB && SYSFS) || (SLAB && !DEBUG_SLAB)
|
||||
select SLUB_DEBUG if SLUB
|
||||
select CONSTRUCTORS
|
||||
select STACKDEPOT
|
||||
help
|
||||
This enables further checks in the kernel address sanitizer, for now
|
||||
it only includes the address-use-after-scope check that can lead
|
||||
to excessive kernel stack usage, frame size warnings and longer
|
||||
compile time.
|
||||
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 has more
|
||||
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 version 7.0.0 or later.
|
||||
This mode consumes about 1/16th of available memory at kernel start
|
||||
and introduces an overhead of ~20% for the rest of the allocations.
|
||||
This mode may potentially introduce problems relating to pointer
|
||||
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).
|
||||
|
||||
endchoice
|
||||
|
||||
config KASAN_EXTRA
|
||||
bool "KASAN: extra checks"
|
||||
depends on KASAN_GENERIC && DEBUG_KERNEL && !COMPILE_TEST
|
||||
help
|
||||
This enables further checks in generic KASAN, for now it only
|
||||
includes the address-use-after-scope check that can lead to
|
||||
excessive kernel stack usage, frame size warnings and longer
|
||||
compile time.
|
||||
See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81715
|
||||
|
||||
choice
|
||||
prompt "Instrumentation type"
|
||||
|
|
@ -53,7 +109,7 @@ config KASAN_INLINE
|
|||
memory accesses. This is faster than outline (in some workloads
|
||||
it gives about x2 boost over outline instrumentation), but
|
||||
make kernel's .text size much bigger.
|
||||
This requires a gcc version of 5.0 or later.
|
||||
For CONFIG_KASAN_GENERIC this requires GCC 5.0 or later.
|
||||
|
||||
endchoice
|
||||
|
||||
|
|
@ -67,11 +123,9 @@ config KASAN_S390_4_LEVEL_PAGING
|
|||
4-level paging instead.
|
||||
|
||||
config TEST_KASAN
|
||||
tristate "Module for testing kasan for bug detection"
|
||||
tristate "Module for testing KASAN for bug detection"
|
||||
depends on m && KASAN
|
||||
help
|
||||
This is a test module doing various nasty things like
|
||||
out of bounds accesses, use after free. It is useful for testing
|
||||
kernel debugging features like kernel address sanitizer.
|
||||
|
||||
endif
|
||||
kernel debugging features like KASAN.
|
||||
|
|
|
|||
Loading…
Reference in a new issue