# 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)

source "$(KCONFIG_BINARY_DIR)/arch/Kconfig"

# ToDo: Generate a Kconfig.arch for loading of additional arch in HWMv2.
osource "$(KCONFIG_BINARY_DIR)/Kconfig.arch"

# 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
	imply XIP
	select ARCH_HAS_THREAD_LOCAL_STORAGE
	select ARCH_SUPPORTS_ROM_START
	select ARCH_HAS_DIRECTED_IPIS
	help
	  ARC architecture

config ARM
	bool
	select ARCH_IS_SET
	select ARCH_SUPPORTS_COREDUMP if CPU_CORTEX_M
	select ARCH_SUPPORTS_COREDUMP_THREADS if CPU_CORTEX_M
	select ARCH_SUPPORTS_COREDUMP_STACK_PTR if CPU_CORTEX_M
	# 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_AARCH32_CORTEX_R || CPU_CORTEX_M || CPU_AARCH32_CORTEX_A
	select BARRIER_OPERATIONS_ARCH
	help
	  ARM architecture

config ARM64
	bool
	select ARCH_IS_SET
	select 64BIT
	select ARCH_SUPPORTS_COREDUMP
	select HAS_ARM_SMCCC
	select ARCH_HAS_THREAD_LOCAL_STORAGE
	select USE_SWITCH
	select USE_SWITCH_SUPPORTED
	select BARRIER_OPERATIONS_ARCH
	select ARCH_HAS_DIRECTED_IPIS
	select ARCH_HAS_DEMAND_PAGING
	select ARCH_HAS_DEMAND_MAPPING
	select ARCH_SUPPORTS_EVICTION_TRACKING
	select EVICTION_TRACKING if DEMAND_PAGING
	help
	  ARM64 (AArch64) architecture

config MIPS
	bool
	select ARCH_IS_SET
	select ATOMIC_OPERATIONS_C
	help
	  MIPS architecture

config SPARC
	bool
	select ARCH_IS_SET
	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 ARCH_SUPPORTS_COREDUMP
	select ARCH_SUPPORTS_COREDUMP_PRIV_STACKS
	select ARCH_SUPPORTS_ROM_START if !X86_64
	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 if !X86_64
	select ARCH_HAS_DEMAND_MAPPING if ARCH_HAS_DEMAND_PAGING
	select NEED_LIBC_MEM_PARTITION if USERSPACE && TIMING_FUNCTIONS \
					  && !BOARD_HAS_TIMING_FUNCTIONS \
					  && !SOC_HAS_TIMING_FUNCTIONS
	select ARCH_HAS_STACK_CANARIES_TLS
	select ARCH_SUPPORTS_MEM_MAPPED_STACKS if X86_MMU && !DEMAND_PAGING
	select ARCH_HAS_THREAD_PRIV_STACK_SPACE_GET if USERSPACE
	help
	  x86 architecture

config RISCV
	bool
	select ARCH_IS_SET
	select ATOMIC_OPERATIONS_C if !RISCV_ISA_EXT_A
	select ATOMIC_OPERATIONS_BUILTIN if RISCV_ISA_EXT_A
	select ARCH_SUPPORTS_COREDUMP
	select ARCH_SUPPORTS_COREDUMP_PRIV_STACKS
	select ARCH_SUPPORTS_ROM_START if !SOC_FAMILY_ESPRESSIF_ESP32
	select ARCH_SUPPORTS_EMPTY_IRQ_SPURIOUS
	select ARCH_HAS_CODE_DATA_RELOCATION
	select ARCH_HAS_THREAD_LOCAL_STORAGE
	select USE_SWITCH_SUPPORTED
	select USE_SWITCH
	select SCHED_IPI_SUPPORTED if SMP
	select ARCH_HAS_DIRECTED_IPIS
	select BARRIER_OPERATIONS_BUILTIN
	select ARCH_HAS_THREAD_PRIV_STACK_SPACE_GET if USERSPACE
	help
	  RISCV architecture

config XTENSA
	bool
	select ARCH_IS_SET
	select USE_SWITCH
	select USE_SWITCH_SUPPORTED
	select ARCH_HAS_CODE_DATA_RELOCATION
	select ARCH_HAS_TIMING_FUNCTIONS
	select ARCH_MEM_DOMAIN_DATA if USERSPACE
	select ARCH_HAS_DIRECTED_IPIS
	select THREAD_STACK_INFO
	select ARCH_HAS_THREAD_PRIV_STACK_SPACE_GET if USERSPACE
	select ARCH_SUPPORTS_COREDUMP_STACK_PTR if !SMP
	help
	  Xtensa architecture

