| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995 | 
							- # General architecture configuration options
 
- # Copyright (c) 2014-2015 Wind River Systems, Inc.
 
- # Copyright (c) 2015 Intel Corporation
 
- # Copyright (c) 2016 Cadence Design Systems, Inc.
 
- # SPDX-License-Identifier: Apache-2.0
 
- # Include these first so that any properties (e.g. defaults) below can be
 
- # overridden (by defining symbols in multiple locations)
 
- # Note: $ARCH might be a glob pattern
 
- source "$(ARCH_DIR)/$(ARCH)/Kconfig"
 
- # Architecture symbols
 
- #
 
- # Should be 'select'ed by low-level symbols like SOC_SERIES_* or, lacking that,
 
- # by SOC_*.
 
- config ARC
 
- 	bool
 
- 	select ARCH_IS_SET
 
- 	select HAS_DTS
 
- 	imply XIP
 
- 	select ARCH_HAS_THREAD_LOCAL_STORAGE
 
- 	help
 
- 	  ARC architecture
 
- config ARM
 
- 	bool
 
- 	select ARCH_IS_SET
 
- 	select ARCH_SUPPORTS_COREDUMP if CPU_CORTEX_M
 
- 	select HAS_DTS
 
- 	# FIXME: current state of the code for all ARM requires this, but
 
- 	# is really only necessary for Cortex-M with ARM MPU!
 
- 	select GEN_PRIV_STACKS
 
- 	select ARCH_HAS_THREAD_LOCAL_STORAGE if CPU_CORTEX_R || CPU_CORTEX_M
 
- 	help
 
- 	  ARM architecture
 
- config ARM64
 
- 	bool
 
- 	select ARCH_IS_SET
 
- 	select 64BIT
 
- 	select HAS_DTS
 
- 	select HAS_ARM_SMCCC
 
- 	select ARCH_HAS_THREAD_LOCAL_STORAGE
 
- 	select USE_SWITCH
 
- 	select USE_SWITCH_SUPPORTED
 
- 	help
 
- 	  ARM64 (AArch64) architecture
 
- config SPARC
 
- 	bool
 
- 	select ARCH_IS_SET
 
- 	select HAS_DTS
 
- 	select USE_SWITCH
 
- 	select USE_SWITCH_SUPPORTED
 
- 	select BIG_ENDIAN
 
- 	select ATOMIC_OPERATIONS_BUILTIN if SPARC_CASA
 
- 	select ATOMIC_OPERATIONS_C if !SPARC_CASA
 
- 	select ARCH_HAS_THREAD_LOCAL_STORAGE
 
- 	select ARCH_HAS_EXTRA_EXCEPTION_INFO
 
- 	help
 
- 	  SPARC architecture
 
- config X86
 
- 	bool
 
- 	select ARCH_IS_SET
 
- 	select ATOMIC_OPERATIONS_BUILTIN
 
- 	select HAS_DTS
 
- 	select ARCH_SUPPORTS_COREDUMP
 
- 	select CPU_HAS_MMU
 
- 	select ARCH_MEM_DOMAIN_DATA if USERSPACE && !X86_COMMON_PAGE_TABLE
 
- 	select ARCH_MEM_DOMAIN_SYNCHRONOUS_API if USERSPACE
 
- 	select ARCH_HAS_GDBSTUB if !X86_64
 
- 	select ARCH_HAS_TIMING_FUNCTIONS
 
- 	select ARCH_HAS_THREAD_LOCAL_STORAGE
 
- 	select ARCH_HAS_DEMAND_PAGING
 
- 	select NEED_LIBC_MEM_PARTITION if USERSPACE && TIMING_FUNCTIONS \
 
- 					  && !BOARD_HAS_TIMING_FUNCTIONS \
 
- 					  && !SOC_HAS_TIMING_FUNCTIONS
 
- 	help
 
- 	  x86 architecture
 
- config NIOS2
 
- 	bool
 
- 	select ARCH_IS_SET
 
- 	select ATOMIC_OPERATIONS_C
 
- 	select HAS_DTS
 
- 	imply XIP
 
- 	select ARCH_HAS_TIMING_FUNCTIONS
 
- 	help
 
- 	  Nios II Gen 2 architecture
 
- config RISCV
 
- 	bool
 
- 	select ARCH_IS_SET
 
- 	select HAS_DTS
 
- 	select ARCH_HAS_THREAD_LOCAL_STORAGE
 
- 	imply XIP
 
- 	help
 
- 	  RISCV architecture
 
- config XTENSA
 
- 	bool
 
- 	select ARCH_IS_SET
 
- 	select HAS_DTS
 
- 	select USE_SWITCH
 
- 	select USE_SWITCH_SUPPORTED
 
- 	imply ATOMIC_OPERATIONS_ARCH
 
- 	help
 
- 	  Xtensa architecture
 
- config ARCH_POSIX
 
- 	bool
 
- 	select ARCH_IS_SET
 
- 	select HAS_DTS
 
- 	select ATOMIC_OPERATIONS_BUILTIN
 
- 	select ARCH_HAS_CUSTOM_SWAP_TO_MAIN
 
- 	select ARCH_HAS_CUSTOM_BUSY_WAIT
 
- 	select ARCH_HAS_THREAD_ABORT
 
- 	select NATIVE_APPLICATION
 
