# Kconfig - debug configuration options

#
# Copyright (c) 2015 Wind River Systems, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#


menu "Safe memory access"

config MEM_SAFE
	bool
	prompt "Enable safe memory access"
	default n
	help
	Add the routines available in mem_safe.h to the system. This is added
	as a kconfig option instead of simply linking against the library
	because some implementations might require initialization.

choice
prompt "Safe memory access implementation"
depends on MEM_SAFE
default MEM_SAFE_CHECK_BOUNDARIES

config MEM_SAFE_CHECK_BOUNDARIES
	bool
	prompt "Software validation of memory access within memory regions"
	help
	This implementation checks the application image's text/rodata
	boundaries for its read-only region and the data/bss/noinit boundaries
	for its read-write region, in software.

	Other regions can be added as needed by using the
	sys_mem_safe_region_add() API. The number of regions that can be added
	is controlled via the MEM_SAFE_NUM_REGIONS kconfig option.

	This implementation requires initialization and thus consumes some boot
	time.

endchoice

config MEM_SAFE_NUM_EXTRA_REGIONS
	int
	prompt "Number of safe memory access regions to be added at runtime"
	depends on MEM_SAFE_CHECK_BOUNDARIES
	default 0
	help
	The functions available in mem_safe.h check if memory is within
	read-only or read-write regions before accessing it instead of crashing.
	The kernel image is added as a valid region automatically, but other
	regions can be added if the application makes access to additional
	memory outside of the image's boundaries.

endmenu

#
# Generic Debugging Options
#
config DEBUG_INFO
	bool "Enable system debugging information"
	default n
	depends on X86 && !X86_IAMCU
	help
	This option enables the addition of various information that can be used
	by debuggers in debugging the system.

	NOTE: Does not currently work with the x86 IAMCU ABI.

#
# GDB Server options
#

config GDB_SERVER
	bool
	prompt "Enable GDB Server [EXPERIMENTAL]"
	default n
	select CACHE_FLUSHING
	select REBOOT
	select MEM_SAFE
	select DEBUG_INFO
	select UART_CONSOLE_DEBUG_SERVER_HOOKS
	help
	This option enables the GDB Server support.

config GDB_SERVER_MAX_SW_BP
	int "Maximum number of GDB Server Software breakpoints"
	default 100
	depends on GDB_SERVER
	help
	This option specifies the maximum number of Software breakpoints

config GDB_SERVER_INTERRUPT_DRIVEN
	bool
	prompt "Enable GDB interrupt mode"
	default y
	depends on GDB_SERVER
	select CONSOLE_HANDLER
	help
	This option enables interrupt support for GDB Server.

config GDB_REMOTE_SERIAL_EXT_NOTIF_PREFIX_STR
	string
	prompt "Trigger string for remote serial ext. via notifi. packets"
	default "WrCons"
	depends on GDB_SERVER
	help
	The value of this option depends on the string the GDB client use to
	prefix the notification packets.

config GDB_SERVER_BOOTLOADER
	bool
	prompt "Enable the bootloader mode"
	default n
	depends on GDB_SERVER
	help
	This option enables the bootloader mode of the GDB Server.