config ARCH_POSIX
	bool
	select ARCH_IS_SET
	select ATOMIC_OPERATIONS_BUILTIN
	select ARCH_HAS_CUSTOM_SWAP_TO_MAIN
	select ARCH_HAS_CUSTOM_BUSY_WAIT
	select ARCH_HAS_THREAD_ABORT
	select ARCH_HAS_THREAD_NAME_HOOK
	select NATIVE_BUILD
	select HAS_COVERAGE_SUPPORT
	select BARRIER_OPERATIONS_BUILTIN
	# POSIX arch based targets get their memory cleared on entry by the host OS
	select SKIP_BSS_CLEAR
	# Override the C standard used for compilation to C 2011
	# This is due to some tests using _Static_assert which is a 2011 feature, but
	# otherwise relying on compilers supporting it also when set to C99.
	# This was in general ok, but with some host compilers and C library versions
	# it led to problems. So we override it to 2011 for the native targets.
	select REQUIRES_STD_C11
	help
	  POSIX (native) architecture

config RX
	bool
	select ARCH_IS_SET
	select ATOMIC_OPERATIONS_C
	select USE_SWITCH
	select USE_SWITCH_SUPPORTED
	help
	  Renesas RX 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"

source "arch/common/Kconfig"

module = ARCH
module-str = arch
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,
	  the toolchain flags (TOOLCHAIN_C_FLAGS, TOOLCHAIN_LD_FLAGS), and command
	  line option for gen_isr_tables.py.

config LITTLE_ENDIAN
	# Hidden Kconfig option representing the default little-endian architecture
	# This is just the opposite of BIG_ENDIAN and is used for non-negative
	# conditional compilation
	bool
	depends on !BIG_ENDIAN
	default y

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
	  /chosen/zephyr,sram in devicetree. The user should generally avoid
	  changing it via menuconfig or in configuration files.

config XIP
	bool "Execute in place"
	help
	  This option allows zephyr to operate with its text and read-only
	  sections residing in ROM (or similar read-only memory). Not all boards
	  support this option so it must be used with care; you must also
	  supply a linker command file when building your image. Enabling this
	  option increases both the code and data footprint of the image.


if ARC || ARM || ARM64 || X86 || RISCV || RX || ARCH_POSIX

# 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
	default 0 if !XIP
	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
	default 0 if !XIP
	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 || X86 || RISCV || RX || ARCH_POSIX

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
	select LINKER_USE_NO_RELAX
	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 NOINIT_SNIPPET_FIRST
	bool "Place the no-init linker script snippet first"
	help
	  By default the include/zephyr/linker/common-noinit.ld file inserts the
	  snippets-noinit.ld file at the end of the section.  There are times when
	  the directives in the snippets-noinit.ld file apply to the other directives
	  in this file.  And in that case the include statement for the snippets-noinit.ld
	  file needs to come at the start of the section.  This configuration option
	  allows that to happen.

config PRIVILEGED_STACK_SIZE
	int "Size of privileged stack"
	default 2048 if EMUL
	default 1024
	depends on 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 1024 if UBSAN
	default 512 if COVERAGE_GCOV
	default 512 if NO_OPTIMIZATIONS
	default 512 if STACK_CANARIES && RISCV
	default 256
	depends on 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 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 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.

config FRAME_POINTER
	bool "Compile the kernel with frame pointers"
	select OVERRIDE_FRAME_POINTER_DEFAULT
	help
	  Select Y here to gain precise stack traces at the expense of slightly
	  increased size and decreased speed.

config ARCH_STACKWALK
	bool "Compile the stack walking function"
	default y
	depends on ARCH_HAS_STACKWALK
	help
	  Select Y here to compile the `arch_stack_walk()` function

config ARCH_STACKWALK_MAX_FRAMES
	int "Max depth for stack walk function"
	default 8
	depends on ARCH_STACKWALK
	help
	  Depending on implementation, this can place a hard limit on the depths of the stack
	  for the stack walk function to examine.

menu "Interrupt Configuration"

config TOOLCHAIN_SUPPORTS_ISR_TABLES_LOCAL_DECLARATION
	bool
	help
	  Hidden option to signal that toolchain supports local declaration of
	  interrupt tables.

