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

choice
	prompt "Build heap manager"
	default MM_DEFAULT_MANAGER

config MM_DEFAULT_MANAGER
	bool "Default heap manager"
	---help---
		NuttX original memory manager strategy.

config MM_TLSF_MANAGER
	bool "TLSF heap manager"
	---help---
		TLSF memory manager strategy.

config MM_CUSTOMIZE_MANAGER
	bool "Customized heap manager"
	---help---
		Customized memory manager policy. The build will fail
		if the MM heap module not defined by customer.

endchoice

config MM_KERNEL_HEAP
	bool "Kernel dedicated heap"
	default BUILD_PROTECTED || BUILD_KERNEL
	---help---
		Under Flat build, this option will enable a separate heap for the kernel.
		By separating the kernel and userspace heaps, the user is granted more
		control over the heaps placement within the memory hierarchy, which is
		specially useful for microcontrollers that provide External RAM.
		Besides segregating the kernel and userspace allocations, this feature
		does not prevent the userspace from accessing the kernel heap.

		As for Protected and Kernel builds, this feature partitions heap memory
		into two parts:
		(1) a protected, kernel-mode heap accessible only by the NuttX kernel,
		and (2) an unprotected user-mode heap for use by applications.
		If you are only interested in protecting the kernel from read access,
		then this option is not necessary. If you wish to secure the kernel data
		as well, then this option should be selected.

		The kernel heap size that is used is provided a a platform-specific
		up_allocate_kheap() interface.  This configuration setting is made
		available to that platform specific code.  However, the
		up_allocate_kheap() interface may chose to ignore this setting if it
		has a more appropriate heap allocation strategy.

config MM_KERNEL_HEAPSIZE
	int "Kernel heap size"
	default 8192
	depends on MM_KERNEL_HEAP
	---help---
		This is the size of the a protected, kernel-mode heap (in bytes).
		The remaining of available memory is given to the unprotected
		user-mode heap.  This value may need to be aligned to units of the
		size of the smallest memory protection region.

config MM_DEFAULT_ALIGNMENT
	int "Memory default alignment in bytes"
	default 8
	range 0 64
	---help---
		The memory default alignment in bytes, if this value is 0, the real
		memory default alignment is equal to sizoef(uintptr), if this value
		is not 0, this value must be 2^n and at least sizeof(uintptr).

config MM_NODE_GUARDSIZE
	int "Memory node guard size"
	default 0
	---help---
		After it is enabled, the front and rear nodes will maintain a safety
		distance of at least CONFIG_MM_NODE_GUARDSIZE.

config MM_SMALL
	bool "Small memory model"
	default n
	depends on MM_DEFAULT_MANAGER
	---help---
		Each memory allocation has a small allocation overhead.  The size
		of that overhead is normally determined by the "width" of the
		address support by the MCU.  MCUs that support 16-bit addressability
		have smaller overhead than devices that support 32-bit addressability.
		However, there are many MCUs that support 32-bit addressability *but*
		have internal SRAM of size less than or equal to 64Kb.  In this case,
		MM_SMALL can be defined so that those MCUs will also benefit
		from the smaller, 16-bit-based allocation overhead.

		WARNING:  This selection will also change the alignment of allocated
		memory.  For example, on ARM memory will have 8-byte alignment by
		default.  If MM_SMALL is selected, then allocated memory will have
		only 4-byte alignment.  This may be important on some platforms where
		64-bit data is in allocated structures and 8-byte alignment is required.

config MM_REGIONS
	int "Number of memory regions"
	default 1
	---help---
		If the architecture includes multiple, non-contiguous regions of
		memory to allocate from, this specifies the number of memory regions
		that the memory manager must handle and enables the API
		mm_addregion(heap, start, end);

config MM_MAP_COUNT_MAX
	int "The maximum number of memory map areas for each task"
	default 1024
	---help---
		The maximum number of memory map areas for each task.

