cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

Kconfig.kcsan (10217B)


      1# SPDX-License-Identifier: GPL-2.0-only
      2
      3config HAVE_ARCH_KCSAN
      4	bool
      5
      6config HAVE_KCSAN_COMPILER
      7	def_bool (CC_IS_CLANG && $(cc-option,-fsanitize=thread -mllvm -tsan-distinguish-volatile=1)) || \
      8		 (CC_IS_GCC && $(cc-option,-fsanitize=thread --param tsan-distinguish-volatile=1))
      9	help
     10	  For the list of compilers that support KCSAN, please see
     11	  <file:Documentation/dev-tools/kcsan.rst>.
     12
     13menuconfig KCSAN
     14	bool "KCSAN: dynamic data race detector"
     15	depends on HAVE_ARCH_KCSAN && HAVE_KCSAN_COMPILER
     16	depends on DEBUG_KERNEL && !KASAN
     17	select STACKTRACE
     18	help
     19	  The Kernel Concurrency Sanitizer (KCSAN) is a dynamic
     20	  data-race detector that relies on compile-time instrumentation.
     21	  KCSAN uses a watchpoint-based sampling approach to detect races.
     22
     23	  While KCSAN's primary purpose is to detect data races, it
     24	  also provides assertions to check data access constraints.
     25	  These assertions can expose bugs that do not manifest as
     26	  data races.
     27
     28	  See <file:Documentation/dev-tools/kcsan.rst> for more details.
     29
     30if KCSAN
     31
     32config CC_HAS_TSAN_COMPOUND_READ_BEFORE_WRITE
     33	def_bool (CC_IS_CLANG && $(cc-option,-fsanitize=thread -mllvm -tsan-compound-read-before-write=1)) || \
     34		 (CC_IS_GCC && $(cc-option,-fsanitize=thread --param tsan-compound-read-before-write=1))
     35	help
     36	  The compiler instruments plain compound read-write operations
     37	  differently (++, --, +=, -=, |=, &=, etc.), which allows KCSAN to
     38	  distinguish them from other plain accesses. This is currently
     39	  supported by Clang 12 or later.
     40
     41config KCSAN_VERBOSE
     42	bool "Show verbose reports with more information about system state"
     43	depends on PROVE_LOCKING
     44	help
     45	  If enabled, reports show more information about the system state that
     46	  may help better analyze and debug races. This includes held locks and
     47	  IRQ trace events.
     48
     49	  While this option should generally be benign, we call into more
     50	  external functions on report generation; if a race report is
     51	  generated from any one of them, system stability may suffer due to
     52	  deadlocks or recursion.  If in doubt, say N.
     53
     54config KCSAN_SELFTEST
     55	bool "Perform short selftests on boot"
     56	default y
     57	help
     58	  Run KCSAN selftests on boot. On test failure, causes the kernel to
     59	  panic. Recommended to be enabled, ensuring critical functionality
     60	  works as intended.
     61
     62config KCSAN_KUNIT_TEST
     63	tristate "KCSAN test for integrated runtime behaviour" if !KUNIT_ALL_TESTS
     64	default KUNIT_ALL_TESTS
     65	depends on TRACEPOINTS && KUNIT
     66	select TORTURE_TEST
     67	help
     68	  KCSAN test focusing on behaviour of the integrated runtime. Tests
     69	  various race scenarios, and verifies the reports generated to
     70	  console. Makes use of KUnit for test organization, and the Torture
     71	  framework for test thread control.
     72
     73	  Each test case may run at least up to KCSAN_REPORT_ONCE_IN_MS
     74	  milliseconds. Test run duration may be optimized by building the
     75	  kernel and KCSAN test with KCSAN_REPORT_ONCE_IN_MS set to a lower
     76	  than default value.
     77
     78	  Say Y here if you want the test to be built into the kernel and run
     79	  during boot; say M if you want the test to build as a module; say N
     80	  if you are unsure.
     81
     82config KCSAN_EARLY_ENABLE
     83	bool "Early enable during boot"
     84	default y
     85	help
     86	  If KCSAN should be enabled globally as soon as possible. KCSAN can
     87	  later be enabled/disabled via debugfs.
     88
     89config KCSAN_NUM_WATCHPOINTS
     90	int "Number of available watchpoints"
     91	default 64
     92	help
     93	  Total number of available watchpoints. An address range maps into a
     94	  specific watchpoint slot as specified in kernel/kcsan/encoding.h.
     95	  Although larger number of watchpoints may not be usable due to
     96	  limited number of CPUs, a larger value helps to improve performance
     97	  due to reducing cache-line contention. The chosen default is a
     98	  conservative value; we should almost never observe "no_capacity"
     99	  events (see /sys/kernel/debug/kcsan).
    100
    101config KCSAN_UDELAY_TASK
    102	int "Delay in microseconds (for tasks)"
    103	default 80
    104	help
    105	  For tasks, the microsecond delay after setting up a watchpoint.
    106
    107config KCSAN_UDELAY_INTERRUPT
    108	int "Delay in microseconds (for interrupts)"
    109	default 20
    110	help
    111	  For interrupts, the microsecond delay after setting up a watchpoint.
    112	  Interrupts have tighter latency requirements, and their delay should
    113	  be lower than for tasks.
    114
    115config KCSAN_DELAY_RANDOMIZE
    116	bool "Randomize above delays"
    117	default y
    118	help
    119	  If delays should be randomized, where the maximum is KCSAN_UDELAY_*.
    120	  If false, the chosen delays are always the KCSAN_UDELAY_* values
    121	  as defined above.
    122
    123config KCSAN_SKIP_WATCH
    124	int "Skip instructions before setting up watchpoint"
    125	default 4000
    126	help
    127	  The number of per-CPU memory operations to skip, before another
    128	  watchpoint is set up, i.e. one in KCSAN_WATCH_SKIP per-CPU
    129	  memory operations are used to set up a watchpoint. A smaller value
    130	  results in more aggressive race detection, whereas a larger value
    131	  improves system performance at the cost of missing some races.
    132
    133config KCSAN_SKIP_WATCH_RANDOMIZE
    134	bool "Randomize watchpoint instruction skip count"
    135	default y
    136	help
    137	  If instruction skip count should be randomized, where the maximum is
    138	  KCSAN_WATCH_SKIP. If false, the chosen value is always
    139	  KCSAN_WATCH_SKIP.
    140
    141config KCSAN_INTERRUPT_WATCHER
    142	bool "Interruptible watchers" if !KCSAN_STRICT
    143	default KCSAN_STRICT
    144	help
    145	  If enabled, a task that set up a watchpoint may be interrupted while
    146	  delayed. This option will allow KCSAN to detect races between
    147	  interrupted tasks and other threads of execution on the same CPU.
    148
    149	  Currently disabled by default, because not all safe per-CPU access
    150	  primitives and patterns may be accounted for, and therefore could
    151	  result in false positives.
    152
    153config KCSAN_REPORT_ONCE_IN_MS
    154	int "Duration in milliseconds, in which any given race is only reported once"
    155	default 3000
    156	help
    157	  Any given race is only reported once in the defined time window.
    158	  Different races may still generate reports within a duration that is
    159	  smaller than the duration defined here. This allows rate limiting
    160	  reporting to avoid flooding the console with reports.  Setting this
    161	  to 0 disables rate limiting.
    162
    163# The main purpose of the below options is to control reported data races, and
    164# are not expected to be switched frequently by non-testers or at runtime.
    165# The defaults are chosen to be conservative, and can miss certain bugs.
    166
    167config KCSAN_REPORT_RACE_UNKNOWN_ORIGIN
    168	bool "Report races of unknown origin"
    169	default y
    170	help
    171	  If KCSAN should report races where only one access is known, and the
    172	  conflicting access is of unknown origin. This type of race is
    173	  reported if it was only possible to infer a race due to a data value
    174	  change while an access is being delayed on a watchpoint.
    175
    176config KCSAN_STRICT
    177	bool "Strict data-race checking"
    178	help
    179	  KCSAN will report data races with the strictest possible rules, which
    180	  closely aligns with the rules defined by the Linux-kernel memory
    181	  consistency model (LKMM).
    182
    183config KCSAN_WEAK_MEMORY
    184	bool "Enable weak memory modeling to detect missing memory barriers"
    185	default y
    186	depends on KCSAN_STRICT
    187	# We can either let objtool nop __tsan_func_{entry,exit}() and builtin
    188	# atomics instrumentation in .noinstr.text, or use a compiler that can
    189	# implement __no_kcsan to really remove all instrumentation.
    190	depends on !ARCH_WANTS_NO_INSTR || HAVE_NOINSTR_HACK || \
    191		   CC_IS_GCC || CLANG_VERSION >= 140000
    192	select OBJTOOL if HAVE_NOINSTR_HACK
    193	help
    194	  Enable support for modeling a subset of weak memory, which allows
    195	  detecting a subset of data races due to missing memory barriers.
    196
    197	  Depends on KCSAN_STRICT, because the options strenghtening certain
    198	  plain accesses by default (depending on !KCSAN_STRICT) reduce the
    199	  ability to detect any data races invoving reordered accesses, in
    200	  particular reordered writes.
    201
    202	  Weak memory modeling relies on additional instrumentation and may
    203	  affect performance.
    204
    205config KCSAN_REPORT_VALUE_CHANGE_ONLY
    206	bool "Only report races where watcher observed a data value change"
    207	default y
    208	depends on !KCSAN_STRICT
    209	help
    210	  If enabled and a conflicting write is observed via a watchpoint, but
    211	  the data value of the memory location was observed to remain
    212	  unchanged, do not report the data race.
    213
    214config KCSAN_ASSUME_PLAIN_WRITES_ATOMIC
    215	bool "Assume that plain aligned writes up to word size are atomic"
    216	default y
    217	depends on !KCSAN_STRICT
    218	help
    219	  Assume that plain aligned writes up to word size are atomic by
    220	  default, and also not subject to other unsafe compiler optimizations
    221	  resulting in data races. This will cause KCSAN to not report data
    222	  races due to conflicts where the only plain accesses are aligned
    223	  writes up to word size: conflicts between marked reads and plain
    224	  aligned writes up to word size will not be reported as data races;
    225	  notice that data races between two conflicting plain aligned writes
    226	  will also not be reported.
    227
    228config KCSAN_IGNORE_ATOMICS
    229	bool "Do not instrument marked atomic accesses"
    230	depends on !KCSAN_STRICT
    231	help
    232	  Never instrument marked atomic accesses. This option can be used for
    233	  additional filtering. Conflicting marked atomic reads and plain
    234	  writes will never be reported as a data race, however, will cause
    235	  plain reads and marked writes to result in "unknown origin" reports.
    236	  If combined with CONFIG_KCSAN_REPORT_RACE_UNKNOWN_ORIGIN=n, data
    237	  races where at least one access is marked atomic will never be
    238	  reported.
    239
    240	  Similar to KCSAN_ASSUME_PLAIN_WRITES_ATOMIC, but including unaligned
    241	  accesses, conflicting marked atomic reads and plain writes will not
    242	  be reported as data races; however, unlike that option, data races
    243	  due to two conflicting plain writes will be reported (aligned and
    244	  unaligned, if CONFIG_KCSAN_ASSUME_PLAIN_WRITES_ATOMIC=n).
    245
    246config KCSAN_PERMISSIVE
    247	bool "Enable all additional permissive rules"
    248	depends on KCSAN_REPORT_VALUE_CHANGE_ONLY
    249	help
    250	  Enable additional permissive rules to ignore certain classes of data
    251	  races (also see kernel/kcsan/permissive.h). None of the permissive
    252	  rules imply that such data races are generally safe, but can be used
    253	  to further reduce reported data races due to data-racy patterns
    254	  common across the kernel.
    255
    256endif # KCSAN