config ISR_TABLES_LOCAL_DECLARATION_SUPPORTED
	bool
	default y
	# Userspace is currently not supported
	depends on !USERSPACE
	# List of currently supported architectures
	depends on ARM || ARM64 || RISCV
	# List of currently supported toolchains
	depends on "$(ZEPHYR_TOOLCHAIN_VARIANT)" = "zephyr" || "$(ZEPHYR_TOOLCHAIN_VARIANT)" = "gnuarmemb" || "$(ZEPHYR_TOOLCHAIN_VARIANT)" = "llvm" || TOOLCHAIN_SUPPORTS_ISR_TABLES_LOCAL_DECLARATION

config ISR_TABLES_LOCAL_DECLARATION
	bool "ISR tables created locally and placed by linker"
	depends on ISR_TABLES_LOCAL_DECLARATION_SUPPORTED
	help
	  Enable new scheme of interrupt tables generation.
	  This is totally different generator that would create tables entries locally
	  where the IRQ_CONNECT macro is called and then use the linker script to position it
	  in the right place in memory.
	  The most important advantage of such approach is that the generated interrupt tables
	  are LTO compatible.
	  The drawback is that the support on the architecture port is required.

config DYNAMIC_INTERRUPTS
	bool "Installation of IRQs at runtime"
	select SRAM_SW_ISR_TABLE
	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 SHARED_INTERRUPTS
	bool "Set this to enable support for shared interrupts"
	depends on GEN_SW_ISR_TABLE
	select EXPERIMENTAL
	help
	  Set this to enable support for shared interrupts. Use this with
	  caution as enabling this will increase the image size by a
	  non-negligible amount.

config SHARED_IRQ_MAX_NUM_CLIENTS
	int "Maximum number of clients allowed per shared interrupt"
	default 2
	depends on SHARED_INTERRUPTS
	help
	  This option controls the maximum number of clients allowed
	  per shared interrupt. Set this according to your needs.

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 ARCH_IRQ_VECTOR_TABLE_ALIGN
	int "Alignment size of the interrupt vector table"
	default 4
	depends on GEN_IRQ_VECTOR_TABLE
	help
	  This option controls alignment size of generated
	  _irq_vector_table.  Some architecture needs an IRQ vector table
	  to be aligned to architecture specific size.  The default
	  size is 0 for no alignment.

config ARCH_DEVICE_STATE_ALIGN
	int "Alignment size of device state"
	default 4
	help
	  This option controls alignment size of device state.

choice IRQ_VECTOR_TABLE_TYPE
	prompt "IRQ vector table type"
	depends on GEN_IRQ_VECTOR_TABLE
	default IRQ_VECTOR_TABLE_JUMP_BY_CODE if (RISCV && !RISCV_HAS_CLIC)
	default IRQ_VECTOR_TABLE_JUMP_BY_ADDRESS

config IRQ_VECTOR_TABLE_JUMP_BY_ADDRESS
	bool "Jump by address"
	help
	  The IRQ vector table contains the address of the interrupt handler.

config IRQ_VECTOR_TABLE_JUMP_BY_CODE
	bool "Jump by code"
	help
	  The IRQ vector table contains the opcode of a jump instruction to the
	  interrupt handler address.

endchoice

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 64 if RISCV_HAS_CLIC
	default 4
	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 4.

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 "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 SRAM_VECTOR_TABLE
	bool "Place the vector table in SRAM instead of flash"
	depends on ARCH_HAS_VECTOR_TABLE_RELOCATION
	depends on XIP
	depends on !ROMSTART_RELOCATION_ROM
	help
	  When XiP is enabled, this option will result in the vector table being
	  relocated from Flash to SRAM.

config SRAM_SW_ISR_TABLE
	bool "Place the software ISR table in SRAM instead of flash"
	help
	  The option specifies that the software interrupts vector table will be
	  placed inside SRAM instead of the flash.

config IRQ_OFFLOAD_NESTED
	bool "irq_offload() supports nested IRQs"
	depends on IRQ_OFFLOAD
	default y if ARM64 || X86 || RISCV || XTENSA
	help
	  When set by the platform layers, indicates that
	  irq_offload() may legally be called in interrupt context to
	  cause a synchronous nested interrupt on the current CPU.
	  Not all hardware is capable.

config EXCEPTION_DEBUG
	bool "Unhandled exception debugging"
	default y
	depends on PRINTK || LOG
	help
	  Install handlers for various CPU exception/trap vectors to
	  make debugging them easier, at a small expense in code size.
	  This prints out the specific exception vector and any associated
	  error codes.

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.

