# 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
	depends on HAS_IOPORT
	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
