| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913 | 
							- # Kernel configuration options
 
- # Copyright (c) 2014-2015 Wind River Systems, Inc.
 
- # SPDX-License-Identifier: Apache-2.0
 
- menu "General Kernel Options"
 
- module = KERNEL
 
- module-str = kernel
 
- source "subsys/logging/Kconfig.template.log_config"
 
- source "kernel/Kconfig.acts"
 
- config MULTITHREADING
 
- 	bool "Multi-threading" if ARCH_HAS_SINGLE_THREAD_SUPPORT
 
- 	default y
 
- 	help
 
- 	  If disabled, only the main thread is available, so a main() function
 
- 	  must be provided. Interrupts are available. Kernel objects will most
 
- 	  probably not behave as expected, especially with regards to pending,
 
- 	  since the main thread cannot pend, it being the only thread in the
 
- 	  system.
 
- 	  Many drivers and subsystems will not work with this option
 
- 	  set to 'n'; disable only when you REALLY know what you are
 
- 	  doing.
 
- config NUM_COOP_PRIORITIES
 
- 	int "Number of coop priorities" if MULTITHREADING
 
- 	default 1 if !MULTITHREADING
 
- 	default 16
 
- 	range 0 128
 
- 	help
 
- 	  Number of cooperative priorities configured in the system. Gives access
 
- 	  to priorities:
 
- 		K_PRIO_COOP(0) to K_PRIO_COOP(CONFIG_NUM_COOP_PRIORITIES - 1)
 
- 	  or seen another way, priorities:
 
- 		-CONFIG_NUM_COOP_PRIORITIES to -1
 
- 	  This can be set to zero to disable cooperative scheduling. Cooperative
 
- 	  threads always preempt preemptible threads.
 
- 	  The total number of priorities is
 
- 	   NUM_COOP_PRIORITIES + NUM_PREEMPT_PRIORITIES + 1
 
- 	  The extra one is for the idle thread, which must run at the lowest
 
- 	  priority, and be the only thread at that priority.
 
- config NUM_PREEMPT_PRIORITIES
 
- 	int "Number of preemptible priorities" if MULTITHREADING
 
- 	default 0 if !MULTITHREADING
 
- 	default 15
 
- 	range 0 128
 
- 	help
 
- 	  Number of preemptible priorities available in the system. Gives access
 
- 	  to priorities 0 to CONFIG_NUM_PREEMPT_PRIORITIES - 1.
 
- 	  This can be set to 0 to disable preemptible scheduling.
 
- 	  The total number of priorities is
 
- 	   NUM_COOP_PRIORITIES + NUM_PREEMPT_PRIORITIES + 1
 
- 	  The extra one is for the idle thread, which must run at the lowest
 
- 	  priority, and be the only thread at that priority.
 
- config MAIN_THREAD_PRIORITY
 
- 	int "Priority of initialization/main thread"
 
- 	default -2 if !PREEMPT_ENABLED
 
- 	default 0
 
- 	help
 
- 	  Priority at which the initialization thread runs, including the start
 
- 	  of the main() function. main() can then change its priority if desired.
 
- config COOP_ENABLED
 
- 	def_bool (NUM_COOP_PRIORITIES != 0)
 
- config PREEMPT_ENABLED
 
- 	def_bool (NUM_PREEMPT_PRIORITIES != 0)
 
- config PRIORITY_CEILING
 
- 	int "Priority inheritance ceiling"
 
- 	default -127
 
- 	help
 
- 	  This defines the minimum priority value (i.e. the logically
 
- 	  highest priority) that a thread will acquire as part of
 
- 	  k_mutex priority inheritance.
 
- config NUM_METAIRQ_PRIORITIES
 
- 	int "Number of very-high priority 'preemptor' threads"
 
- 	default 0
 
- 	help
 
- 	  This defines a set of priorities at the (numerically) lowest
 
- 	  end of the range which have "meta-irq" behavior.  Runnable
 
- 	  threads at these priorities will always be scheduled before
 
- 	  threads at lower priorities, EVEN IF those threads are
 
- 	  otherwise cooperative and/or have taken a scheduler lock.
 
- 	  Making such a thread runnable in any way thus has the effect
 
- 	  of "interrupting" the current task and running the meta-irq
 
- 	  thread synchronously, like an exception or system call.  The
 
- 	  intent is to use these priorities to implement "interrupt
 
- 	  bottom half" or "tasklet" behavior, allowing driver
 
- 	  subsystems to return from interrupt context but be guaranteed
 
- 	  that user code will not be executed (on the current CPU)
 
- 	  until the remaining work is finished.  As this breaks the
 
- 	  "promise" of non-preemptibility granted by the current API
 
- 	  for cooperative threads, this tool probably shouldn't be used
 
- 	  from application code.
 
