aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitchell Horne <mhorne@FreeBSD.org>2023-11-23 15:27:20 +0000
committerMitchell Horne <mhorne@FreeBSD.org>2023-11-23 16:07:42 +0000
commit9e0b0f5de67fd46bddf0e12ef7b71d76a7ec1667 (patch)
tree3af352d7014e6eb87c706481ae6bdd220d9ab8cf
parent2ce1c45b3411410a5d0a4d08198a3b0010d493b7 (diff)
downloadsrc-9e0b0f5de67fd46bddf0e12ef7b71d76a7ec1667.tar.gz
src-9e0b0f5de67fd46bddf0e12ef7b71d76a7ec1667.zip
xen: improve shutdown hook
Make better use of the shutdown flags. In particular this now handles standard reboot where RB_POWERCYCLE is not set, and indicates a crash when the system has panicked. While here, give the function a prefix. Reviewed by: royger, markj MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D42343
-rw-r--r--sys/dev/xen/control/control.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/sys/dev/xen/control/control.c b/sys/dev/xen/control/control.c
index 9ea0222809a0..37b4bff709c7 100644
--- a/sys/dev/xen/control/control.c
+++ b/sys/dev/xen/control/control.c
@@ -345,12 +345,18 @@ xctrl_crash(void)
}
static void
-shutdown_final(void *arg, int howto)
+xctrl_shutdown_final(void *arg, int howto)
{
- /* Inform the hypervisor that shutdown is complete. */
- if (howto & RB_POWEROFF)
+ /*
+ * Inform the hypervisor that shutdown is complete, and specify the
+ * nature of the shutdown. RB_HALT is not handled by this function.
+ */
+ if (KERNEL_PANICKED())
+ HYPERVISOR_shutdown(SHUTDOWN_crash);
+ else if ((howto & RB_POWEROFF) != 0)
HYPERVISOR_shutdown(SHUTDOWN_poweroff);
- else if (howto & RB_POWERCYCLE)
+ else if ((howto & RB_HALT) == 0)
+ /* RB_POWERCYCLE or regular reset. */
HYPERVISOR_shutdown(SHUTDOWN_reboot);
}
@@ -446,7 +452,7 @@ xctrl_attach(device_t dev)
xctrl->xctrl_watch.max_pending = 1;
xs_register_watch(&xctrl->xctrl_watch);
- EVENTHANDLER_REGISTER(shutdown_final, shutdown_final, NULL,
+ EVENTHANDLER_REGISTER(shutdown_final, xctrl_shutdown_final, NULL,
SHUTDOWN_PRI_LAST);
return (0);