- 	select HAS_COVERAGE_SUPPORT
 
- 	help
 
- 	  POSIX (native) architecture
 
- config ARCH_IS_SET
 
- 	bool
 
- 	help
 
- 	  Helper symbol to detect SoCs forgetting to select one of the arch
 
- 	  symbols above. See the top-level CMakeLists.txt.
 
- menu "General Architecture Options"
 
- module = ARCH
 
- module-str = arch
 
- source "subsys/logging/Kconfig.template.log_config"
 
- module = MPU
 
- module-str = mpu
 
- source "subsys/logging/Kconfig.template.log_config"
 
- config BIG_ENDIAN
 
- 	bool
 
- 	help
 
- 	  This option tells the build system that the target system is big-endian.
 
- 	  Little-endian architecture is the default and should leave this option
 
- 	  unselected.  This option is selected by arch/$ARCH/Kconfig,
 
- 	  soc/**/Kconfig, or boards/**/Kconfig and the user should generally avoid
 
- 	  modifying it.  The option is used to select linker script OUTPUT_FORMAT
 
- 	  and command line option for gen_isr_tables.py.
 
- config 64BIT
 
- 	bool
 
- 	help
 
- 	  This option tells the build system that the target system is
 
- 	  using a 64-bit address space, meaning that pointer and long types
 
- 	  are 64 bits wide. This option is selected by arch/$ARCH/Kconfig,
 
- 	  soc/**/Kconfig, or boards/**/Kconfig and the user should generally
 
- 	  avoid modifying it.
 
- # Workaround for not being able to have commas in macro arguments
 
- DT_CHOSEN_Z_SRAM := zephyr,sram
 
- config SRAM_SIZE
 
- 	int "SRAM Size in kB"
 
- 	default $(dt_chosen_reg_size_int,$(DT_CHOSEN_Z_SRAM),0,K)
 
- 	help
 
- 	  The SRAM size in kB. The default value comes from /chosen/zephyr,sram in
 
- 	  devicetree. The user should generally avoid changing it via menuconfig or
 
- 	  in configuration files.
 
- config SRAM_BASE_ADDRESS
 
- 	hex "SRAM Base Address"
 
- 	default $(dt_chosen_reg_addr_hex,$(DT_CHOSEN_Z_SRAM))
 
- 	help
 
- 	  The SRAM base address. The default value comes from from
 
- 	  /chosen/zephyr,sram in devicetree. The user should generally avoid
 
- 	  changing it via menuconfig or in configuration files.
 
- if ARC || ARM || ARM64 || NIOS2 || X86
 
- # Workaround for not being able to have commas in macro arguments
 
- DT_CHOSEN_Z_FLASH := zephyr,flash
 
- config FLASH_SIZE
 
- 	int "Flash Size in kB"
 
- 	default $(dt_chosen_reg_size_int,$(DT_CHOSEN_Z_FLASH),0,K) if (XIP && (ARM ||ARM64)) || !ARM
 
- 	help
 
- 	  This option specifies the size of the flash in kB.  It is normally set by
 
- 	  the board's defconfig file and the user should generally avoid modifying
 
- 	  it via the menu configuration.
 
- config FLASH_BASE_ADDRESS
 
- 	hex "Flash Base Address"
 
- 	default $(dt_chosen_reg_addr_hex,$(DT_CHOSEN_Z_FLASH)) if (XIP && (ARM || ARM64)) || !ARM
 
- 	help
 
- 	  This option specifies the base address of the flash on the board. It is
 
- 	  normally set by the board's defconfig file and the user should generally
 
- 	  avoid modifying it via the menu configuration.
 
- endif # ARM || ARM64 || ARC || NIOS2 || X86
 
- if ARCH_HAS_TRUSTED_EXECUTION
 
- config TRUSTED_EXECUTION_SECURE
 
- 	bool "Trusted Execution: Secure firmware image"
 
- 	help
 
- 	  Select this option to enable building a Secure firmware
 
- 	  image for a platform that supports Trusted Execution. A
 
- 	  Secure firmware image will execute in Secure state. It may
 
- 	  allow the CPU to execute in Non-Secure (Normal) state.
 
- 	  Therefore, a Secure firmware image shall be able to
 
- 	  configure security attributions of CPU resources (memory
 
- 	  areas, peripherals, interrupts, etc.) as well as to handle
 
- 	  faults, related to security violations. It may optionally
 
- 	  allow certain functions to be called from the Non-Secure
 
- 	  (Normal) domain.
 
- config TRUSTED_EXECUTION_NONSECURE
 
- 	depends on !TRUSTED_EXECUTION_SECURE
 
- 	bool "Trusted Execution: Non-Secure firmware image"
 
- 	help
 
- 	  Select this option to enable building a Non-Secure
 
- 	  firmware image for a platform that supports Trusted
 
- 	  Execution. A Non-Secure firmware image will execute
 
- 	  in Non-Secure (Normal) state. Therefore, it shall not
 
- 	  access CPU resources (memory areas, peripherals,
 
- 	  interrupts etc.) belonging to the Secure domain.
 
- endif # ARCH_HAS_TRUSTED_EXECUTION
 
- config HW_STACK_PROTECTION
 
- 	bool "Hardware Stack Protection"
 
- 	depends on ARCH_HAS_STACK_PROTECTION
 
