diff options
author | Mitchell Horne <mhorne@FreeBSD.org> | 2023-11-23 15:27:20 +0000 |
---|---|---|
committer | Mitchell Horne <mhorne@FreeBSD.org> | 2023-11-23 16:07:42 +0000 |
commit | 9e0b0f5de67fd46bddf0e12ef7b71d76a7ec1667 (patch) | |
tree | 3af352d7014e6eb87c706481ae6bdd220d9ab8cf | |
parent | 2ce1c45b3411410a5d0a4d08198a3b0010d493b7 (diff) | |
download | src-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.c | 16 |
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); |