#
# For a description of the syntax of this configuration file,
# see the file kconfig-language.txt in the NuttX tools repository.
#

config MM_KASAN
	bool "Kernel Address Sanitizer"
	default n
	---help---
		KASan is a fast compiler-based tool for detecting memory
		bugs in native code. After turn on this option, Please
		add -fsanitize=kernel-address to CFLAGS/CXXFLAGS too.

config MM_KASAN_INSTRUMENT
	bool

if MM_KASAN

choice
	prompt "KAsan Mode"
	default MM_KASAN_GENERIC

config MM_KASAN_NONE
	bool "KAsan disable"
	---help---
		Disable KASan check

config MM_KASAN_GENERIC
	bool "KAsan generic mode"
	select MM_KASAN_INSTRUMENT
	---help---
		KASan generic mode that does not require hardware support at all

config MM_KASAN_SW_TAGS
	bool "KAsan softtags tags"
	select ARM64_TBI if ARCH_ARM64
	select MM_KASAN_INSTRUMENT
	---help---
		KAsan based on software tags

config MM_KASAN_HW_TAGS
	bool "KAsan hardware tags"
	select ARM64_MTE if ARCH_ARM64
	---help---
		KAsan based on hardware tags

endchoice

config MM_KASAN_INSTRUMENT_ALL
	bool "Enable KASan for the entire image"
	depends on MM_KASAN_INSTRUMENT
	default y
	---help---
		This option activates address sanitizer for the entire image.
		If you don't enable this option, you have to explicitly specify
		"-fsanitize=kernel-address" for the files/directories you want
		to check. Enabling this option will get image size increased
		and performance decreased significantly.

config MM_KASAN_MARK_LOCATION
	string "Kasan's mark storage location"
	---help---
		The section where KASan mark is located. It can prevent
		variables located in non-chip memory, and crashes
		caused by instrumentation access

if MM_KASAN_INSTRUMENT

config MM_KASAN_REGIONS
	int "Kasan region count"
	default 8

config MM_KASAN_WATCHPOINT
	int "Kasan watchpoint maximum number"
	default 0
	---help---
		The maximum number of watchpoints that can be set by KASan.

config MM_KASAN_DISABLE_NULL_POINTER_CHECK
	bool "Disable null pointer access check"
	default n
	---help---
		This option enables KASan check null pointer access.

config MM_KASAN_DISABLE_READS_CHECK
	bool "Disable reads check"
	default n
	---help---
		This option disables kasan reads check. It speeds up performance
		compared with default read/write check. Only disable it when you are
		sure there's no need to do so. Or performance is too bad and only focus
		on writes check.

config MM_KASAN_DISABLE_WRITES_CHECK
	bool "Disable writes check"
	default n
	---help---
		This option disables kasan writes check.

config MM_KASAN_DISABLE_READ_PANIC
	bool "Disable panic on kasan read error"
	default n
	---help---
		This option disables panic on kasan read error. It will print error info
		and continue to run.

config MM_KASAN_DISABLE_WRITE_PANIC
	bool "Disable panic on kasan write error"
	default n
	---help---
		This option disables panic on kasan write error. It will print error info
		and continue to run.

config MM_KASAN_SKIP_ZERO_TAGS
	bool "Enable skip check zero tags"
	default LIBC_ELF
	---help---
		This option disables checking for zero tags.

config MM_KASAN_GLOBAL
	bool "Enable global data check"
	depends on MM_KASAN_INSTRUMENT_ALL
	default n
	---help---
		This option enables KASan global data check.
		It's used to extract segments in the linker script.
		Two new segments need to be created, one being
		".kasan.unused: { *(.data..LASANLOC*) }",
		used to eliminate excess data generated.
		One is ".kasan.global:{
		KEEP ( *(. data.. LASAN0))
		KEEP ( *(. data. rel. local.. LASAN0))
		}", used to extract data generated by the compiler

config MM_KASAN_GLOBAL_ALIGN
	int "KASan global alignment"
	default 1
	depends on MM_KASAN_GLOBAL
	---help---
		It is recommended to use 1, 2, 4, 8, 16, 32.
		The maximum value is 32.

endif # MM_KASAN_INSTRUMENT
endif # MM_KASAN