- 	help
 
- 	  Select this option to enable hardware-based platform features to
 
- 	  catch stack overflows when the system is running in privileged
 
- 	  mode. If CONFIG_USERSPACE is not enabled, the system is always
 
- 	  running in privileged mode.
 
- 	  Note that this does not necessarily prevent corruption and assertions
 
- 	  about the overall system state when a fault is triggered cannot be
 
- 	  made.
 
- config USERSPACE
 
- 	bool "User mode threads"
 
- 	depends on ARCH_HAS_USERSPACE
 
- 	depends on RUNTIME_ERROR_CHECKS
 
- 	depends on SRAM_REGION_PERMISSIONS
 
- 	select THREAD_STACK_INFO
 
- 	help
 
- 	  When enabled, threads may be created or dropped down to user mode,
 
- 	  which has significantly restricted permissions and must interact
 
- 	  with the kernel via system calls. See Zephyr documentation for more
 
- 	  details about this feature.
 
- 	  If a user thread overflows its stack, this will be caught and the
 
- 	  kernel itself will be shielded from harm. Enabling this option
 
- 	  may or may not catch stack overflows when the system is in
 
- 	  privileged mode or handling a system call; to ensure these are always
 
- 	  caught, enable CONFIG_HW_STACK_PROTECTION.
 
- config PRIVILEGED_STACK_SIZE
 
- 	int "Size of privileged stack"
 
- 	default 1024
 
- 	depends on ARCH_HAS_USERSPACE
 
- 	help
 
- 	  This option sets the privileged stack region size that will be used
 
- 	  in addition to the user mode thread stack.  During normal execution,
 
- 	  this region will be inaccessible from user mode.  During system calls,
 
- 	  this region will be utilized by the system call. This value must be
 
- 	  a multiple of the minimum stack alignment.
 
- config KOBJECT_TEXT_AREA
 
- 	int "Size of kobject text area"
 
- 	default 512 if COVERAGE_GCOV
 
- 	default 512 if NO_OPTIMIZATIONS
 
- 	default 512 if STACK_CANARIES && RISCV
 
- 	default 256
 
- 	depends on ARCH_HAS_USERSPACE
 
- 	help
 
- 	  Size of kernel object text area. Used in linker script.
 
- config KOBJECT_DATA_AREA_RESERVE_EXTRA_PERCENT
 
- 	int "Reserve extra kobject data area (in percentage)"
 
- 	default 100
 
- 	depends on ARCH_HAS_USERSPACE
 
- 	help
 
- 	  Multiplication factor used to calculate the size of placeholder to
 
- 	  reserve space for kobject metadata hash table. The hash table is
 
- 	  generated via gperf is highly dependent on the absolute addresses of
 
- 	  kobjects which might change between prebuilts. To reserve enough
 
- 	  space for the hash table during final linking passes to keep
 
- 	  kobjects in same place, the size of reserved space is calculated
 
- 	  from the first prebuilt plus additional space calculated with
 
- 	  this percentage (of the kobject data area in first prebuilt).
 
- config KOBJECT_RODATA_AREA_EXTRA_BYTES
 
- 	int "Reserve extra bytes for kobject rodata area"
 
- 	default 16
 
- 	depends on ARCH_HAS_USERSPACE
 
- 	help
 
- 	  Reserve a few more bytes for the RODATA region for kobject metadata.
 
- 	  This is to account for the uncertainty of tables generated by gperf.
 
- config GEN_PRIV_STACKS
 
- 	bool
 
- 	help
 
- 	  Selected if the architecture requires that privilege elevation stacks
 
- 	  be allocated in a separate memory area. This is typical of arches
 
- 	  whose MPUs require regions to be power-of-two aligned/sized.
 
- 	  FIXME: This should be removed and replaced with checks against
 
- 	  CONFIG_MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT, but both ARM and ARC
 
- 	  changes will be necessary for this.
 
- config STACK_GROWS_UP
 
- 	bool "Stack grows towards higher memory addresses"
 
- 	help
 
- 	  Select this option if the architecture has upward growing thread
 
- 	  stacks. This is not common.
 
- config NO_UNUSED_STACK_INSPECTION
 
- 	bool
 
- 	help
 
- 	  Selected if the architecture will generate a fault if unused stack
 
- 	  memory is examined, which is the region between the current stack
 
- 	  pointer and the deepest available address in the current stack
 
- 	  region.
 
- config MAX_THREAD_BYTES
 
- 	int "Bytes to use when tracking object thread permissions"
 
- 	default 2
 
- 	depends on USERSPACE
 
- 	help
 
- 	  Every kernel object will have an associated bitfield to store
 
- 	  thread permissions for that object. This controls the size of the
 
- 	  bitfield (in bytes) and imposes a limit on how many threads can
 
- 	  be created in the system.
 
- config DYNAMIC_OBJECTS
 
- 	bool "Allow kernel objects to be allocated at runtime"
 
- 	depends on USERSPACE
 
- 	help
 
- 	  Enabling this option allows for kernel objects to be requested from
 
- 	  the calling thread's resource pool, at a slight cost in performance
 
- 	  due to the supplemental run-time tables required to validate such
 
- 	  objects.
 
- 	  Objects allocated in this way can be freed with a supervisor-only
 
- 	  API call, or when the number of references to that object drops to
 