- config SCHED_DEADLINE
 
- 	bool "Enable earliest-deadline-first scheduling"
 
- 	help
 
- 	  This enables a simple "earliest deadline first" scheduling
 
- 	  mode where threads can set "deadline" deltas measured in
 
- 	  k_cycle_get_32() units.  Priority decisions within (!!) a
 
- 	  single priority will choose the next expiring deadline and
 
- 	  not simply the least recently added thread.
 
- config SCHED_CPU_MASK
 
- 	bool "Enable CPU mask affinity/pinning API"
 
- 	depends on SCHED_DUMB
 
- 	help
 
- 	  When true, the application will have access to the
 
- 	  k_thread_cpu_mask_*() APIs which control per-CPU affinity masks in
 
- 	  SMP mode, allowing applications to pin threads to specific CPUs or
 
- 	  disallow threads from running on given CPUs.  Note that as currently
 
- 	  implemented, this involves an inherent O(N) scaling in the number of
 
- 	  idle-but-runnable threads, and thus works only with the DUMB
 
- 	  scheduler (as SCALABLE and MULTIQ would see no benefit).
 
- 	  Note that this setting does not technically depend on SMP and is
 
- 	  implemented without it for testing purposes, but for obvious reasons
 
- 	  makes sense as an application API only where there is more than one
 
- 	  CPU.  With one CPU, it's just a higher overhead version of
 
- 	  k_thread_start/stop().
 
- config MAIN_STACK_SIZE
 
- 	int "Size of stack for initialization and main thread"
 
- 	default 2048 if COVERAGE_GCOV
 
- 	default 1024 if TEST_ARM_CORTEX_M
 
- 	default 512 if ZTEST && !(RISCV || X86)
 
- 	default 1024
 
- 	help
 
- 	  When the initialization is complete, the thread executing it then
 
- 	  executes the main() routine, so as to reuse the stack used by the
 
- 	  initialization, which would be wasted RAM otherwise.
 
- 	  After initialization is complete, the thread runs main().
 
- config IDLE_STACK_SIZE
 
- 	int "Size of stack for idle thread"
 
- 	default 2048 if COVERAGE_GCOV
 
- 	default 1024 if XTENSA
 
- 	default 512 if RISCV
 
- 	default 384 if DYNAMIC_OBJECTS
 
- 	default 320 if ARC || (ARM && CPU_HAS_FPU) || (X86 && MMU)
 
- 	default 256
 
- 	help
 
- 	  Depending on the work that the idle task must do, most likely due to
 
- 	  power management but possibly to other features like system event
 
- 	  logging (e.g. logging when the system goes to sleep), the idle thread
 
- 	  may need more stack space than the default value.
 
- config ISR_STACK_SIZE
 
- 	int "ISR and initialization stack size (in bytes)"
 
- 	default 2048
 
- 	help
 
- 	  This option specifies the size of the stack used by interrupt
 
- 	  service routines (ISRs), and during kernel initialization.
 
- config THREAD_STACK_INFO
 
- 	bool "Thread stack info"
 
- 	help
 
- 	  This option allows each thread to store the thread stack info into
 
- 	  the k_thread data structure.
 
- config THREAD_CUSTOM_DATA
 
- 	bool "Thread custom data"
 
- 	help
 
- 	  This option allows each thread to store 32 bits of custom data,
 
- 	  which can be accessed using the k_thread_custom_data_xxx() APIs.
 
- config THREAD_USERSPACE_LOCAL_DATA
 
- 	bool
 
- 	depends on USERSPACE
 
- 	default y if ERRNO && !ERRNO_IN_TLS
 
- config ERRNO
 
- 	bool "Enable errno support"
 
- 	default y
 
- 	help
 
- 	  Enable per-thread errno in the kernel. Application and library code must
 
- 	  include errno.h provided by the C library (libc) to use the errno
 
- 	  symbol. The C library must access the per-thread errno via the
 
- 	  z_errno() symbol.
 
- config ERRNO_IN_TLS
 
- 	bool "Store errno in thread local storage (TLS)"
 
- 	depends on ERRNO && THREAD_LOCAL_STORAGE
 
- 	default y
 
- 	help
 
- 	  Use thread local storage to store errno instead of storing it in
 
- 	  the kernel thread struct. This avoids a syscall if userspace is enabled.
 
- choice SCHED_ALGORITHM
 
- 	prompt "Scheduler priority queue algorithm"
 
- 	default SCHED_DUMB
 
- 	help
 
- 	  The kernel can be built with with several choices for the
 
- 	  ready queue implementation, offering different choices between
 
- 	  code size, constant factor runtime overhead and performance
 
- 	  scaling when many threads are added.
 
- config SCHED_DUMB
 
- 	bool "Simple linked-list ready queue"
 
