# Kconfig - kernel configuration options

#
# Copyright (c) 2014-2015 Wind River Systems, Inc.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1) Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2) Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# 3) Neither the name of Wind River Systems nor the names of its contributors
# may be used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#

choice
prompt "Kernel Type"
default MICROKERNEL

config NANOKERNEL
	bool "Nano Kernel"

config MICROKERNEL
	bool "Micro Kernel"

endchoice

menu "General Kernel Options"

config SYS_CLOCK_TICKS_PER_SEC
	int
	prompt "System tick frequency (in ticks/second)"
	default 100
	depends on !NO_ISRS
	help
	This option specifies the frequency of the system clock in Hz.

config SYS_CLOCK_HW_CYCLES_PER_SEC
	int "System clock's h/w timer frequency"
	default 0
	help
	This option specifies the frequency of the hardware timer used for the
	system clock (in Hz). It is normally set by the platform's defconfig file
	and the user should generally avoid modifying it via the menu configuration.

config  SYS_CLOCK_EXISTS
	bool
	# omit prompt to signify a "hidden" option
	default n if (SYS_CLOCK_TICKS_PER_SEC = 0)
	default y
	help
	This option specifies that the kernel lacks timer support.

config  INIT_STACKS
	bool
	prompt "Initialize stack areas"
	default n
	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 both tasks and fibers, as well as for the microkernel server's command
	stack.

config  XIP
	bool
	prompt "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 platforms
	  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.


config RING_BUFFER
	bool
	prompt "Enable ring buffers"
	default n
	help
	Enable usage of ring buffers. Similar to nanokernel FIFOs but manage
	their own buffer memory and can store arbitrary data. For optimal
	performance, use buffer sizes that are a power of 2.

config EVENT_LOGGER
	bool
	prompt "Enable event logger"
	default n
	select RING_BUFFER
	help
	Enable event logging feature. Allow the usage of a ring buffer to
	transmit event messages with a single interface to collect them.

config KERNEL_PROFILER
	bool
	prompt "Enable profiler features"
	default n
	select EVENT_LOGGER
	help
	This feature enables the usage of the profiling logger. Provides the
	logging of sleep events (either entering or leaving low power conditions),
	context switch events, interrupt events, boot events and a method to
	collect these profile messages.

config PROFILER_BUFFER_SIZE
	int
	prompt "Profiler buffer size"
	default 128
	depends on KERNEL_PROFILER
	help
	Buffer size in 32-bit words.


menu "Profiler points"
depends on KERNEL_PROFILER

config PROFILER_CONTEXT_SWITCH
	bool
	prompt "Context switch profiler point"
	default n
	depends on KERNEL_PROFILER
	help
	Enable the context switch event messages.

config PROFILER_INTERRUPT
	bool
	prompt "Interrupt profiler point"
	default n
	depends on KERNEL_PROFILER
	help
	Enable interrupt event messages. These messages provide the following
	information: The time when interrupts occur.

config PROFILER_SLEEP
	bool
	prompt "Sleep profiler point"
	default n
	depends on KERNEL_PROFILER && ADVANCED_POWER_MANAGEMENT
	help
	Enable low power condition event messages. These messages provide the
	following information:
		- When the CPU went to sleep mode.
		- When the CPU woke up.
		- The ID of the interrupt that woke the CPU up.
endmenu

menu "Security Options"

config CUSTOM_SECURITY
	bool
	prompt "Customized security"
	default n
	help
	This option allow users to disable enhanced security features they do
	not wish to use or enable the use of features with security exposures.

config STACK_CANARIES
	bool
	prompt "Compiler stack canaries"
	default n
	help
	This option enables compiler stack canaries support kernel functions.

	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, enabling this
	option has no effect.
endmenu

endmenu
source "kernel/nanokernel/Kconfig"

config TICKLESS_IDLE
	bool
	prompt "Tickless idle"
	default y
	depends on ADVANCED_POWER_MANAGEMENT
	help
	This option suppresses periodic system clock interrupts whenever the
	kernel becomes idle. This permits the system to remain in a power
	saving state for extended periods without having to wake up to
	service each tick as it occurs.

config TICKLESS_IDLE_THRESH
	int
	prompt "Tickless idle threshold"
	default 3
	depends on TICKLESS_IDLE && MICROKERNEL
	help
	This option disables clock interrupt suppression when the kernel idles
	for only a short period of time. It specifies the minimum number of
	ticks that must occur before the next kernel timer expires in order
	for suppression to happen.

if MICROKERNEL
source "kernel/microkernel/Kconfig"
endif
