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


choice
	prompt "Architecture"
	default X86

config ARC
	bool "ARC architecture"

config ARM
	bool "ARM architecture"
	select ARCH_HAS_THREAD_ABORT

config X86
	bool "x86 architecture"
	select ATOMIC_OPERATIONS_BUILTIN

config NIOS2
	bool "Nios II Gen 2 architecture"
	select ATOMIC_OPERATIONS_C

config RISCV32
	bool "RISCV32 architecture"

config XTENSA
	bool "Xtensa architecture"

config ARCH_POSIX
	bool "POSIX (native) architecture"
	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

endchoice


menu "General Architecture Options"

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 (EXPERIMENTAL)"
	depends on ARCH_HAS_USERSPACE
	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.

	  This feature is under heavy development and APIs related to it are
	  subject to change, even if declared non-private.

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 SIMPLE_FATAL_ERROR_HANDLER
	prompt "Simple system fatal error handler"
	bool
	default n
	default y if !MULTITHREADING
	help
	  Provides an implementation of _SysFatalErrorHandler() that hard hangs
	  instead of aborting the faulting thread, and does not print anything,
	  for footprint-concerned systems. Only enable this option if you do not
	  want debug capabilities in case of system fatal error.

menu "Interrupt Configuration"
#
# Interrupt related configs
#
config GEN_ISR_TABLES
	bool
	prompt "Use generated IRQ tables"
	default n
	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
	prompt "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
	prompt "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 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"
	default n
	help
	  Enable irq_offload() API which allows functions to be synchronously
	  run in interrupt context. Mainly useful for test cases.

endmenu # Interrupt configuration

endmenu

#
# Architecture Capabilities
#
config ARCH_HAS_STACK_PROTECTION
	bool

config ARCH_HAS_USERSPACE
	bool

config ARCH_HAS_EXECUTABLE_PAGE_BIT
	bool

#
# Other architecture related options
#

config ARCH_HAS_THREAD_ABORT
	bool

#
# Hidden PM feature configs which are to be selected by
# individual SoC.
#
config SYS_POWER_LOW_POWER_STATE_SUPPORTED
	# Hidden
	bool
	default n
	help
	  This option signifies that the target supports the SYS_POWER_LOW_POWER_STATE
	  configuration option.

config SYS_POWER_DEEP_SLEEP_SUPPORTED
	# Hidden
	bool
	default n
	help
	  This option signifies that the target supports the SYS_POWER_DEEP_SLEEP
	  configuration option.

config BOOTLOADER_CONTEXT_RESTORE_SUPPORTED
	# Hidden
	bool
	default n
	help
	  This option signifies that the target has options of bootloaders
	  that support context restore upon resume from deep sleep


# End hidden CPU family configs
#

config CPU_HAS_FPU
	bool
	default n
	help
	  This option is enabled when the CPU has hardware floating point
	  unit.

config CPU_HAS_MPU
	bool
	# Omit prompt to signify "hidden" option
	default n
	help
	  This option is enabled when the CPU has a Memory Protection Unit (MPU).

menu "Floating Point Options"
depends on CPU_HAS_FPU

config FLOAT
	bool
	prompt "Floating point registers"
	default n
	help
	  This option allows threads to use the floating point registers.
	  By default, only a single thread may use the registers.

	  Disabling this option means that any thread that uses a
	  floating point register will get a fatal exception.

config FP_SHARING
	bool
	prompt "Floating point register sharing"
	depends on FLOAT
	default n
	help
	  This option allows multiple threads to use the floating point
	  registers.

endmenu

config FLASH_HAS_PAGE_LAYOUT
	bool
	default n
	help
	  This option is enabled when the SoC flash driver supports
	  retrieving the layout of flash memory pages.

#
# End hidden PM feature configs
#

config ARCH
	string
	help
	  System architecture string.

config SOC
	string
	help
	  SoC name which can be found under arch/<arch>/soc/<soc name>.
	  This option holds the directory name used by the build system to locate
	  the correct linker and header files for the SoC. This option will go away
	  once all SoCs are using family/series structure.

config SOC_SERIES
	string
	help
	  SoC series name which can be found under arch/<arch>/soc/<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 arch/<arch>/soc/<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
	  arch/<arch>/soc/<family>/<series>


source "arch/$ENV_VAR_SYM_ARCH/Kconfig"

source "boards/Kconfig"