- 	help
 
- 	  When selected, the scheduler ready queue will be implemented
 
- 	  as a simple unordered list, with very fast constant time
 
- 	  performance for single threads and very low code size.
 
- 	  Choose this on systems with constrained code size that will
 
- 	  never see more than a small number (3, maybe) of runnable
 
- 	  threads in the queue at any given time.  On most platforms
 
- 	  (that are not otherwise using the red/black tree) this
 
- 	  results in a savings of ~2k of code size.
 
- config SCHED_SCALABLE
 
- 	bool "Red/black tree ready queue"
 
- 	help
 
- 	  When selected, the scheduler ready queue will be implemented
 
- 	  as a red/black tree.  This has rather slower constant-time
 
- 	  insertion and removal overhead, and on most platforms (that
 
- 	  are not otherwise using the rbtree somewhere) requires an
 
- 	  extra ~2kb of code.  But the resulting behavior will scale
 
- 	  cleanly and quickly into the many thousands of threads.  Use
 
- 	  this on platforms where you may have many threads (very
 
- 	  roughly: more than 20 or so) marked as runnable at a given
 
- 	  time.  Most applications don't want this.
 
- config SCHED_MULTIQ
 
- 	bool "Traditional multi-queue ready queue"
 
- 	depends on !SCHED_DEADLINE
 
- 	help
 
- 	  When selected, the scheduler ready queue will be implemented
 
- 	  as the classic/textbook array of lists, one per priority
 
- 	  (max 32 priorities).  This corresponds to the scheduler
 
- 	  algorithm used in Zephyr versions prior to 1.12.  It incurs
 
- 	  only a tiny code size overhead vs. the "dumb" scheduler and
 
- 	  runs in O(1) time in almost all circumstances with very low
 
- 	  constant factor.  But it requires a fairly large RAM budget
 
- 	  to store those list heads, and the limited features make it
 
- 	  incompatible with features like deadline scheduling that
 
- 	  need to sort threads more finely, and SMP affinity which
 
- 	  need to traverse the list of threads.  Typical applications
 
- 	  with small numbers of runnable threads probably want the
 
- 	  DUMB scheduler.
 
- endchoice # SCHED_ALGORITHM
 
- choice WAITQ_ALGORITHM
 
- 	prompt "Wait queue priority algorithm"
 
- 	default WAITQ_DUMB
 
- 	help
 
- 	  The wait_q abstraction used in IPC primitives to pend
 
- 	  threads for later wakeup shares the same backend data
 
- 	  structure choices as the scheduler, and can use the same
 
- 	  options.
 
- config WAITQ_SCALABLE
 
- 	bool "Use scalable wait_q implementation"
 
- 	help
 
- 	  When selected, the wait_q will be implemented with a
 
- 	  balanced tree.  Choose this if you expect to have many
 
- 	  threads waiting on individual primitives.  There is a ~2kb
 
- 	  code size increase over WAITQ_DUMB (which may be shared with
 
- 	  SCHED_SCALABLE) if the rbtree is not used elsewhere in the
 
- 	  application, and pend/unpend operations on "small" queues
 
- 	  will be somewhat slower (though this is not generally a
 
- 	  performance path).
 
- config WAITQ_DUMB
 
- 	bool "Simple linked-list wait_q"
 
- 	help
 
- 	  When selected, the wait_q will be implemented with a
 
- 	  doubly-linked list.  Choose this if you expect to have only
 
- 	  a few threads blocked on any single IPC primitive.
 
- endchoice # WAITQ_ALGORITHM
 
- config DEVICE_HANDLE_PADDING
 
- 	int "Number of additional device handles to use for padding"
 
- 	default 0
 
- 	range 0 10
 
- 	help
 
- 	  This is a "fudge factor" which works around build system
 
- 	  limitations. It is safe to ignore unless you get a specific
 
- 	  build system error about it.
 
- 	  The option's value is the number of superfluous device handle
 
- 	  values which are introduced into the array pointed to by each
 
- 	  device's 'handles' member during the first linker pass.
 
- 	  Each handle uses 2 bytes, so a value of 3 would use an extra
 
- 	  6 bytes of ROM for every device.
 
- menu "Kernel Debugging and Metrics"
 
- config INIT_STACKS
 
- 	bool "Initialize stack areas"
 
- 	help
 
- 	  This option instructs the kernel to initialize stack areas with a
 
- 	  known value (0xaa) before they are first used, so that the high
 
- 	  water mark can be easily determined. This applies to the stack areas
 
- 	  for threads, as well as to the interrupt stack.
 
- config BOOT_BANNER
 
- 	bool "Boot banner"
 
- 	default y
 
- 	depends on CONSOLE_HAS_DRIVER
 
- 	select PRINTK
 
- 	select EARLY_CONSOLE
 