config SIMPLIFIED_EXCEPTION_CODES
	bool "Convert arch specific exception codes to K_ERR_CPU_EXCEPTION"
	default y if ZTEST
	help
	  The same piece of faulty code (NULL dereference, etc) can result in
	  a multitude of potential exception codes at the CPU level, depending
	  upon whether addresses exist, an MPU is configured, the particular
	  implementation of the CPU or any number of other reasons. Enabling
	  this option collapses all the architecture specific exception codes
	  down to the generic K_ERR_CPU_EXCEPTION, which makes testing code
	  much more portable.

config EMPTY_IRQ_SPURIOUS
	bool "Create empty spurious interrupt handler"
	depends on ARCH_SUPPORTS_EMPTY_IRQ_SPURIOUS
	help
	  This option changes body of spurious interrupt handler. When enabled,
	  handler contains only an infinite while loop, when disabled, handler
	  contains the whole Zephyr fault handling procedure.

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_VECTOR_TABLE_RELOCATION
	bool

config ARCH_HAS_NESTED_EXCEPTION_DETECTION
	bool

config ARCH_SUPPORTS_COREDUMP
	bool

config ARCH_SUPPORTS_COREDUMP_THREADS
	bool

config ARCH_SUPPORTS_COREDUMP_PRIV_STACKS
	bool

config ARCH_SUPPORTS_COREDUMP_STACK_PTR
	bool

config ARCH_SUPPORTS_ARCH_HW_INIT
	bool

config ARCH_SUPPORTS_ROM_START
	bool

config ARCH_SUPPORTS_EMPTY_IRQ_SPURIOUS
	bool

config ARCH_SUPPORTS_EVICTION_TRACKING
	bool
	help
	  Architecture code supports page tracking for eviction algorithms
	  when demand paging is enabled.

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

config ARCH_HAS_SUSPEND_TO_RAM
	bool
	help
	  When selected, the architecture supports suspend-to-RAM (S2RAM).

config ARCH_HAS_STACK_CANARIES_TLS
	bool

config ARCH_SUPPORTS_MEM_MAPPED_STACKS
	bool
	help
	  Select when the architecture supports memory mapped stacks.

config ARCH_HAS_THREAD_PRIV_STACK_SPACE_GET
	bool
	help
	  Select when the architecture implements arch_thread_priv_stack_space_get().

config ARCH_HAS_HW_SHADOW_STACK
	bool

#
# Other architecture related options
#

config ARCH_HAS_THREAD_ABORT
	bool

config ARCH_HAS_CODE_DATA_RELOCATION
	bool
	help
	  When selected, the architecture/SoC implements support for
	  CODE_DATA_RELOCATION in its linker scripts.

#
# 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 has support for
	  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_DSP
	bool
	help
	  This option is enabled when the CPU has hardware DSP 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_DEMAND_MAPPING
	bool
	help
	  This hidden configuration should be selected by the architecture if
	  demand paging is supported and arch_mem_map() supports
	  K_MEM_MAP_UNPAGED.

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_HAS_DIRECTED_IPIS
	bool
	help
	  This hidden configuration should be selected by the architecture if
	  it has an implementation for arch_sched_directed_ipi() which allows
	  for IPIs to be directed to specific CPUs.

config CPU_HAS_DCACHE
	bool
	help
	  This hidden configuration should be selected when the CPU has a d-cache.

config CPU_CACHE_INCOHERENT
	bool
	help
	  This hidden configuration should be selected when the CPU has
	  incoherent cache. This applies to intra-CPU multiprocessing
	  incoherence and makes only sense when MP_MAX_NUM_CPUS > 1.

config CPU_HAS_ICACHE
	bool
	help
	  This hidden configuration should be selected when the CPU has an i-cache.

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 K_MEM_PAGE_FRAME_MAPPED will not be set.

config DCLS
	bool "Processor is configured in DCLS mode"
	depends on CPU_HAS_DCLS
	default y
	help
	  This option is enabled when the processor hardware is configured in
	  Dual-redundant Core Lock-step (DCLS) topology. For the processor that
	  supports DCLS, but is configured in split-lock mode (by default or
	  changed at flash time), this option should be disabled.

menuconfig MPU
	bool "MPU features"
	depends on CPU_HAS_MPU
	help
	  This option, when enabled, indicates to the core kernel that an MPU
	  is enabled.

if MPU
module = MPU
module-str = mpu
source "subsys/logging/Kconfig.template.log_config"

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.

