aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitchell Horne <mhorne@FreeBSD.org>2023-01-07 18:09:28 +0000
committerMitchell Horne <mhorne@FreeBSD.org>2023-01-23 19:10:24 +0000
commit5644850620aead7c257a4e3040e20201b510f499 (patch)
treebae05380fbcfe13cd5db9e9f1eeaa397ef09e2df
parent627ca221c311b5d9c4132e03664a96f390ff5c0d (diff)
-rw-r--r--share/man/man4/ddb.414
-rw-r--r--sys/ddb/db_command.c14
2 files changed, 25 insertions, 3 deletions
diff --git a/share/man/man4/ddb.4 b/share/man/man4/ddb.4
index 7d5da91fc684..7173da4eb447 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 0ddbf5f49629..02f79ca949c2 100644
--- a/sys/ddb/db_command.c
+++ b/sys/ddb/db_command.c
@@ -745,7 +745,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;
@@ -770,6 +770,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();
}