[PATCH] debug: Allow forcing entering debug mode on panic/exception

From: Douglas Anderson
Date: Sun Dec 09 2018 - 21:45:03 EST


Ever since commit 5516fd7b92a7 ("debug: prevent entering debug mode on
panic/exception.") (yes, years ago) my kgdb workflow has been broken.
On Chrome OS we have 'kernel.panic = -1' in
'/etc/sysctl.d/00-sysctl.conf'. That means that when userspace starts
up it will tell the kernel "please reboot on panic". ...and so when I
get a panic then the system reboots instead of letting me debug it.

While I could go in an change the 'sysctl.conf' and I could go in and
hack the kernel myself, these things are inconvenient. I either need
to keep a private kernel patch or or remember to edit a file every
time I install an updated version of Chrome OS. What is convenient
(for me) is to have a CONFIG option that makes kgdb override the panic
request. This is because the Chrome OS build system makes it very
easy for me to add some extra CONFIG "fragments" to my debug kernels.

Hopefully having this extra config option is OK and useful to others
who would also prefer to make sure that kgdb is always entered on a
panic no matter what userspace might request.

Signed-off-by: Douglas Anderson <dianders@xxxxxxxxxxxx>
---

kernel/debug/debug_core.c | 5 +++--
lib/Kconfig.kgdb | 10 ++++++++++
2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/kernel/debug/debug_core.c b/kernel/debug/debug_core.c
index 65c0f1363788..d4a38543fcdd 100644
--- a/kernel/debug/debug_core.c
+++ b/kernel/debug/debug_core.c
@@ -703,7 +703,8 @@ kgdb_handle_exception(int evector, int signo, int ecode, struct pt_regs *regs)
* reboot on panic. We don't want to get stuck waiting for input
* on such systems, especially if its "just" an oops.
*/
- if (signo != SIGTRAP && panic_timeout)
+ if (!IS_ENABLED(CONFIG_KGDB_ALWAYS_ENTER_ON_PANIC) &&
+ signo != SIGTRAP && panic_timeout)
return 1;

memset(ks, 0, sizeof(struct kgdb_state));
@@ -843,7 +844,7 @@ static int kgdb_panic_event(struct notifier_block *self,
* panic_timeout indicates the system should automatically
* reboot on panic.
*/
- if (panic_timeout)
+ if (!IS_ENABLED(CONFIG_KGDB_ALWAYS_ENTER_ON_PANIC) && panic_timeout)
return NOTIFY_DONE;

if (dbg_kdb_mode)
diff --git a/lib/Kconfig.kgdb b/lib/Kconfig.kgdb
index ab4ff0eea776..f12c6e1394c6 100644
--- a/lib/Kconfig.kgdb
+++ b/lib/Kconfig.kgdb
@@ -67,6 +67,16 @@ config KGDB_LOW_LEVEL_TRAP
exception handler which will allow kgdb to step through a
notify handler.

+config KGDB_ALWAYS_ENTER_ON_PANIC
+ bool "KGDB: Enter kgdb on panic even if reboot specified"
+ default n
+ help
+ If kgdb is enabled and the system is configured to reboot on
+ panic then there's a question of whether we should drop into
+ kgdb on panic or whether we should reboot on panic. If you
+ say yes here then we'll enter kgdb. If you say no here then
+ we'll reboot.
+
config KGDB_KDB
bool "KGDB_KDB: include kdb frontend for kgdb"
default n
--
2.20.0.rc2.403.gdbc3b29805-goog