- 	  zero.
 
- config NOCACHE_MEMORY
 
- 	bool "Support for uncached memory"
 
- 	depends on ARCH_HAS_NOCACHE_MEMORY_SUPPORT
 
- 	help
 
- 	  Add a "nocache" read-write memory section that is configured to
 
- 	  not be cached. This memory section can be used to perform DMA
 
- 	  transfers when cache coherence issues are not optimal or can not
 
- 	  be solved using cache maintenance operations.
 
- menu "Interrupt Configuration"
 
- config DYNAMIC_INTERRUPTS
 
- 	bool "Enable installation of IRQs at runtime"
 
- 	help
 
- 	  Enable installation of interrupts at runtime, which will move some
 
- 	  interrupt-related data structures to RAM instead of ROM, and
 
- 	  on some architectures increase code size.
 
- config GEN_ISR_TABLES
 
- 	bool "Use generated IRQ tables"
 
- 	help
 
- 	  This option controls whether a platform uses the gen_isr_tables
 
- 	  script to generate its interrupt tables. This mechanism will create
 
- 	  an appropriate hardware vector table and/or software IRQ table.
 
- config GEN_IRQ_VECTOR_TABLE
 
- 	bool "Generate an interrupt vector table"
 
- 	default y
 
- 	depends on GEN_ISR_TABLES
 
- 	help
 
- 	  This option controls whether a platform using gen_isr_tables
 
- 	  needs an interrupt vector table created. Only disable this if the
 
- 	  platform does not use a vector table at all, or requires the vector
 
- 	  table to be in a format that is not an array of function pointers
 
- 	  indexed by IRQ line. In the latter case, the vector table must be
 
- 	  supplied by the application or architecture code.
 
- config GEN_SW_ISR_TABLE
 
- 	bool "Generate a software ISR table"
 
- 	default y
 
- 	depends on GEN_ISR_TABLES
 
- 	help
 
- 	  This option controls whether a platform using gen_isr_tables
 
- 	  needs a software ISR table table created. This is an array of struct
 
- 	  _isr_table_entry containing the interrupt service routine and supplied
 
- 	  parameter.
 
- config ARCH_SW_ISR_TABLE_ALIGN
 
- 	int "Alignment size of a software ISR table"
 
- 	default 0
 
- 	depends on GEN_SW_ISR_TABLE
 
- 	help
 
- 	  This option controls alignment size of generated
 
- 	  _sw_isr_table.  Some architecture needs a software ISR table
 
- 	  to be aligned to architecture specific size.  The default
 
- 	  size is 0 for no alignment.
 
- config GEN_IRQ_START_VECTOR
 
- 	int
 
- 	default 0
 
- 	depends on GEN_ISR_TABLES
 
- 	help
 
- 	  On some architectures, part of the vector table may be reserved for
 
- 	  system exceptions and is declared separately from the tables
 
- 	  created by gen_isr_tables.py. When creating these tables, this value
 
- 	  will be subtracted from CONFIG_NUM_IRQS to properly size them.
 
- 	  This is a hidden option which needs to be set per architecture and
 
- 	  left alone.
 
- config IRQ_OFFLOAD
 
- 	bool "Enable IRQ offload"
 
- 	depends on TEST
 
- 	help
 
- 	  Enable irq_offload() API which allows functions to be synchronously
 
- 	  run in interrupt context. Only useful for test cases that need
 
- 	  to validate the correctness of kernel objects in IRQ context.
 
- config EXTRA_EXCEPTION_INFO
 
- 	bool "Collect extra exception info"
 
- 	depends on ARCH_HAS_EXTRA_EXCEPTION_INFO
 
- 	help
 
- 	  This option enables the collection of extra information, such as
 
- 	  register state, when a fault occurs. This information can be useful
 
- 	  to collect for post-mortem analysis and debug of issues.
 
- endmenu # Interrupt configuration
 
- config INIT_ARCH_HW_AT_BOOT
 
- 	bool "Initialize internal architecture state at boot"
 
- 	depends on ARCH_SUPPORTS_ARCH_HW_INIT
 
- 	help
 
- 	  This option instructs Zephyr to force the initialization
 
- 	  of the internal architectural state (for example ARCH-level
 
- 	  HW registers and system control blocks) during boot to
 
- 	  the reset values as specified by the corresponding
 
- 	  architecture manual. The option is useful when the Zephyr
 
- 	  firmware image is chain-loaded, for example, by a debugger
 
- 	  or a bootloader, and we need to guarantee that the internal
 
- 	  states of the architecture core blocks are restored to the
 
- 	  reset values (as specified by the architecture).
 
- 	  Note: the functionality is architecture-specific. For the
 
- 	  implementation details refer to each architecture where
 
- 	  this feature is supported.
 
- endmenu
 
- #
 
- # Architecture Capabilities
 
- #
 
- config ARCH_HAS_SINGLE_THREAD_SUPPORT
 
- 	bool
 
- config ARCH_HAS_TIMING_FUNCTIONS
 
- 	bool
 
- config ARCH_HAS_TRUSTED_EXECUTION
 
- 	bool
 
- config ARCH_HAS_STACK_PROTECTION
 
- 	bool
 
- config ARCH_HAS_USERSPACE
 
- 	bool
 
- config ARCH_HAS_EXECUTABLE_PAGE_BIT
 
