# 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 && VT
	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
