# Kconfig - miscellany configuration options

#
# Copyright (c) 2014-2015 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#

menu "Build and Link Features"

menu "Linker Options"
config HAS_FLASH_LOAD_OFFSET
	bool
	help
	This option is selected by targets having a FLASH_LOAD_OFFSET
	and FLASH_LOAD_SIZE.

if !HAS_DTS
config FLASH_LOAD_OFFSET
	hex "Kernel load offset"
	default 0
	depends on HAS_FLASH_LOAD_OFFSET
	help
	This option specifies the byte offset from the beginning of flash that
	the kernel should be loaded into. Changing this value from zero will
	affect the Zephyr image's link, and will decrease the total amount of
	flash available for use by application code.

	If unsure, leave at the default value 0.

config FLASH_LOAD_SIZE
	hex "Kernel load size"
	default 0
	depends on HAS_FLASH_LOAD_OFFSET
	help
	If non-zero, this option specifies the size, in bytes, of the flash
	area that the Zephyr image will be allowed to occupy.  If zero, the
	image will be able to occupy from the FLASH_LOAD_OFFSET to the end of
	the device.

	If unsure, leave at the default value 0.
endif

config TEXT_SECTION_OFFSET
	hex "TEXT section offset"
	default 0
	help
	This sets and offset before the text section and allows booting images
	with custom headers that are inserted at the beginning of the image.

config HAVE_CUSTOM_LINKER_SCRIPT
	prompt "Custom linker scripts provided"
	def_bool n
	help
	Set this option if you have a custom linker script which needed to
	be define in CUSTOM_LINKER_SCRIPT.

config CUSTOM_LINKER_SCRIPT
	string "Path to custom linker script"
	default ""
	depends on HAVE_CUSTOM_LINKER_SCRIPT
	help
	Path to the linker script to be used instead of the one define by the
	board.

	The linker script must be based on a version provided by Zephyr since
	the kernel can expect a certain layout/certain regions.

	This is useful when an application needs to add sections into the
	linker script and avoid having to change the script provided by
	Zephyr.

config CUSTOM_RODATA_LD
	bool "Include custom-rodata.ld"
	default n
	help
	Include a customized linker script fragment for inserting additional
	data and linker directives into the rodata section.

config CUSTOM_RWDATA_LD
	bool "Include custom-rwdata.ld"
	default n
	help
	Include a customized linker script fragment for inserting additional
	data and linker directives into the data section.

config CUSTOM_SECTIONS_LD
	bool "Include custom-sections.ld"
	default n
	help
	Include a customized linker script fragment for inserting additional
	arbitrary sections.

config LINK_WHOLE_ARCHIVE
	bool "Allow linking with --whole-archive"
	default n
	help
	This options allows linking external libraries with the
	--whole-archive option to keep all symbols.

config KERNEL_ENTRY
	string "Kernel entry symbol"
	default "__start"
	help
	Code entry symbol, to be set at linking phase.

config CHECK_LINK_MAP
	bool "Check linker map"
	default y
	help
	  Run a linker address generation validity checker at the end of the
	  build.
endmenu

menu "Compiler Options"

config CROSS_COMPILE
	string "Cross-compiler tool prefix"
	help
	Same as running 'make CROSS_COMPILE=prefix-' but stored for
	default make runs in this kernel build directory.  You don't
	need to set this unless you want the configured kernel build
	directory to select the cross-compiler automatically.

config COMPILER_OPT
	string
	prompt "Custom compiler options"
	default ""
	help
	This option is a free-form string that is passed to the compiler
	when building all parts of a project (i.e. kernel).
	The compiler options specified by this string supplement the
	predefined set of compiler supplied by the build system,
	and can be used to change compiler optimization, warning and error
	messages, and so on.

config TOOLCHAIN_VARIANT
	string "Cross-compiler variant name"
	help
	For optimized compilers with reduced features, specify the name
	of the variant.

endmenu

menu "Build Options"