- 	bool
 
- config ARCH_HAS_NOCACHE_MEMORY_SUPPORT
 
- 	bool
 
- config ARCH_HAS_RAMFUNC_SUPPORT
 
- 	bool
 
- config ARCH_HAS_NESTED_EXCEPTION_DETECTION
 
- 	bool
 
- config ARCH_SUPPORTS_COREDUMP
 
- 	bool
 
- config ARCH_SUPPORTS_ARCH_HW_INIT
 
- 	bool
 
- config ARCH_HAS_EXTRA_EXCEPTION_INFO
 
- 	bool
 
- config ARCH_HAS_GDBSTUB
 
- 	bool
 
- config ARCH_HAS_COHERENCE
 
- 	bool
 
- 	help
 
- 	  When selected, the architecture supports the
 
- 	  arch_mem_coherent() API and can link into incoherent/cached
 
- 	  memory using the ".cached" linker section.
 
- config ARCH_HAS_THREAD_LOCAL_STORAGE
 
- 	bool
 
- #
 
- # Other architecture related options
 
- #
 
- config ARCH_HAS_THREAD_ABORT
 
- 	bool
 
- #
 
- # Hidden CPU family configs
 
- #
 
- config CPU_HAS_TEE
 
- 	bool
 
- 	help
 
- 	  This option is enabled when the CPU has support for Trusted
 
- 	  Execution Environment (e.g. when it has a security attribution
 
- 	  unit).
 
- config CPU_HAS_DCLS
 
- 	bool
 
- 	help
 
- 	  This option is enabled when the processor hardware is configured in
 
- 	  Dual-redundant Core Lock-step (DCLS) topology.
 
- config CPU_HAS_FPU
 
- 	bool
 
- 	help
 
- 	  This option is enabled when the CPU has hardware floating point
 
- 	  unit.
 
- config CPU_HAS_FPU_DOUBLE_PRECISION
 
- 	bool
 
- 	select CPU_HAS_FPU
 
- 	help
 
- 	  When enabled, this indicates that the CPU has a double floating point
 
- 	  precision unit.
 
- config CPU_HAS_MPU
 
- 	bool
 
- 	help
 
- 	  This option is enabled when the CPU has a Memory Protection Unit (MPU).
 
- config CPU_HAS_MMU
 
- 	bool
 
- 	help
 
- 	  This hidden option is selected when the CPU has a Memory Management Unit
 
- 	  (MMU).
 
- config ARCH_HAS_DEMAND_PAGING
 
- 	bool
 
- 	help
 
- 	  This hidden configuration should be selected by the architecture if
 
- 	  demand paging is supported.
 
- config ARCH_HAS_RESERVED_PAGE_FRAMES
 
- 	bool
 
- 	help
 
- 	  This hidden configuration should be selected by the architecture if
 
- 	  certain RAM page frames need to be marked as reserved and never used for
 
- 	  memory mappings. The architecture will need to implement
 
- 	  arch_reserved_pages_update().
 
- config ARCH_MAPS_ALL_RAM
 
- 	bool
 
- 	help
 
- 	  This hidden option is selected by the architecture to inform the kernel
 
- 	  that all RAM is mapped at boot, and not just the bounds of the Zephyr image.
 
- 	  If RAM starts at 0x0, the first page must remain un-mapped to catch NULL
 
- 	  pointer dereferences. With this enabled, the kernel will not assume that
 
- 	  virtual memory addresses past the kernel image are available for mappings,
 
- 	  but instead takes into account an entire RAM mapping instead.
 
- 	  This is typically set by architectures which need direct access to all memory.
 
- 	  It is the architecture's responsibility to mark reserved memory regions
 
- 	  as such in arch_reserved_pages_update().
 
- 	  Although the kernel will not disturb this RAM mapping by re-mapping the associated
 
- 	  virtual addresses elsewhere, this is limited to only management of the
 
- 	  virtual address space. The kernel's page frame ontology will not consider
 
- 	  this mapping at all; non-kernel pages will be considered free (unless marked
 
- 	  as reserved) and Z_PAGE_FRAME_MAPPED will not be set.
 
- menuconfig MMU
 
- 	bool "Enable MMU features"
 
- 	depends on CPU_HAS_MMU
 
- 	help
 
- 	  This option is enabled when the CPU's memory management unit is active
 
- 	  and the arch_mem_map() API is available.
 
- if MMU
 
- config MMU_PAGE_SIZE
 
- 	hex "Size of smallest granularity MMU page"
 
- 	default 0x1000
 
- 	help
 
- 	  Size of memory pages. Varies per MMU but 4K is common. For MMUs that
 
- 	  support multiple page sizes, put the smallest one here.
 
- config KERNEL_VM_BASE
 
- 	hex "Virtual address space base address"
 
- 	default $(dt_chosen_reg_addr_hex,$(DT_CHOSEN_Z_SRAM))
 
- 	help
 
- 	  Define the base of the kernel's address space.
 
- 	  By default, this is the same as the DT_CHOSEN_Z_SRAM physical base SRAM
 
- 	  address from DTS, in which case RAM will be identity-mapped. Some
 
- 	  architectures may require RAM to be mapped in this way; they may have
 
- 	  just one RAM region and doing this makes linking much simpler, as
 
- 	  at least when the kernel boots all virtual RAM addresses are the same
 