- 	help
 
- 	  This option outputs a banner to the console device during boot up.
 
- config KALLSYMS
 
- 	bool "Load all symbols for debugging/ksymoops"
 
- 	default n
 
- 	select INIT_STACKS
 
- 	help
 
- 	   Say Y here to let the kernel print out symbolic crash information and
 
- 	   symbolic stack backtraces. This increases the size of the kernel
 
- 	   somewhat, as all symbols have to be loaded into the kernel image.
 
- config KALLSYMS_NO_NAME
 
- 	bool "Disable output symbols name for kallsyms"
 
- 	default n
 
- 	depends on KALLSYMS
 
- 	help
 
- 	   Say Y here to Disable output symbols name for kallsyms to save image size.
 
- config SECTION_OVERLAY
 
- 	bool "Support section overlay"
 
- 	default n
 
- 	help
 
- 	This enable section overlay feature in link file. We can reuse RAM space
 
- 	for these mutually exclusive modules.
 
- config BOOT_DELAY
 
- 	int "Boot delay in milliseconds"
 
- 	default 0
 
- 	help
 
- 	  This option delays bootup for the specified amount of
 
- 	  milliseconds. This is used to allow serial ports to get ready
 
- 	  before starting to print information on them during boot, as
 
- 	  some systems might boot to fast for a receiving endpoint to
 
- 	  detect the new USB serial bus, enumerate it and get ready to
 
- 	  receive before it actually gets data. A similar effect can be
 
- 	  achieved by waiting for DCD on the serial port--however, not
 
- 	  all serial ports have DCD.
 
- config THREAD_MONITOR
 
- 	bool "Thread monitoring"
 
- 	help
 
- 	  This option instructs the kernel to maintain a list of all threads
 
- 	  (excluding those that have not yet started or have already
 
- 	  terminated).
 
- config THREAD_NAME
 
- 	bool "Thread name"
 
- 	help
 
- 	  This option allows to set a name for a thread.
 
- config THREAD_MAX_NAME_LEN
 
- 	int "Max length of a thread name"
 
- 	default 32
 
- 	default 64 if ZTEST
 
- 	range 8 128
 
- 	depends on THREAD_NAME
 
- 	help
 
- 	  Thread names get stored in the k_thread struct. Indicate the max
 
- 	  name length, including the terminating NULL byte. Reduce this value
 
- 	  to conserve memory.
 
- config THREAD_TIMER
 
- 	bool
 
- 	prompt "Thread timer"
 
- 	default n
 
- 	help
 
- 	  This option enable thread timer support.
 
- config INSTRUMENT_THREAD_SWITCHING
 
- 	bool
 
- menuconfig THREAD_RUNTIME_STATS
 
- 	bool "Thread runtime statistics"
 
- 	select INSTRUMENT_THREAD_SWITCHING
 
- 	help
 
- 	  Gather thread runtime statistics.
 
- 	  For example:
 
- 	    - Thread total execution cycles
 
- if THREAD_RUNTIME_STATS
 
- config THREAD_RUNTIME_STATS_USE_TIMING_FUNCTIONS
 
- 	bool "Use timing functions to gather statistics"
 
- 	select TIMING_FUNCTIONS_NEED_AT_BOOT
 
- 	help
 
- 	  Use timing functions to gather thread runtime statistics.
 
- 	  Note that timing functions may use a different timer than
 
- 	  the default timer for OS timekeeping.
 
- config CPULOAD_INTERVAL_MS
 
- 	int "statistics CPU load time intervals"
 
- 	default 2000
 
- endif # THREAD_RUNTIME_STATS
 
- endmenu
 
- menu "Work Queue Options"
 
- config SYSTEM_WORKQUEUE_STACK_SIZE
 
- 	int "System workqueue stack size"
 
- 	default 4096 if COVERAGE
 
- 	default 1024
 
- config SYSTEM_WORKQUEUE_PRIORITY
 
- 	int "System workqueue priority"
 
- 	default -2 if COOP_ENABLED && !PREEMPT_ENABLED
 
- 	default  0 if !COOP_ENABLED
 
- 	default -1
 
- 	help
 
- 	  By default, system work queue priority is the lowest cooperative
 
- 	  priority. This means that any work handler, once started, won't
 
- 	  be preempted by any other thread until finished.
 
- config SYSTEM_WORKQUEUE_NO_YIELD
 
- 	bool "Select whether system work queue yields"
 
- 	help
 
- 	  By default, the system work queue yields between each work item, to
 
- 	  prevent other threads from being starved.  Selecting this removes
 
- 	  this yield, which may be useful if the work queue thread is
 
- 	  cooperative and a sequence of work items is expected to complete
 
- 	  without yielding.
 
- endmenu
 
- menu "Atomic Operations"
 