config MM_FILL_ALLOCATIONS
	bool "Fill allocations with debug value"
	default n
	---help---
		Fill all malloc() allocations with MM_ALLOC_MAGIC.
		Fill all add_addregion() with MM_INIT_MAGIC.
		Fill all free() with MM_FREE_MAGIC.
		This helps detecting uninitialized variable errors.

config MM_BACKTRACE
	int "The depth of backtrace"
	default -1
	---help---
		Config the depth of backtrace in memory block by specified this
		config: disable backtrace by -1, only record pid info by zero and
		enable record backtrace info by 8(fixed depth).

config MM_BACKTRACE_SKIP
	int "The skip depth of backtrace"
	depends on MM_BACKTRACE > 0
	default 3

config MM_BACKTRACE_DEFAULT
	bool "Enable the backtrace record by default"
	default n
	depends on MM_BACKTRACE > 0

config MM_DUMP_ON_FAILURE
	bool "Dump heap info on allocation failure"
	default n
	depends on DEBUG_MM

config MM_DUMP_DETAILS_ON_FAILURE
	bool "Dump all used memory blocks on allocation failure"
	default n
	depends on MM_DUMP_ON_FAILURE

config MM_PANIC_ON_FAILURE
	bool "Panic on allocation failure"
	default n
	depends on DEBUG_MM

config MM_FREE_DELAYCOUNT_MAX
	int "Maximum memory nodes can be delayed to free"
	default 0
	---help---
		Set to 0 to disable the delayed free mechanism. Otherwise,
		the value decides the maximum number of memory nodes that
		will be delayed to free.

config MM_HEAP_BIGGEST_COUNT
	int "The largest malloc element dump count"
	default 30
	---help---
		The dump support for largest allocated memory.
		If too big, should take care of stack usage.
		Define 0 to disable largest allocated element dump feature.

config MM_HEAP_MEMPOOL_THRESHOLD
	int "Threshold for malloc size to use multi-level mempool"
	default -1
	---help---
		If the size of the memory requested by the user is less
		than the threshold, the memory will be requested from the
		multiple mempool by default.
		 > 0 Enable pool feature, and set umm/kmm pool threshold size.
		== 0 Enable pool feature, but disable the umm/kmm pool function.
		 < 0 Disable pool feature.

if MM_HEAP_MEMPOOL_THRESHOLD > 0

config MM_HEAP_MEMPOOL_EXPAND_SIZE
	int "The expand size for each mempool in multiple mempool"
	default 4096
	---help---
		This size describes the size of each expansion of each memory
		pool with insufficient memory in the multi-level memory pool.

config MM_HEAP_MEMPOOL_DICTIONARY_EXPAND_SIZE
	int "The expand size for multiple mempool's dictionary"
	default MM_HEAP_MEMPOOL_EXPAND_SIZE
	---help---
		This size describes the multiple mempool dictionary expand.

config MM_HEAP_MEMPOOL_CHUNK_SIZE
	int "The multiples pool chunk size"
	default 0
	---help---
		This size describes the multiple mempool chunk size.

config MM_MIN_BLKSIZE
	int "Minimum memory block size"
	default 0
	---help---
		Users can configure the minimum memory block size as needed

endif # MM_HEAP_MEMPOOL_THRESHOLD > 0

config ARCH_HAVE_HEAP2
	bool
	default n

if ARCH_HAVE_HEAP2

config HEAP2_BASE
	hex "Start address of second user heap region"
	default 0x00000000
	---help---
		The base address of the second heap region.

config HEAP2_SIZE
	int "Size of the second user heap region"
	default 0
	---help---
		The size of the second heap region.

endif # ARCH_HAVE_HEAP2

config GRAN
	bool "Enable Granule Allocator"
	default n
	---help---
		Enable granule allocator support.  Allocations will be aligned to the
		granule size; allocations will be in units of the granule size.
		Larger granules will give better performance and less overhead but
		more losses of memory due to alignment and quantization waste.

		NOTE: The current implementation also restricts the maximum
		allocation size to 32 granules.  That restriction could be
		eliminated with some additional coding effort.

