This places a sentinel value at the lowest 4 bytes of a stack memory region and checks it at various intervals, including when servicing interrupts or context switching. This is implemented on all arches except ARC, which supports stack bounds checking directly in hardware. Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
278 lines
7.9 KiB
Plaintext
278 lines
7.9 KiB
Plaintext
# Kconfig - debug configuration options
|
|
|
|
#
|
|
# Copyright (c) 2015 Wind River Systems, Inc.
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
|
|
menu "Debugging Options"
|
|
|
|
config DEBUG
|
|
bool "Build kernel with debugging enabled"
|
|
default n
|
|
help
|
|
Build a kernel suitable for debugging. Right now, this option
|
|
only disables optimization, more debugging variants can be selected
|
|
from here to allow more debugging.
|
|
|
|
config STACK_USAGE
|
|
bool "Generate stack usage information"
|
|
default n
|
|
help
|
|
Generate an extra file that specifies the maximum amount of stack used,
|
|
on a per-function basis.
|
|
|
|
config STACK_SENTINEL
|
|
bool "Enable stack sentinel"
|
|
select THREAD_STACK_INFO
|
|
default n
|
|
help
|
|
Store a magic value at the lowest addresses of a thread's stack.
|
|
Periodically check that this value is still present and kill the
|
|
thread gracefully if it isn't. This is currently checked in four
|
|
places:
|
|
|
|
1) Upon any context switch for the outgoing thread
|
|
2) Any hardware interrupt that doesn't context switch, the check is
|
|
performed for the interrupted thread
|
|
3) When a thread returns from its entry point
|
|
4) When a thread calls k_yield() but doesn't context switch
|
|
|
|
This feature doesn't prevent corruption and the system may be
|
|
in an unusable state. However, given the bizarre behavior associated
|
|
with stack overflows, knowledge that this is happening is very
|
|
useful.
|
|
|
|
This feature is intended for those systems which lack hardware support
|
|
for stack overflow protection, or have insufficient system resources
|
|
to use that hardware support.
|
|
|
|
config PRINTK
|
|
bool
|
|
prompt "Send printk() to console"
|
|
depends on CONSOLE_HAS_DRIVER
|
|
default y
|
|
help
|
|
This option directs printk() debugging output to the supported
|
|
console device, rather than suppressing the generation
|
|
of printk() output entirely. Output is sent immediately, without
|
|
any mutual exclusion or buffering.
|
|
|
|
config STDOUT_CONSOLE
|
|
bool
|
|
prompt "Send stdout to console"
|
|
depends on CONSOLE_HAS_DRIVER
|
|
default n
|
|
help
|
|
This option directs standard output (e.g. printf) to the console
|
|
device, rather than suppressing it entirely.
|
|
|
|
config EARLY_CONSOLE
|
|
bool
|
|
prompt "Send stdout at the earliest stage possible"
|
|
default n
|
|
help
|
|
This option will enable stdout as early as possible, for debugging
|
|
purpose. For instance, in case of STDOUT_CONSOLE being set it will
|
|
initialize its driver earlier than normal, in order to get the stdout
|
|
sent through the console at the earliest stage possible.
|
|
|
|
config ASSERT
|
|
bool
|
|
prompt "Enable __ASSERT() macro"
|
|
default n
|
|
help
|
|
This enables the __ASSERT() macro in the kernel code. If an assertion
|
|
fails, the calling thread is put on an infinite tight loop. Since
|
|
enabling this adds a significant footprint, it should only be enabled
|
|
in a non-production system.
|
|
|
|
config ASSERT_LEVEL
|
|
int
|
|
prompt "__ASSERT() level"
|
|
default 2
|
|
range 0 2
|
|
depends on ASSERT
|
|
help
|
|
This option specifies the assertion level used by the __ASSERT()
|
|
macro. It can be set to one of three possible values:
|
|
|
|
Level 0: off
|
|
Level 1: on + warning in every file that includes __assert.h
|
|
Level 2: on + no warning
|
|
|
|
config DEBUG_TRACING_KERNEL_OBJECTS
|
|
bool "Kernel object tracing (deprecated)"
|
|
select OBJECT_TRACING
|
|
default n
|
|
help
|
|
For backward compatibility only
|
|
|
|
config OBJECT_TRACING
|
|
bool
|
|
prompt "Kernel object tracing"
|
|
default n
|
|
help
|
|
This option enable the feature for tracing kernel objects. This option
|
|
is for debug purposes and increases the memory footprint of the kernel.
|
|
|
|
config OVERRIDE_FRAME_POINTER_DEFAULT
|
|
bool
|
|
prompt "Override compiler defaults for -fomit-frame-pointer"
|
|
default n
|
|
help
|
|
Omitting the frame pointer prevents the compiler from putting the stack
|
|
frame pointer into a register. Saves a few instructions in function
|
|
prologues/epilogues and frees up a register for general-purpose use,
|
|
which can provide good performance improvements on register-constrained
|
|
architectures like x86. On some architectures (including x86) omitting
|
|
frame pointers impedes debugging as local variables are harder to
|
|
locate. At -O1 and above gcc will enable -fomit-frame-pointer
|
|
automatically but only if the architecture does not require if for
|
|
effective debugging.
|
|
|
|
Choose Y if you want to override the default frame pointer behavior
|
|
of your compiler, otherwise choose N.
|
|
|
|
config OMIT_FRAME_POINTER
|
|
bool
|
|
prompt "Omit frame pointer"
|
|
default n
|
|
depends on OVERRIDE_FRAME_POINTER_DEFAULT
|
|
help
|
|
Choose Y for best performance. On some architectures (including x86)
|
|
this will favor code size and performance over debugability.
|
|
|
|
Choose N in you wish to retain the frame pointer. This option may
|
|
be useful if your application uses runtime backtracing and does not
|
|
support parsing unwind tables.
|
|
|
|
If unsure, disable OVERRIDE_FRAME_POINTER_DEFAULT to allow the compiler
|
|
to adopt sensible defaults for your architecture.
|
|
|
|
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_EXTRA_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
|
|
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.
|
|
|
|
#
|
|
# Miscellaneous debugging options
|
|
#
|
|
|
|
config OPENOCD_SUPPORT
|
|
bool
|
|
prompt "OpenOCD support [EXPERIMENTAL]"
|
|
default n
|
|
select THREAD_MONITOR
|
|
help
|
|
This option exports an array of offsets to kernel structs, used by
|
|
OpenOCD to determine the state of running threads. (This option
|
|
selects CONFIG_THREAD_MONITOR, so all of its caveats are implied.)
|
|
|
|
endmenu
|