- config ATOMIC_OPERATIONS_BUILTIN
 
- 	bool
 
- 	help
 
- 	  Use the compiler builtin functions for atomic operations. This is
 
- 	  the preferred method. However, support for all arches in GCC is
 
- 	  incomplete.
 
- config ATOMIC_OPERATIONS_ARCH
 
- 	bool
 
- 	help
 
- 	  Use when there isn't support for compiler built-ins, but you have
 
- 	  written optimized assembly code under arch/ which implements these.
 
- config ATOMIC_OPERATIONS_C
 
- 	bool
 
- 	help
 
- 	  Use atomic operations routines that are implemented entirely
 
- 	  in C by locking interrupts. Selected by architectures which either
 
- 	  do not have support for atomic operations in their instruction
 
- 	  set, or haven't been implemented yet during bring-up, and also
 
- 	  the compiler does not have support for the atomic __sync_* builtins.
 
- endmenu
 
- menu "Timer API Options"
 
- config TIMESLICING
 
- 	bool "Thread time slicing"
 
- 	default y
 
- 	depends on SYS_CLOCK_EXISTS && (NUM_PREEMPT_PRIORITIES != 0)
 
- 	help
 
- 	  This option enables time slicing between preemptible threads of
 
- 	  equal priority.
 
- config TIMESLICE_SIZE
 
- 	int "Time slice size (in ms)"
 
- 	default 0
 
- 	range 0 2147483647
 
- 	depends on TIMESLICING
 
- 	help
 
- 	  This option specifies the maximum amount of time a thread can execute
 
- 	  before other threads of equal priority are given an opportunity to run.
 
- 	  A time slice size of zero means "no limit" (i.e. an infinitely large
 
- 	  time slice).
 
- config TIMESLICE_PRIORITY
 
- 	int "Time slicing thread priority ceiling"
 
- 	default 0
 
- 	range 0 NUM_PREEMPT_PRIORITIES
 
- 	depends on TIMESLICING
 
- 	help
 
- 	  This option specifies the thread priority level at which time slicing
 
- 	  takes effect; threads having a higher priority than this ceiling are
 
- 	  not subject to time slicing.
 
- config POLL
 
- 	bool "Async I/O Framework"
 
- 	help
 
- 	  Asynchronous notification framework. Enable the k_poll() and
 
- 	  k_poll_signal_raise() APIs.  The former can wait on multiple events
 
- 	  concurrently, which can be either directly triggered or triggered by
 
- 	  the availability of some kernel objects (semaphores and FIFOs).
 
- endmenu
 
- menu "Other Kernel Object Options"
 
- config MEM_SLAB_TRACE_MAX_UTILIZATION
 
- 	bool "Enable getting maximum slab utilization"
 
- 	help
 
- 	  This adds variable to the k_mem_slab structure to hold
 
- 	  maximum utilization of the slab.
 
- config NUM_MBOX_ASYNC_MSGS
 
- 	int "Maximum number of in-flight asynchronous mailbox messages"
 
- 	default 10
 
- 	help
 
- 	  This option specifies the total number of asynchronous mailbox
 
- 	  messages that can exist simultaneously, across all mailboxes
 
- 	  in the system.
 
- 	  Setting this option to 0 disables support for asynchronous
 
- 	  mailbox messages.
 
- config NUM_PIPE_ASYNC_MSGS
 
- 	int "Maximum number of in-flight asynchronous pipe messages"
 
- 	default 10
 
- 	help
 
- 	  This option specifies the total number of asynchronous pipe
 
- 	  messages that can exist simultaneously, across all pipes in
 
- 	  the system.
 
- 	  Setting this option to 0 disables support for asynchronous
 
- 	  pipe messages.
 
- config KERNEL_MEM_POOL
 
- 	bool "Use Kernel Memory Pool"
 
- 	default y
 
- 	help
 
- 	  Enable the use of kernel memory pool.
 
- 	  Say y if unsure.
 
- if KERNEL_MEM_POOL
 
- config HEAP_MEM_POOL_SIZE
 
- 	int "Heap memory pool size (in bytes)"
 
- 	default 0 if !POSIX_MQUEUE
 
- 	default 1024 if POSIX_MQUEUE
 
- 	help
 
- 	  This option specifies the size of the heap memory pool used when
 
- 	  dynamically allocating memory using k_malloc(). The maximum size of
 
- 	  the memory pool is only limited to available memory. A size of zero
 
- 	  means that no heap memory pool is defined.
 
- endif # KERNEL_MEM_POOL
 
- endmenu
 
- config ARCH_HAS_CUSTOM_SWAP_TO_MAIN
 
- 	bool
 
- 	help
 
- 	  It's possible that an architecture port cannot use _Swap() to swap to
 
- 	  the _main() thread, but instead must do something custom. It must
 
