# SPDX-License-Identifier: GPL-2.0-only

config HAVE_ARCH_KGDB
	bool

# set if architecture has the its kgdb_arch_handle_qxfer_pkt
# function to enable gdb stub to address XML packet sent from GDB.
config HAVE_ARCH_KGDB_QXFER_PKT
	bool

menuconfig KGDB
	bool "KGDB: kernel debugger"
	depends on HAVE_ARCH_KGDB
	depends on DEBUG_KERNEL
	help
	  If you say Y here, it will be possible to remotely debug the
	  kernel using gdb.  It is recommended but not required, that
	  you also turn on the kernel config option
	  CONFIG_FRAME_POINTER to aid in producing more reliable stack
	  backtraces in the external debugger.  Documentation of
	  kernel debugger is available at http://kgdb.sourceforge.net
	  as well as in Documentation/dev-tools/kgdb.rst.  If
	  unsure, say N.

if KGDB

config KGDB_HONOUR_BLOCKLIST
	bool "KGDB: use kprobe blocklist to prohibit unsafe breakpoints"
	depends on HAVE_KPROBES
	depends on MODULES
	select KPROBES
	default y
	help
	  If set to Y the debug core will use the kprobe blocklist to
	  identify symbols where it is unsafe to set breakpoints.
	  In particular this disallows instrumentation of functions
	  called during debug trap handling and thus makes it very
	  difficult to inadvertently provoke recursive trap handling.

	  If unsure, say Y.

config KGDB_SERIAL_CONSOLE
	tristate "KGDB: use kgdb over the serial console"
	select CONSOLE_POLL
	select MAGIC_SYSRQ
	depends on TTY && HW_CONSOLE
	default y
	help
	  Share a serial console with kgdb. Sysrq-g must be used
	  to break in initially.

config KGDB_TESTS
	bool "KGDB: internal test suite"
	default n
	help
	  This is a kgdb I/O module specifically designed to test
	  kgdb's internal functions.  This kgdb I/O module is
	  intended to for the development of new kgdb stubs
	  as well as regression testing the kgdb internals.
	  See the drivers/misc/kgdbts.c for the details about
	  the tests.  The most basic of this I/O module is to boot
	  a kernel boot arguments "kgdbwait kgdbts=V1F100"

config KGDB_TESTS_ON_BOOT
	bool "KGDB: Run tests on boot"
	depends on KGDB_TESTS
	default n
	help
	  Run the kgdb tests on boot up automatically without the need
	  to pass in a kernel parameter

config KGDB_TESTS_BOOT_STRING
	string "KGDB: which internal kgdb tests to run"
	depends on KGDB_TESTS_ON_BOOT
	default "V1F100"
	help
	  This is the command string to send the kgdb test suite on
	  boot.  See the drivers/misc/kgdbts.c for detailed
	  information about other strings you could use beyond the
	  default of V1F100.

config KGDB_LOW_LEVEL_TRAP
       bool "KGDB: Allow debugging with traps in notifiers"
       depends on X86 || MIPS
       default n
       help
	 This will add an extra call back to kgdb for the breakpoint
	 exception handler which will allow kgdb to step through a
	 notify handler.

config KGDB_KDB
	bool "KGDB_KDB: include kdb frontend for kgdb"
	default n
	help
	  KDB frontend for kernel

config KDB_DEFAULT_ENABLE
	hex "KDB: Select kdb command functions to be enabled by default"
	depends on KGDB_KDB
	default 0x1
	help
	  Specifiers which kdb commands are enabled by default. This may
	  be set to 1 or 0 to enable all commands or disable almost all
	  commands.

	  Alternatively the following bitmask applies:

	    0x0002 - allow arbitrary reads from memory and symbol lookup
	    0x0004 - allow arbitrary writes to memory
	    0x0008 - allow current register state to be inspected
	    0x0010 - allow current register state to be modified
	    0x0020 - allow passive inspection (backtrace, process list, lsmod)
	    0x0040 - allow flow control management (breakpoint, single step)
	    0x0080 - enable signalling of processes
	    0x0100 - allow machine to be rebooted

	  The config option merely sets the default at boot time. Both
	  issuing 'echo X > /sys/module/kdb/parameters/cmd_enable' or
	  setting with kdb.cmd_enable=X kernel command line option will
	  override the default settings.

config KDB_KEYBOARD
	bool "KGDB_KDB: keyboard as input device"
	depends on VT && KGDB_KDB && !PARISC
	default n
	help
	  KDB can use a PS/2 type keyboard for an input device

config KDB_CONTINUE_CATASTROPHIC
	int "KDB: continue after catastrophic errors"
	depends on KGDB_KDB
	default "0"
	help
	  This integer controls the behaviour of kdb when the kernel gets a
	  catastrophic error, i.e. for a panic or oops.
	  When KDB is active and a catastrophic error occurs, nothing extra
	  will happen until you type 'go'.
	  CONFIG_KDB_CONTINUE_CATASTROPHIC == 0 (default). The first time
	  you type 'go', you will be warned by kdb. The secend time you type
	  'go', KDB tries to continue. No guarantees that the
	  kernel is still usable in this situation.
	  CONFIG_KDB_CONTINUE_CATASTROPHIC == 1. KDB tries to continue.
	  No guarantees that the kernel is still usable in this situation.
	  CONFIG_KDB_CONTINUE_CATASTROPHIC == 2. KDB forces a reboot.
	  If you are not sure, say 0.

config ARCH_HAS_EARLY_DEBUG
	bool
	default n
	help
	  If an architecture can definitely handle entering the debugger
	  when early_param's are parsed then it select this config.
	  Otherwise, if "kgdbwait" is passed on the kernel command line it
	  won't actually be processed until dbg_late_init() just after the
	  call to kgdb_arch_late() is made.

	  NOTE: Even if this isn't selected by an architecture we will
	  still try to register kgdb to handle breakpoints and crashes
	  when early_param's are parsed, we just won't act on the
	  "kgdbwait" parameter until dbg_late_init().  If you get a
	  crash and try to drop into kgdb somewhere between these two
	  places you might or might not end up being able to use kgdb
	  depending on exactly how far along the architecture has initted.

endif # KGDB