config KERNEL_BIN_NAME
	string "The kernel binary name"
	default "zephyr"
	help
	  This option sets the name of the generated kernel binary.

config OUTPUT_STAT
	bool "Create a statistics file"
	default y
	help
	  Create a stat file using readelf -e <elf>

config OUTPUT_DISASSEMBLY
	bool "Create a disassembly file"
	default y
	help
	  Create an .lst file with the assembly listing of the firmware.

config BUILD_OUTPUT_HEX
	bool "Build a binary in HEX format"
	default n
	help
	  Build a binary in HEX format. This will build a zephyr.hex file need
	  by some platforms.

config BUILD_OUTPUT_BIN
	bool "Build a binary in BIN format"
	default y
	help
	  Build a binary in BIN format. This will build a zephyr.bin file need
	  by some platforms.

config BUILD_OUTPUT_S19
	bool "Build a binary in S19 format"
	default n
	help
	  Build a binary in S19 format. This will build a zephyr.s19 file need
	  by some platforms.

config BUILD_OUTPUT_STRIPPED
	bool "Build a stripped binary"
	default n
	help
	  Build a stripped binary. This will build a zephyr.stripped file need
	  by some platforms.

endmenu
endmenu

menu "System Monitoring Options"

config PERFORMANCE_METRICS
	bool
	prompt "Enable performance metrics [EXPERIMENTAL]"
	default n
	help
	Enable Performance Metrics.

config BOOT_TIME_MEASUREMENT
	bool
	prompt "Boot time measurements [EXPERIMENTAL]"
	default n
	depends on PERFORMANCE_METRICS
	help
	This option enables the recording of timestamps during system start
	up. The global variable __start_time_stamp records the time kernel begins
	executing, while __main_time_stamp records when main() begins executing,
	and __idle_time_stamp records when the CPU becomes idle. All values are
	recorded in terms of CPU clock cycles since system reset.

config CPU_CLOCK_FREQ_MHZ
	int
	prompt "CPU Clock Frequency in MHz"
	default 20
	depends on BOOT_TIME_MEASUREMENT
	help
	This option specifies the CPU Clock Frequency in MHz in order to
	convert Intel RDTSC timestamp to microseconds.

endmenu

menu "Boot Options"

config IS_BOOTLOADER
	bool "Act as a bootloader"
	default n
	depends on XIP
	depends on ARM
	help
	This option indicates that Zephyr will act as a bootloader to execute
	a separate Zephyr image payload.

config BOOTLOADER_SRAM_SIZE
	int "SRAM reserved for when Zephyr acts as a bootloader"
	default 16
	depends on !XIP || IS_BOOTLOADER
	depends on ARM
	help
	This option specifies the amount of SRAM (measure in kB) reserved for
	when Zephyr is to act as a bootloader.

config BOOTLOADER_KEXEC
	bool
	prompt "Boot using Linux kexec() system call"
	depends on X86
	default n
	help
	This option signifies that Linux boots the kernel using kexec system call
	and utility. This method is used to boot the kernel over the network.

config BOOTLOADER_UNKNOWN
	bool
	prompt "Generic boot loader support"
	default n
	depends on X86
	help
	This option signifies that the target has a generic bootloader
	or that it supports multiple ways of booting and it isn't clear
	at build time which method is to be used. When this option is enabled
	the board may have to do extra work to ensure a proper startup.

config BOOTLOADER_CONTEXT_RESTORE
	bool
	prompt "Boot loader has context restore support"
	default y
	depends on SYS_POWER_DEEP_SLEEP && BOOTLOADER_CONTEXT_RESTORE_SUPPORTED
	help
	This option signifies that the target has a bootloader
	that restores CPU context upon resuming from deep sleep
	power state.

config REBOOT
	bool "Reboot functionality"
	default n
	select SYSTEM_CLOCK_DISABLE
	help
	Enable the sys_reboot() API. Enabling this can drag in other subsystems
	needed to perform a "safe" reboot (e.g. SYSTEM_CLOCK_DISABLE, to stop the
	system clock before issuing a reset).
endmenu