- 	  enable this option in that case.
 
- config SWAP_NONATOMIC
 
- 	bool
 
- 	help
 
- 	  On some architectures, the _Swap() primitive cannot be made
 
- 	  atomic with respect to the irq_lock being released.  That
 
- 	  is, interrupts may be received between the entry to _Swap
 
- 	  and the completion of the context switch.  There are a
 
- 	  handful of workaround cases in the kernel that need to be
 
- 	  enabled when this is true.  Currently, this only happens on
 
- 	  ARM when the PendSV exception priority sits below that of
 
- 	  Zephyr-handled interrupts.
 
- 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 SYS_CLOCK_TICKS_PER_SEC
 
- 	int "System tick frequency (in ticks/second)"
 
- 	default 100 if QEMU_TARGET || SOC_POSIX
 
- 	default 10000 if TICKLESS_KERNEL
 
- 	default 100
 
- 	help
 
- 	  This option specifies the nominal frequency of the system clock in Hz.
 
- 	  For asynchronous timekeeping, the kernel defines a "ticks" concept. A
 
- 	  "tick" is the internal count in which the kernel does all its internal
 
- 	  uptime and timeout bookkeeping. Interrupts are expected to be delivered
 
- 	  on tick boundaries to the extent practical, and no fractional ticks
 
- 	  are tracked.
 
- 	  The choice of tick rate is configurable by this option. Also the number
 
- 	  of cycles per tick should be chosen so that 1 millisecond is exactly
 
- 	  represented by an integral number of ticks. Defaults on most hardware
 
- 	  platforms (ones that support setting arbitrary interrupt timeouts) are
 
- 	  expected to be in the range of 10 kHz, with software emulation
 
- 	  platforms and legacy drivers using a more traditional 100 Hz value.
 
- 	  Note that when available and enabled, in "tickless" mode
 
- 	  this config variable specifies the minimum available timing
 
- 	  granularity, not necessarily the number or frequency of
 
- 	  interrupts delivered to the kernel.
 
- 	  A value of 0 completely disables timer support in the kernel.
 
- config SYS_CLOCK_HW_CYCLES_PER_SEC
 
- 	int "System clock's h/w timer frequency"
 
- 	help
 
- 	  This option specifies the frequency of the hardware timer used for the
 
- 	  system clock (in Hz). This option is set by the SOC's or board's Kconfig file
 
- 	  and the user should generally avoid modifying it via the menu configuration.
 
- config SYS_CLOCK_EXISTS
 
- 	bool "System clock exists and is enabled"
 
- 	default y
 
- 	help
 
- 	  This option specifies that the kernel lacks timer support.
 
- 	  Some device configurations can eliminate significant code if
 
- 	  this is disabled.  Obviously timeout-related APIs will not
 
- 	  work.
 
- config TIMEOUT_64BIT
 
- 	bool "Store kernel timeouts in 64 bit precision"
 
- 	default y
 
- 	help
 
- 	  When this option is true, the k_ticks_t values passed to
 
- 	  kernel APIs will be a 64 bit quantity, allowing the use of
 
- 	  larger values (and higher precision tick rates) without fear
 
- 	  of overflowing the 32 bit word.  This feature also gates the
 
- 	  availability of absolute timeout values (which require the
 
- 	  extra precision).
 
- config XIP
 
- 	bool "Execute in place"
 
- 	help
 
- 	  This option allows the kernel 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.
 
- menu "Initialization Priorities"
 
- config KERNEL_INIT_PRIORITY_OBJECTS
 
- 	int "Kernel objects initialization priority"
 
- 	default 30
 
- 	help
 
- 	  Kernel objects use this priority for initialization. This
 
- 	  priority needs to be higher than minimal default initialization
 
- 	  priority.
 
- config KERNEL_INIT_PRIORITY_DEFAULT
 
- 	int "Default init priority"
 
- 	default 40
 
- 	help
 
- 	  Default minimal init priority for each init level.
 
- config KERNEL_INIT_PRIORITY_DEVICE
 
- 	int "Default init priority for device drivers"
 
- 	default 50
 
- 	help
 
- 	  Device driver, that depends on common components, such as
 
- 	  interrupt controller, but does not depend on other devices,
 
- 	  uses this init priority.
 
- config APPLICATION_INIT_PRIORITY
 
- 	int "Default init priority for application level drivers"
 
- 	default 90
 
- 	help
 
- 	  This priority level is for end-user drivers such as sensors and display
 
- 	  which have no inward dependencies.
 
- endmenu
 
- menu "Security Options"
 
- config STACK_CANARIES
 
- 	bool "Compiler stack canaries"
 
- #	depends on ENTROPY_GENERATOR || TEST_RANDOM_GENERATOR
 
- 	help
 