- 	  as their physical address (demand paging at runtime may later modify
 
- 	  this for non-pinned page frames).
 
- 	  Otherwise, if RAM isn't identity-mapped:
 
- 	  1. It is the architecture's responsibility to transition the
 
- 	  instruction pointer to virtual addresses at early boot before
 
- 	  entering the kernel at z_cstart().
 
- 	  2. The underlying architecture may impose constraints on the bounds of
 
- 	  the kernel's address space, such as not overlapping physical RAM
 
- 	  regions if RAM is not identity-mapped, or the virtual and physical
 
- 	  base addresses being aligned to some common value (which allows
 
- 	  double-linking of paging structures to make the instruction pointer
 
- 	  transition simpler).
 
- 	  Zephyr does not implement a split address space and if multiple
 
- 	  page tables are in use, they all have the same virtual-to-physical
 
- 	  mappings (with potentially different permissions).
 
- config KERNEL_VM_OFFSET
 
- 	hex "Kernel offset within address space"
 
- 	default 0
 
- 	help
 
- 	  Offset that the kernel image begins within its address space,
 
- 	  if this is not the same offset from the beginning of RAM.
 
- 	  Some care may need to be taken in selecting this value. In certain
 
- 	  build-time cases, or when a physical address cannot be looked up
 
- 	  in page tables, the equation:
 
- 	      virt = phys + ((KERNEL_VM_BASE + KERNEL_VM_OFFSET) -
 
- 	                     (SRAM_BASE_ADDRESS + SRAM_OFFSET))
 
- 	  Will be used to convert between physical and virtual addresses for
 
- 	  memory that is mapped at boot.
 
- 	  This uncommon and is only necessary if the beginning of VM and
 
- 	  physical memory have dissimilar alignment.
 
- config KERNEL_VM_SIZE
 
- 	hex "Size of kernel address space in bytes"
 
- 	default 0x800000
 
- 	help
 
- 	  Size of the kernel's address space. Constraining this helps control
 
- 	  how much total memory can be used for page tables.
 
- 	  The difference between KERNEL_VM_BASE and KERNEL_VM_SIZE indicates the
 
- 	  size of the virtual region for runtime memory mappings. This is needed
 
- 	  for mapping driver MMIO regions, as well as special RAM mapping use-cases
 
- 	  such as VSDO pages, memory mapped thread stacks, and anonymous memory
 
- 	  mappings. The kernel itself will be mapped in here as well at boot.
 
- 	  Systems with very large amounts of memory (such as 512M or more)
 
- 	  will want to use a 64-bit build of Zephyr, there are no plans to
 
- 	  implement a notion of "high" memory in Zephyr to work around physical
 
- 	  RAM size larger than the defined bounds of the virtual address space.
 
- menuconfig DEMAND_PAGING
 
- 	bool "Enable demand paging [EXPERIMENTAL]"
 
- 	depends on ARCH_HAS_DEMAND_PAGING
 
- 	help
 
- 	  Enable demand paging. Requires architecture support in how the kernel
 
- 	  is linked and the implementation of an eviction algorithm and a
 
- 	  backing store for evicted pages.
 
- if DEMAND_PAGING
 
- config DEMAND_PAGING_ALLOW_IRQ
 
- 	bool "Allow interrupts during page-ins/outs"
 
- 	help
 
- 	  Allow interrupts to be serviced while pages are being evicted or
 
- 	  retrieved from the backing store. This is much better for system
 
- 	  latency, but any code running in interrupt context that page faults
 
- 	  will cause a kernel panic. Such code must work with exclusively pinned
 
- 	  code and data pages.
 
- 	  The scheduler is still disabled during this operation.
 
- 	  If this option is disabled, the page fault servicing logic
 
- 	  runs with interrupts disabled for the entire operation. However,
 
- 	  ISRs may also page fault.
 
- config DEMAND_PAGING_PAGE_FRAMES_RESERVE
 
- 	int "Number of page frames reserved for paging"
 
- 	default 32 if !LINKER_GENERIC_SECTIONS_PRESENT_AT_BOOT
 
- 	default 0
 
- 	help
 
- 	  This sets the number of page frames that will be reserved for
 
- 	  paging that do not count towards free memory. This is to
 
- 	  ensure that there are some page frames available for paging
 
- 	  code and data. Otherwise, it would be possible to exhaust
 
- 	  all page frames via anonymous memory mappings.
 
- config DEMAND_PAGING_STATS
 
- 	bool "Gather Demand Paging Statistics"
 
- 	help
 
- 	  This enables gathering various statistics related to demand paging,
 
- 	  e.g. number of pagefaults. This is useful for tuning eviction
 
- 	  algorithms and optimizing backing store.
 
- 	  Should say N in production system as this is not without cost.
 
- config DEMAND_PAGING_STATS_USING_TIMING_FUNCTIONS
 
- 	bool "Use Timing Functions to Gather Demand Paging Statistics"
 
- 	select TIMING_FUNCTIONS_NEED_AT_BOOT
 
- 	help
 
- 	  Use timing functions to gather various demand paging statistics.
 
- config DEMAND_PAGING_THREAD_STATS
 
- 	bool "Gather per Thread Demand Paging Statistics"
 
- 	depends on DEMAND_PAGING_STATS
 
- 	help
 
