git: f0e49ab720d3 - stable/13 - ddb: have 'reset' command use normal reboot path

From: Mitchell Horne <mhorne_at_FreeBSD.org>
Date: Mon, 06 Feb 2023 19:36:58 UTC
The branch stable/13 has been updated by mhorne:

URL: https://cgit.FreeBSD.org/src/commit/?id=f0e49ab720d3bc71f82dc1e73db4047f3a03defb

commit f0e49ab720d3bc71f82dc1e73db4047f3a03defb
Author:     Mitchell Horne <mhorne@FreeBSD.org>
AuthorDate: 2023-01-07 18:09:28 +0000
Commit:     Mitchell Horne <mhorne@FreeBSD.org>
CommitDate: 2023-02-06 19:34:37 +0000

    ddb: have 'reset' command use normal reboot path
    
    This conditionally gives all registered shutdown handlers a chance to
    perform the reboot, with cpu_reset() being the fallback. The '\s'
    modifier can be used with the command to get the previous behaviour.
    
    The motivation is that some platforms may not be able do anything
    meaningful via cpu_reset(), due to a lack of standardized reset
    mechanism and/or firmware shortcomings. However, they may have a
    separate device driver attached that normally performs the reboot. Such
    is the case for some versions of the Raspberry Pi, where reset via PSCI
    fails, but the BCM2835 watchdog driver has a shutdown hook.
    
    Reported by:    bz
    Reviewed by:    markj (slightly earlier version)
    MFC after:      2 weeks
    Differential Revision:  https://reviews.freebsd.org/D37981
    
    (cherry picked from commit 5644850620aead7c257a4e3040e20201b510f499)
---
 share/man/man4/ddb.4 | 14 ++++++++++++--
 sys/ddb/db_command.c | 14 +++++++++++++-
 2 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/share/man/man4/ddb.4 b/share/man/man4/ddb.4
index db5b59f4e8f0..8ef78cc8b156 100644
--- a/share/man/man4/ddb.4
+++ b/share/man/man4/ddb.4
@@ -524,13 +524,23 @@ The optional
 argument limits the search.
 .\"
 .Pp
-.It Ic reboot Op Ar seconds
-.It Ic reset Op Ar seconds
+.It Xo
+.Ic Ic reboot Ns Op Li / Ns Cm s
+.Op Ar seconds
+.Xc
+.It Xo
+.Ic Ic reset Ns Op Li / Ns Cm s
+.Op Ar seconds
+.Xc
 Hard reset the system.
 If the optional argument
 .Ar seconds
 is given, the debugger will wait for this long, at most a week,
 before rebooting.
+When the
+.Cm s
+modifier is given, the command will skip running any registered shutdown
+handlers and attempt the most basic reset.
 .Pp
 .It Ic thread Ar addr | tid
 Switch the debugger to the thread with ID
diff --git a/sys/ddb/db_command.c b/sys/ddb/db_command.c
index 28c7faee670b..ae983c46df8d 100644
--- a/sys/ddb/db_command.c
+++ b/sys/ddb/db_command.c
@@ -729,7 +729,7 @@ out:
 
 static void
 db_reset(db_expr_t addr, bool have_addr, db_expr_t count __unused,
-    char *modif __unused)
+    char *modif)
 {
 	int delay, loop;
 
@@ -754,6 +754,18 @@ db_reset(db_expr_t addr, bool have_addr, db_expr_t count __unused,
 		}
 	}
 
+	/*
+	 * Conditionally try the standard reboot path, so any registered
+	 * shutdown/reset handlers have a chance to run first. Some platforms
+	 * may not support the machine-dependent mechanism used by cpu_reset()
+	 * and rely on some other non-standard mechanism to perform the reset.
+	 * For example, the BCM2835 watchdog driver or gpio-poweroff driver.
+	 */
+	if (modif[0] != 's') {
+		kern_reboot(RB_NOSYNC);
+		/* NOTREACHED */
+	}
+
 	cpu_reset();
 }