- 	  This option enables compiler stack canaries.
 
- 	  If stack canaries are supported by the compiler, it will emit
 
- 	  extra code that inserts a canary value into the stack frame when
 
- 	  a function is entered and validates this value upon exit.
 
- 	  Stack corruption (such as that caused by buffer overflow) results
 
- 	  in a fatal error condition for the running entity.
 
- 	  Enabling this option can result in a significant increase
 
- 	  in footprint and an associated decrease in performance.
 
- 	  If stack canaries are not supported by the compiler an error
 
- 	  will occur at build time.
 
- config EXECUTE_XOR_WRITE
 
- 	bool "Enable W^X for memory partitions"
 
- 	depends on USERSPACE
 
- 	depends on ARCH_HAS_EXECUTABLE_PAGE_BIT
 
- 	default y
 
- 	help
 
- 	  When enabled, will enforce that a writable page isn't executable
 
- 	  and vice versa.  This might not be acceptable in all scenarios,
 
- 	  so this option is given for those unafraid of shooting themselves
 
- 	  in the foot.
 
- 	  If unsure, say Y.
 
- config STACK_POINTER_RANDOM
 
- 	int "Initial stack pointer randomization bounds"
 
- 	depends on !STACK_GROWS_UP
 
- 	depends on MULTITHREADING
 
- 	depends on TEST_RANDOM_GENERATOR || ENTROPY_HAS_DRIVER
 
- 	default 0
 
- 	help
 
- 	  This option performs a limited form of Address Space Layout
 
- 	  Randomization by offsetting some random value to a thread's
 
- 	  initial stack pointer upon creation. This hinders some types of
 
- 	  security attacks by making the location of any given stack frame
 
- 	  non-deterministic.
 
- 	  This feature can waste up to the specified size in bytes the stack
 
- 	  region, which is carved out of the total size of the stack region.
 
- 	  A reasonable minimum value would be around 100 bytes if this can
 
- 	  be spared.
 
- 	  This is currently only implemented for systems whose stack pointers
 
- 	  grow towards lower memory addresses.
 
- config BOUNDS_CHECK_BYPASS_MITIGATION
 
- 	bool "Enable bounds check bypass mitigations for speculative execution"
 
- 	depends on USERSPACE
 
- 	help
 
- 	  Untrusted parameters from user mode may be used in system calls to
 
- 	  index arrays during speculative execution, also known as the Spectre
 
- 	  V1 vulnerability. When enabled, various macros defined in
 
- 	  misc/speculation.h will insert fence instructions or other appropriate
 
- 	  mitigations after bounds checking any array index parameters passed
 
- 	  in from untrusted sources (user mode threads). When disabled, these
 
- 	  macros do nothing.
 
- endmenu
 
- config MAX_DOMAIN_PARTITIONS
 
- 	int "Maximum number of partitions per memory domain"
 
- 	default 16
 
- 	range 0 255
 
- 	depends on USERSPACE
 
- 	help
 
- 	  Configure the maximum number of partitions per memory domain.
 
- config ARCH_MEM_DOMAIN_DATA
 
- 	bool
 
- 	depends on USERSPACE
 
- 	help
 
- 	  This hidden option is selected by the target architecture if
 
- 	  architecture-specific data is needed on a per memory domain basis.
 
- 	  If so, the architecture defines a 'struct arch_mem_domain' which is
 
- 	  embedded within every struct k_mem_domain. The architecture
 
- 	  must also define the arch_mem_domain_init() function to set this up
 
- 	  when a memory domain is created.
 
- 	  Typical uses might be a set of page tables for that memory domain.
 
- config ARCH_MEM_DOMAIN_SYNCHRONOUS_API
 
- 	bool
 
- 	depends on USERSPACE
 
- 	help
 
- 	  This hidden option is selected by the target architecture if
 
- 	  modifying a memory domain's partitions at runtime, or changing
 
- 	  a memory domain's thread membership requires synchronous calls
 
- 	  into the architecture layer.
 
- 	  If enabled, the architecture layer must implement the following
 
- 	  APIs:
 
- 	  arch_mem_domain_thread_add
 
- 	  arch_mem_domain_thread_remove
 
- 	  arch_mem_domain_partition_remove
 
- 	  arch_mem_domain_partition_add
 
- 	  It's important to note that although supervisor threads can be
 
- 	  members of memory domains, they have no implications on supervisor
 
- 	  thread access to memory. Memory domain APIs may only be invoked from
 
- 	  supervisor mode.
 
- 	  For these reasons, on uniprocessor systems unless memory access
 
- 	  policy is managed in separate software constructions like page
 
- 	  tables, these APIs don't need to be implemented as the underlying
 
- 	  memory management hardware will be reprogrammed on context switch
 
- 	  anyway.
 