- 	  This enables gathering per thread statistics related to demand
 
- 	  paging.
 
- 	  Should say N in production system as this is not without cost.
 
- config DEMAND_PAGING_TIMING_HISTOGRAM
 
- 	bool "Gather Demand Paging Execution Timing Histogram"
 
- 	depends on DEMAND_PAGING_STATS
 
- 	help
 
- 	  This gathers the histogram of execution time on page eviction
 
- 	  selection, and backing store page in and page out.
 
- 	  Should say N in production system as this is not without cost.
 
- config DEMAND_PAGING_TIMING_HISTOGRAM_NUM_BINS
 
- 	int "Number of bins (buckets) in Demand Paging Timing Histogrm"
 
- 	depends on DEMAND_PAGING_TIMING_HISTOGRAM
 
- 	default 10
 
- 	help
 
- 	  Defines the number of bins (buckets) in the histogram used for
 
- 	  gathering execution timing information for demand paging.
 
- 	  This requires k_mem_paging_eviction_histogram_bounds[] and
 
- 	  k_mem_paging_backing_store_histogram_bounds[] to define
 
- 	  the upper bounds for each bin. See kernel/statistics.c for
 
- 	  information.
 
- endif	# DEMAND_PAGING
 
- endif   # MMU
 
- menuconfig MPU
 
- 	bool "Enable MPU features"
 
- 	depends on CPU_HAS_MPU
 
- 	help
 
- 	  This option, when enabled, indicates to the core kernel that an MPU
 
- 	  is enabled.
 
- if MPU
 
- config MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT
 
- 	bool
 
- 	help
 
- 	  This option is enabled when the MPU requires a power of two alignment
 
- 	  and size for MPU regions.
 
- config MPU_REQUIRES_NON_OVERLAPPING_REGIONS
 
- 	bool
 
- 	help
 
- 	  This option is enabled when the MPU requires the active (i.e. enabled)
 
- 	  MPU regions to be non-overlapping with each other.
 
- config MPU_GAP_FILLING
 
- 	bool "Force MPU to be filling in background memory regions"
 
- 	depends on MPU_REQUIRES_NON_OVERLAPPING_REGIONS
 
- 	default y if !USERSPACE
 
- 	help
 
- 	  This Kconfig option instructs the MPU driver to enforce
 
- 	  a full kernel SRAM partitioning, when it programs the
 
- 	  dynamic MPU regions (user thread stack, PRIV stack guard
 
- 	  and application memory domains) during context-switch. We
 
- 	  allow this to be a configurable option, in order to be able
 
- 	  to switch the option off and have an increased number of MPU
 
- 	  regions available for application memory domain programming.
 
- 	  Notes:
 
- 	  An increased number of MPU regions should only be required,
 
- 	  when building with USERSPACE support. As a result, when we
 
- 	  build without USERSPACE support, gap filling should always
 
- 	  be required.
 
- 	  When the option is switched off, access to memory areas not
 
- 	  covered by explicit MPU regions is restricted to privileged
 
- 	  code on an ARCH-specific basis. Refer to ARCH-specific
 
- 	  documentation for more information on how this option is
 
- 	  used.
 
- endif # MPU
 
- config SRAM_REGION_PERMISSIONS
 
- 	bool "Assign appropriate permissions to kernel areas in SRAM"
 
- 	depends on MMU || MPU
 
- 	default y
 
- 	help
 
- 	  This option indicates that memory protection hardware
 
- 	  is present, enabled, and regions have been configured at boot for memory
 
- 	  ranges within the kernel image.
 
- 	  If this option is turned on, certain areas of the kernel image will
 
- 	  have the following access policies applied for all threads, including
 
- 	  supervisor threads:
 
- 	  1) All program text will be have read-only, execute memory permission
 
- 	  2) All read-only data will have read-only permission, and execution
 
- 	     disabled if the hardware supports it.
 
- 	  3) All other RAM addresses will have read-write permission, and
 
- 	     execution disabled if the hardware supports it.
 
- 	  Options such as USERSPACE or HW_STACK_PROTECTION may additionally
 
- 	  impose additional policies on the memory map, which may be global
 
- 	  or local to the current running thread.
 
- 	  This option may consume additional memory to satisfy memory protection
 
- 	  hardware alignment constraints.
 
- 	  If this option is disabled, the entire kernel will have default memory
 
- 	  access permissions set, typically read/write/execute. It may be desirable
 
- 	  to turn this off on MMU systems which are using the MMU for demand
 
- 	  paging, do not need memory protection, and would rather not use up
 
- 	  RAM for the alignment between regions.
 
- menu "Floating Point Options"
 
- config FPU
 
- 	bool "Enable floating point unit (FPU)"
 
- 	depends on CPU_HAS_FPU
 
- 	help
 
- 	  This option enables the hardware Floating Point Unit (FPU), in order to
 
- 	  support using the floating point registers and instructions.
 
- 	  When this option is enabled, by default, threads may use the floating
 
- 	  point registers only in an exclusive manner, and this usually means that
 
- 	  only one thread may perform floating point operations.
 
- 	  If it is necessary for multiple threads to perform concurrent floating
 
- 	  point operations, the "FPU register sharing" option must be enabled to
 
- 	  preserve the floating point registers across context switches.
 
- 	  Note that this option cannot be selected for the platforms that do not
 