if GRAN

config GRAN_INTR
	bool "Interrupt level support"
	default n
	---help---
		Normally mutual exclusive access to granule allocator data is assured
		using a semaphore.  If this option is set then, instead, mutual
		exclusion logic will disable interrupts.  While this options is more
		invasive to system performance, it will also support use of the granule
		allocator from interrupt level logic.

config DEBUG_GRAN
	bool "Granule Allocator Debug"
	default n
	depends on DEBUG_FEATURES
	---help---
		Just like DEBUG_MM, but only generates output from the gran
		allocation logic.

endif # GRAN

config MM_PGALLOC
	bool "Enable Page Allocator"
	default n
	depends on ARCH_USE_MMU
	select GRAN
	---help---
		Enable support for a MMU physical page allocator based on the
		granule allocator.

if MM_PGALLOC

config MM_PGSIZE
	int "Page Size"
	default 4096
	---help---
		The MMU page size.  Must be one of {1024, 2048, 4096, 8192, or
		16384}.  This is easily extensible, but only those values are
		currently support.

config DEBUG_PGALLOC
	bool "Page Allocator Debug"
	default n
	depends on DEBUG_FEATURES
	---help---
		Just like DEBUG_MM, but only generates output from the page
		allocation logic.

endif # MM_PGALLOC

config MM_SHM
	bool "Shared memory support"
	default n
	depends on MM_PGALLOC && BUILD_KERNEL
	select ARCH_VMA_MAPPING
	---help---
		Build support for mapping physical memory to user-space via
		shared memory interfaces like shmget(), shmat(), shmctl(),
		etc, or device mapping interfaces like vm_map_region() etc.

config MM_KMAP
	bool "Support for dynamic kernel virtual mappings"
	default n
	depends on MM_PGALLOC && BUILD_KERNEL
	select ARCH_KVMA_MAPPING
	---help---
		Build support for dynamically mapping pages from the page pool into
		kernel virtual memory. This includes pages that are already mapped
		for user.

config MM_HEAP_MEMPOOL_BACKTRACE_SKIP
	int "The skip depth of backtrace for mempool"
	default 6
	depends on MM_BACKTRACE > 0
	---help---
		This number is the skipped backtrace depth for mempool.

config FS_PROCFS_EXCLUDE_MEMPOOL
	bool "Exclude mempool from procfs"
	default DEFAULT_SMALL
	depends on FS_PROCFS && MM_HEAP_MEMPOOL_THRESHOLD > 0

source "mm/kasan/Kconfig"

config MM_UBSAN
	bool "Undefined Behavior Sanitizer"
	default n
	---help---
		UBSan is a fast undefined behavior detector. UBSan modifies
		the program at compile-time to catch various kinds of
		undefined behavior during program execution

if MM_UBSAN

config MM_UBSAN_ALL
	bool "Enable UBSan for the entire image"
	default y
	---help---
		This option activates UBSan instrumentation for the
		entire image. If you don't enable this option, you have to
		explicitly specify "-fsanitize=undefined" for
		the files/directories you want to check. Enabling this option
		will get image size increased and performance decreased
		significantly.

config MM_UBSAN_OPTION
	string "UBSan options"
	default "-fsanitize=undefined"
	---help---
		This option activates specified UBSan instrumentation. Please
		refer to https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
		for available options.

config MM_UBSAN_TRAP_ON_ERROR
	bool "Enable UBSan trap on error to crash immediately"
	default n
	---help---
		The undefined instruction trap should cause your program to crash,
		save the code space significantly.

config MM_UBSAN_DUMMY
	bool "Bypass Undefined Behaviour Sanitizer Runtime Actions"
	default n
	---help---
		Allow to compile with UBSAN enabled but disables runtime actions.

endif # MM_UBSAN

source "mm/iob/Kconfig"