- menu "SMP Options"
 
- config USE_SWITCH
 
- 	bool "Use new-style _arch_switch instead of arch_swap"
 
- 	depends on USE_SWITCH_SUPPORTED
 
- 	help
 
- 	  The _arch_switch() API is a lower level context switching
 
- 	  primitive than the original arch_swap mechanism.  It is required
 
- 	  for an SMP-aware scheduler, or if the architecture does not
 
- 	  provide arch_swap.  In uniprocess situations where the
 
- 	  architecture provides both, _arch_switch incurs more somewhat
 
- 	  overhead and may be slower.
 
- config USE_SWITCH_SUPPORTED
 
- 	bool
 
- 	help
 
- 	  Indicates whether _arch_switch() API is supported by the
 
- 	  currently enabled platform. This option should be selected by
 
- 	  platforms that implement it.
 
- config SMP
 
- 	bool "Enable symmetric multithreading support"
 
- 	depends on USE_SWITCH
 
- 	help
 
- 	  When true, kernel will be built with SMP support, allowing
 
- 	  more than one CPU to schedule Zephyr tasks at a time.
 
- config SMP_BOOT_DELAY
 
- 	bool "Delay booting secondary cores"
 
- 	depends on SMP
 
- 	help
 
- 	  By default Zephyr will boot all available CPUs during start up.
 
- 	  Select this option to skip this and allow architecture code boot
 
- 	  secondary CPUs at a later time.
 
- config MP_NUM_CPUS
 
- 	int "Number of CPUs/cores"
 
- 	default 1
 
- 	range 1 4
 
- 	help
 
- 	  Number of multiprocessing-capable cores available to the
 
- 	  multicpu API and SMP features.
 
- config SCHED_IPI_SUPPORTED
 
- 	bool
 
- 	help
 
- 	  True if the architecture supports a call to
 
- 	  arch_sched_ipi() to broadcast an interrupt that will call
 
- 	  z_sched_ipi() on other CPUs in the system.  Required for
 
- 	  k_thread_abort() to operate with reasonable latency
 
- 	  (otherwise we might have to wait for the other thread to
 
- 	  take an interrupt, which can be arbitrarily far in the
 
- 	  future).
 
- config TRACE_SCHED_IPI
 
- 	bool "Enable Test IPI"
 
- 	help
 
- 	  When true, it will add a hook into z_sched_ipi(), in order
 
- 	  to check if schedule IPI has called or not, for testing
 
- 	  purpose.
 
- 	depends on SCHED_IPI_SUPPORTED
 
- 	depends on MP_NUM_CPUS>1
 
- config KERNEL_COHERENCE
 
- 	bool "Place all shared data into coherent memory"
 
- 	depends on ARCH_HAS_COHERENCE
 
- 	default y if SMP && MP_NUM_CPUS > 1
 
- 	select THREAD_STACK_INFO
 
- 	help
 
- 	  When available and selected, the kernel will build in a mode
 
- 	  where all shared data is placed in multiprocessor-coherent
 
- 	  (generally "uncached") memory.  Thread stacks will remain
 
- 	  cached, as will application memory declared with
 
- 	  __incoherent.  This is intended for Zephyr SMP kernels
 
- 	  running on cache-incoherent architectures only.  Note that
 
- 	  when this is selected, there is an implicit API change that
 
- 	  assumes cache coherence to any memory passed to the kernel.
 
- 	  Code that creates kernel data structures in uncached regions
 
- 	  may fail strangely.  Some assertions exist to catch these
 
- 	  mistakes, but not all circumstances can be tested.
 
- endmenu
 
- config TICKLESS_KERNEL
 
- 	bool "Tickless kernel"
 
- 	default y if TICKLESS_CAPABLE
 
- 	depends on TICKLESS_CAPABLE
 
- 	help
 
- 	  This option enables a fully event driven kernel. Periodic system
 
- 	  clock interrupt generation would be stopped at all times.
 
- config TOOLCHAIN_SUPPORTS_THREAD_LOCAL_STORAGE
 
- 	bool
 
- 	default y if "$(ZEPHYR_TOOLCHAIN_VARIANT)" = "zephyr"
 
- 	help
 
- 	  Hidden option to signal that toolchain supports generating code
 
- 	  with thread local storage.
 
- config THREAD_LOCAL_STORAGE
 
- 	bool "Thread Local Storage (TLS)"
 
- 	depends on ARCH_HAS_THREAD_LOCAL_STORAGE && TOOLCHAIN_SUPPORTS_THREAD_LOCAL_STORAGE
 
- 	select NEED_LIBC_MEM_PARTITION if (CPU_CORTEX_M && USERSPACE)
 
- 	help
 
- 	  This option enables thread local storage (TLS) support in kernel.
 
- endmenu
 
 
  |