- 	  include a hardware floating point unit; the floating point support for
 
- 	  those platforms is dependent on the availability of the toolchain-
 
- 	  provided software floating point library.
 
- config FPU_SHARING
 
- 	bool "FPU register sharing"
 
- 	depends on FPU && MULTITHREADING
 
- 	help
 
- 	  This option enables preservation of the hardware floating point registers
 
- 	  across context switches to allow multiple threads to perform concurrent
 
- 	  floating point operations.
 
- 	  Note that some compiler configurations may activate a floating point
 
- 	  context by generating FP instructions for any thread, and that
 
- 	  context must be preserved when switching such threads in and out.
 
- 	  The developers can still disable the FP sharing mode in their
 
- 	  application projects, and switch to Unshared FP registers mode,
 
- 	  if it is guaranteed that the image code does not generate FP
 
- 	  instructions outside the single thread context that is allowed
 
- 	  to do so.
 
- endmenu
 
- menu "Cache Options"
 
- config CACHE_MANAGEMENT
 
- 	bool "Enable cache management features"
 
- 	help
 
- 	  This links in the cache management functions (for d-cache and i-cache
 
- 	  where possible).
 
- config DCACHE_LINE_SIZE_DETECT
 
- 	bool "Detect d-cache line size at runtime"
 
- 	depends on CACHE_MANAGEMENT
 
- 	help
 
- 	  This option enables querying some architecture-specific hardware for
 
- 	  finding the d-cache line size at the expense of taking more memory and
 
- 	  code and a slightly increased boot time.
 
- 	  If the CPU's d-cache line size is known in advance, disable this option and
 
- 	  manually enter the value for DCACHE_LINE_SIZE or set it in the DT
 
- 	  using the 'd-cache-line-size' property.
 
- config DCACHE_LINE_SIZE
 
- 	int "d-cache line size" if !DCACHE_LINE_SIZE_DETECT
 
- 	depends on CACHE_MANAGEMENT
 
- 	default 0
 
- 	help
 
- 	  Size in bytes of a CPU d-cache line. If this is set to 0 the value is
 
- 	  obtained from the 'd-cache-line-size' DT property instead if present.
 
- 	  Detect automatically at runtime by selecting DCACHE_LINE_SIZE_DETECT.
 
- config ICACHE_LINE_SIZE_DETECT
 
- 	bool "Detect i-cache line size at runtime"
 
- 	depends on CACHE_MANAGEMENT
 
- 	help
 
- 	  This option enables querying some architecture-specific hardware for
 
- 	  finding the i-cache line size at the expense of taking more memory and
 
- 	  code and a slightly increased boot time.
 
- 	  If the CPU's i-cache line size is known in advance, disable this option and
 
- 	  manually enter the value for ICACHE_LINE_SIZE or set it in the DT
 
- 	  using the 'i-cache-line-size' property.
 
- config ICACHE_LINE_SIZE
 
- 	int "i-cache line size" if !ICACHE_LINE_SIZE_DETECT
 
- 	depends on CACHE_MANAGEMENT
 
- 	default 0
 
- 	help
 
- 	  Size in bytes of a CPU i-cache line. If this is set to 0 the value is
 
- 	  obtained from the 'i-cache-line-size' DT property instead if present.
 
- 	  Detect automatically at runtime by selecting ICACHE_LINE_SIZE_DETECT.
 
- choice CACHE_TYPE
 
- 	prompt "Cache type"
 
- 	depends on CACHE_MANAGEMENT
 
- 	default HAS_ARCH_CACHE
 
- config HAS_ARCH_CACHE
 
- 	bool "Integrated cache controller"
 
- 	help
 
- 	  "Integrade on-core cache controller"
 
- config HAS_EXTERNAL_CACHE
 
- 	bool "External cache controller"
 
- 	help
 
- 	  "External cache controller or cache management system"
 
- endchoice
 
- endmenu
 
- config ARCH
 
- 	string
 
- 	help
 
- 	  System architecture string.
 
- config SOC
 
- 	string
 
- 	help
 
- 	  SoC name which can be found under soc/<arch>/<soc name>.
 
- 	  This option holds the directory name used by the build system to locate
 
- 	  the correct linker and header files for the SoC.
 
- config SOC_SERIES
 
- 	string
 
- 	help
 
- 	  SoC series name which can be found under soc/<arch>/<family>/<series>.
 
- 	  This option holds the directory name used by the build system to locate
 
- 	  the correct linker and header files.
 
- config SOC_FAMILY
 
- 	string
 
- 	help
 
- 	  SoC family name which can be found under soc/<arch>/<family>.
 
- 	  This option holds the directory name used by the build system to locate
 
- 	  the correct linker and header files.
 
- config BOARD
 
- 	string
 
- 	help
 
- 	  This option holds the name of the board and is used to locate the files
 
- 	  related to the board in the source tree (under boards/).
 
- 	  The Board is the first location where we search for a linker.ld file,
 
- 	  if not found we look for the linker file in
 
- 	  soc/<arch>/<family>/<series>
 
- config TOOLCHAIN_HAS_BUILTIN_FFS
 
- 	bool
 
- 	default y if !(64BIT && RISCV)
 
- 	help
 
- 	  Hidden option to signal that toolchain has __builtin_ffs*().
 
 
  |