config CODE_DATA_RELOCATION
	bool "Support code/data section relocation"
	depends on ARCH_HAS_CODE_DATA_RELOCATION
	help
	  Enable support for relocating .text, data and .bss sections from specified
	  files and placing them in a chosen memory region. Files to relocate and
	  the target regions should be specified in CMakeLists.txt using
	  zephyr_code_relocate().

menu "DSP Options"

config DSP_SHARING
	bool "DSP register sharing"
	depends on CPU_HAS_DSP
	help
	  This option enables preservation of the hardware DSP registers
	  across context switches to allow multiple threads to perform concurrent
	  DSP operations.
endmenu

menu "Floating Point Options"

config FPU
	bool "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 DCACHE
	bool "Data cache (d-cache) support"
	depends on CPU_HAS_DCACHE
	default y
	help
	  This option enables the support for the data cache (d-cache).

config ICACHE
	bool "Instruction cache (i-cache) support"
	depends on CPU_HAS_ICACHE
	default y
	help
	  This option enables the support for the instruction cache (i-cache).

config CACHE_DOUBLEMAP
	bool "Cache double-mapping support"
	depends on CPU_CACHE_INCOHERENT
	default y
	help
	  Double-mapping behavior where a pointer can be cheaply converted to
	  point to the same cached/uncached memory at different locations.

	  This applies to intra-CPU multiprocessing incoherence and makes only
	  sense when MP_MAX_NUM_CPUS > 1.

config CACHE_MANAGEMENT
	bool "Cache management features"
	depends on DCACHE || ICACHE
	help
	  This option enables the cache management functions backed by arch or
	  driver code.

if CACHE_MANAGEMENT

if DCACHE

config DCACHE_LINE_SIZE_DETECT
	bool "Detect d-cache line size at runtime"
	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"
	depends on !DCACHE_LINE_SIZE_DETECT
	default $(dt_node_int_prop_int,/cpus/cpu@0,d-cache-line-size) \
		  if $(dt_node_has_prop,/cpus/cpu@0,d-cache-line-size)
	default 0
	help
	  Size in bytes of a CPU d-cache line.

	  Detect automatically at runtime by selecting DCACHE_LINE_SIZE_DETECT.

endif # DCACHE

if ICACHE

config ICACHE_LINE_SIZE_DETECT
	bool "Detect i-cache line size at runtime"
	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"
	depends on !ICACHE_LINE_SIZE_DETECT
	default $(dt_node_int_prop_int,/cpus/cpu@0,i-cache-line-size) \
		  if $(dt_node_has_prop,/cpus/cpu@0,i-cache-line-size)
	default 0
	help
	  Size in bytes of a CPU i-cache line.

	  Detect automatically at runtime by selecting ICACHE_LINE_SIZE_DETECT.

endif # ICACHE

choice CACHE_TYPE
	prompt "Cache type"
	default ARCH_CACHE

config ARCH_CACHE
	bool "Integrated cache controller"
	help
	  Integrated on-core cache controller

config EXTERNAL_CACHE
	bool "External cache controller"
	help
	  External cache controller

endchoice

endif # CACHE_MANAGEMENT

endmenu

config ARCH
	string
	help
	  System architecture string.

config TOOLCHAIN_HAS_BUILTIN_FFS
	bool
	default y if !(64BIT && RISCV)
	help
	  Hidden option to signal that toolchain has __builtin_ffs*().

config ARCH_HAS_CUSTOM_CPU_IDLE
	bool
	help
	  This options allows applications to override the default arch idle implementation with
	  a custom one.

config ARCH_HAS_CUSTOM_CPU_ATOMIC_IDLE
	bool
	help
	  This options allows applications to override the default arch idle implementation with
	  a custom one.

config ARCH_HAS_CUSTOM_SWAP_TO_MAIN
	bool
	help
	  It's possible that an architecture port cannot use z_swap_unlocked()
	  to swap to the main thread (bg_thread_main), but instead must do
	  something custom. It must enable this option in that case.

config ARCH_HAS_CUSTOM_BUSY_WAIT
	bool
	help
	  It's possible that an architecture port cannot or does not want to use
	  the provided k_busy_wait(), but instead must do something custom. It must
	  enable this option in that case.

config ARCH_HAS_CUSTOM_CURRENT_IMPL
	bool
	help
	  Select when architecture implements arch_current_thread() &
	  arch_current_thread_set().

config ARCH_IPI_LAZY_COPROCESSORS_SAVE
	bool
	help
	  Select when the architecture has multi-CPU lazy context switching
	  of coprocessor registers.
