211 lines
6.9 KiB
Plaintext
Raw Normal View History

2026-01-21 18:59:54 +08:00
# SPDX-License-Identifier: GPL-2.0-only
2026-01-29 22:25:33 +08:00
2026-01-21 18:59:54 +08:00
# This config refers to the generic KASAN mode.
config HAVE_ARCH_KASAN
bool
config HAVE_ARCH_KASAN_SW_TAGS
bool
config HAVE_ARCH_KASAN_HW_TAGS
bool
config HAVE_ARCH_KASAN_VMALLOC
bool
2026-01-29 22:25:33 +08:00
config ARCH_DISABLE_KASAN_INLINE
bool
help
Disables both inline and stack instrumentation. Selected by
architectures that do not support these instrumentation types.
2026-01-21 18:59:54 +08:00
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)
# This option is only required for software KASAN modes.
2026-01-29 22:25:33 +08:00
# Old GCC versions do not have proper support for no_sanitize_address.
2026-01-21 18:59:54 +08:00
# 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
2026-01-29 22:25:33 +08:00
bool "KASAN: dynamic memory safety error detector"
2026-01-21 18:59:54 +08:00
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
2026-01-29 22:25:33 +08:00
depends on (SLUB && SYSFS && !SLUB_TINY) || (SLAB && !DEBUG_SLAB)
select STACKDEPOT_ALWAYS_INIT
2026-01-21 18:59:54 +08:00
help
2026-01-29 22:25:33 +08:00
Enables KASAN (Kernel Address Sanitizer) - a dynamic memory safety
error detector designed to find out-of-bounds and use-after-free bugs.
2026-01-21 18:59:54 +08:00
See Documentation/dev-tools/kasan.rst for details.
2026-01-29 22:25:33 +08:00
For better error reports, also enable CONFIG_STACKTRACE.
2026-01-21 18:59:54 +08:00
if KASAN
2026-01-29 22:25:33 +08:00
config CC_HAS_KASAN_MEMINTRINSIC_PREFIX
def_bool (CC_IS_CLANG && $(cc-option,-fsanitize=kernel-address -mllvm -asan-kernel-mem-intrinsic-prefix=1)) || \
(CC_IS_GCC && $(cc-option,-fsanitize=kernel-address --param asan-kernel-mem-intrinsic-prefix=1))
# Don't define it if we don't need it: compilation of the test uses
# this variable to decide how the compiler should treat builtins.
depends on !KASAN_HW_TAGS
help
The compiler is able to prefix memintrinsics with __asan or __hwasan.
2026-01-21 18:59:54 +08:00
choice
prompt "KASAN mode"
default KASAN_GENERIC
help
KASAN has three modes:
2026-01-29 22:25:33 +08:00
1. Generic KASAN (supported by many architectures, enabled with
CONFIG_KASAN_GENERIC, similar to userspace ASan),
2. Software Tag-Based KASAN (arm64 only, based on software memory
tagging, enabled with CONFIG_KASAN_SW_TAGS, similar to userspace
HWASan), and
3. Hardware Tag-Based KASAN (arm64 only, based on hardware memory
tagging, enabled with CONFIG_KASAN_HW_TAGS).
2026-01-21 18:59:54 +08:00
2026-01-29 22:25:33 +08:00
See Documentation/dev-tools/kasan.rst for details about each mode.
2026-01-21 18:59:54 +08:00
config KASAN_GENERIC
2026-01-29 22:25:33 +08:00
bool "Generic KASAN"
2026-01-21 18:59:54 +08:00
depends on HAVE_ARCH_KASAN && CC_HAS_KASAN_GENERIC
2026-01-29 22:25:33 +08:00
depends on CC_HAS_WORKING_NOSANITIZE_ADDRESS
2026-01-21 18:59:54 +08:00
select SLUB_DEBUG if SLUB
select CONSTRUCTORS
help
2026-01-29 22:25:33 +08:00
Enables Generic KASAN.
2026-01-21 18:59:54 +08:00
2026-01-29 22:25:33 +08:00
Requires GCC 8.3.0+ or Clang.
2026-01-21 18:59:54 +08:00
2026-01-29 22:25:33 +08:00
Consumes about 1/8th of available memory at kernel start and adds an
overhead of ~50% for dynamic allocations.
2026-01-21 18:59:54 +08:00
The performance slowdown is ~x3.
2026-01-29 22:25:33 +08:00
(Incompatible with CONFIG_DEBUG_SLAB: the kernel does not boot.)
2026-01-21 18:59:54 +08:00
config KASAN_SW_TAGS
2026-01-29 22:25:33 +08:00
bool "Software Tag-Based KASAN"
2026-01-21 18:59:54 +08:00
depends on HAVE_ARCH_KASAN_SW_TAGS && CC_HAS_KASAN_SW_TAGS
2026-01-29 22:25:33 +08:00
depends on CC_HAS_WORKING_NOSANITIZE_ADDRESS
2026-01-21 18:59:54 +08:00
select SLUB_DEBUG if SLUB
select CONSTRUCTORS
help
2026-01-29 22:25:33 +08:00
Enables Software Tag-Based KASAN.
Requires GCC 11+ or Clang.
2026-01-21 18:59:54 +08:00
2026-01-29 22:25:33 +08:00
Supported only on arm64 CPUs and relies on Top Byte Ignore.
2026-01-21 18:59:54 +08:00
2026-01-29 22:25:33 +08:00
Consumes about 1/16th of available memory at kernel start and
add an overhead of ~20% for dynamic allocations.
2026-01-21 18:59:54 +08:00
2026-01-29 22:25:33 +08:00
May potentially introduce problems related to pointer casting and
comparison, as it embeds a tag into the top byte of each pointer.
2026-01-21 18:59:54 +08:00
2026-01-29 22:25:33 +08:00
(Incompatible with CONFIG_DEBUG_SLAB: the kernel does not boot.)
2026-01-21 18:59:54 +08:00
config KASAN_HW_TAGS
2026-01-29 22:25:33 +08:00
bool "Hardware Tag-Based KASAN"
2026-01-21 18:59:54 +08:00
depends on HAVE_ARCH_KASAN_HW_TAGS
depends on SLUB
help
2026-01-29 22:25:33 +08:00
Enables Hardware Tag-Based KASAN.
2026-01-21 18:59:54 +08:00
2026-01-29 22:25:33 +08:00
Requires GCC 10+ or Clang 12+.
2026-01-21 18:59:54 +08:00
2026-01-29 22:25:33 +08:00
Supported only on arm64 CPUs starting from ARMv8.5 and relies on
Memory Tagging Extension and Top Byte Ignore.
Consumes about 1/32nd of available memory.
May potentially introduce problems related to pointer casting and
comparison, as it embeds a tag into the top byte of each pointer.
2026-01-21 18:59:54 +08:00
endchoice
choice
prompt "Instrumentation type"
depends on KASAN_GENERIC || KASAN_SW_TAGS
default KASAN_OUTLINE
config KASAN_OUTLINE
bool "Outline instrumentation"
help
2026-01-29 22:25:33 +08:00
Makes the compiler insert function calls that check whether the memory
is accessible before each memory access. Slower than KASAN_INLINE, but
does not bloat the size of the kernel's .text section so much.
2026-01-21 18:59:54 +08:00
config KASAN_INLINE
bool "Inline instrumentation"
2026-01-29 22:25:33 +08:00
depends on !ARCH_DISABLE_KASAN_INLINE
2026-01-21 18:59:54 +08:00
help
2026-01-29 22:25:33 +08:00
Makes the compiler directly insert memory accessibility checks before
each memory access. Faster than KASAN_OUTLINE (gives ~x2 boost for
some workloads), but makes the kernel's .text size much bigger.
2026-01-21 18:59:54 +08:00
endchoice
config KASAN_STACK
2026-01-29 22:25:33 +08:00
bool "Stack instrumentation (unsafe)" if CC_IS_CLANG && !COMPILE_TEST
2026-01-21 18:59:54 +08:00
depends on KASAN_GENERIC || KASAN_SW_TAGS
2026-01-29 22:25:33 +08:00
depends on !ARCH_DISABLE_KASAN_INLINE
2026-01-21 18:59:54 +08:00
default y if CC_IS_GCC
help
2026-01-29 22:25:33 +08:00
Disables stack instrumentation and thus KASAN's ability to detect
out-of-bounds bugs in stack variables.
With Clang, stack instrumentation has a problem that causes excessive
stack usage, see https://bugs.llvm.org/show_bug.cgi?id=38809. Thus,
with Clang, this option is deemed unsafe.
This option is always disabled when compile-testing with Clang to
avoid cluttering the log with stack overflow warnings.
With GCC, enabling stack instrumentation is assumed to be safe.
If the architecture disables inline instrumentation via
ARCH_DISABLE_KASAN_INLINE, stack instrumentation gets disabled
as well, as it adds inline-style instrumentation that is run
unconditionally.
2026-01-21 18:59:54 +08:00
config KASAN_VMALLOC
2026-01-29 22:25:33 +08:00
bool "Check accesses to vmalloc allocations"
depends on HAVE_ARCH_KASAN_VMALLOC
2026-01-21 18:59:54 +08:00
help
2026-01-29 22:25:33 +08:00
Makes KASAN check the validity of accesses to vmalloc allocations.
With software KASAN modes, all types vmalloc allocations are
checked. Enabling this option leads to higher memory usage.
2026-01-21 18:59:54 +08:00
2026-01-29 22:25:33 +08:00
With Hardware Tag-Based KASAN, only non-executable VM_ALLOC mappings
are checked. There is no additional memory usage.
2026-01-21 18:59:54 +08:00
config KASAN_KUNIT_TEST
tristate "KUnit-compatible tests of KASAN bug detection capabilities" if !KUNIT_ALL_TESTS
2026-01-29 22:25:33 +08:00
depends on KASAN && KUNIT && TRACEPOINTS
2026-01-21 18:59:54 +08:00
default KUNIT_ALL_TESTS
help
2026-01-29 22:25:33 +08:00
A KUnit-based KASAN test suite. Triggers different kinds of
out-of-bounds and use-after-free accesses. Useful for testing whether
KASAN can detect certain bug types.
2026-01-21 18:59:54 +08:00
For more information on KUnit and unit tests in general, please refer
2026-01-29 22:25:33 +08:00
to the KUnit documentation in Documentation/dev-tools/kunit/.
2026-01-21 18:59:54 +08:00
config KASAN_MODULE_TEST
tristate "KUnit-incompatible tests of KASAN bug detection capabilities"
depends on m && KASAN && !KASAN_HW_TAGS
help
2026-01-29 22:25:33 +08:00
A part of the KASAN test suite that is not integrated with KUnit.
Incompatible with Hardware Tag-Based KASAN.
2026-01-21 18:59:54 +08:00
endif # KASAN