[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XEN PATCH] Create a Kconfig option to set preferred reboot method
This patch provides the option to compile in a preferred reboot method, as an alternative to specifying it on the Xen command line. It uses the same internals as the command line 'reboot' parameter, and will be overridden by a choice on the command line. I have referred to this as 'reboot method' rather than 'reboot type' as used in the code. A 'type' suggests something to happen after the reboot, akin to a UNIX run level, whereas 'method' clearly identifies how the reboot will be achieved. I thought it best for this to be clear in an outward facing utility. Signed-off-by: Per Bilse <per.bilse@xxxxxxxxxx> --- xen/arch/x86/Kconfig | 95 +++++++++++++++++++++++++++++++++++++++++ xen/arch/x86/shutdown.c | 11 +++++ 2 files changed, 106 insertions(+) diff --git a/xen/arch/x86/Kconfig b/xen/arch/x86/Kconfig index 6a7825f4ba..d35b14aa17 100644 --- a/xen/arch/x86/Kconfig +++ b/xen/arch/x86/Kconfig @@ -306,6 +306,101 @@ config MEM_SHARING bool "Xen memory sharing support (UNSUPPORTED)" if UNSUPPORTED depends on HVM +config REBOOT_SYSTEM_DEFAULT + default y + bool "Xen-defined reboot method" + help + Xen will choose the most appropriate reboot method, + which will be EFI, ACPI, or by way of the keyboard + controller, depending on system features. Disabling + this will allow you to choose exactly how the system + will be rebooted. + +choice + bool "Choose reboot method" + depends on !REBOOT_SYSTEM_DEFAULT + default REBOOT_METHOD_ACPI + help + This is a compiled-in alternative to specifying the + reboot method on the Xen command line. Specifying a + method on the command line will override this choice. + + warm Don't set the cold reboot flag + cold Set the cold reboot flag + none Suppress automatic reboot after panics or crashes + triple Force a triple fault (init) + kbd Use the keyboard controller, cold reset + acpi Use the RESET_REG in the FADT + pci Use the so-called "PCI reset register", CF9 + power Like 'pci' but for a full power-cyle reset + efi Use the EFI reboot (if running under EFI) + xen Use Xen SCHEDOP hypercall (if running under Xen as a guest) + + config REBOOT_METHOD_WARM + bool "warm" + help + Don't set the cold reboot flag. + + config REBOOT_METHOD_COLD + bool "cold" + help + Set the cold reboot flag. + + config REBOOT_METHOD_NONE + bool "none" + help + Suppress automatic reboot after panics or crashes. + + config REBOOT_METHOD_TRIPLE + bool "triple" + help + Force a triple fault (init). + + config REBOOT_METHOD_KBD + bool "kbd" + help + Use the keyboard controller, cold reset. + + config REBOOT_METHOD_ACPI + bool "acpi" + help + Use the RESET_REG in the FADT. + + config REBOOT_METHOD_PCI + bool "pci" + help + Use the so-called "PCI reset register", CF9. + + config REBOOT_METHOD_POWER + bool "power" + help + Like 'pci' but for a full power-cyle reset. + + config REBOOT_METHOD_EFI + bool "efi" + help + Use the EFI reboot (if running under EFI). + + config REBOOT_METHOD_XEN + bool "xen" + help + Use Xen SCHEDOP hypercall (if running under Xen as a guest). + +endchoice + +config REBOOT_METHOD + string + default "w" if REBOOT_METHOD_WARM + default "c" if REBOOT_METHOD_COLD + default "n" if REBOOT_METHOD_NONE + default "t" if REBOOT_METHOD_TRIPLE + default "k" if REBOOT_METHOD_KBD + default "a" if REBOOT_METHOD_ACPI + default "p" if REBOOT_METHOD_PCI + default "P" if REBOOT_METHOD_POWER + default "e" if REBOOT_METHOD_EFI + default "x" if REBOOT_METHOD_XEN + endmenu source "common/Kconfig" diff --git a/xen/arch/x86/shutdown.c b/xen/arch/x86/shutdown.c index 7619544d14..f44a188e2a 100644 --- a/xen/arch/x86/shutdown.c +++ b/xen/arch/x86/shutdown.c @@ -28,6 +28,7 @@ #include <asm/apic.h> #include <asm/guest.h> +/* NOTE: these constants are duplicated in arch/x86/Kconfig; keep in synch */ enum reboot_type { BOOT_INVALID, BOOT_TRIPLE = 't', @@ -143,6 +144,8 @@ void machine_halt(void) __machine_halt(NULL); } +#ifdef CONFIG_REBOOT_SYSTEM_DEFAULT + static void default_reboot_type(void) { if ( reboot_type != BOOT_INVALID ) @@ -533,6 +536,8 @@ static const struct dmi_system_id __initconstrel reboot_dmi_table[] = { { } }; +#endif /* CONFIG_REBOOT_SYSTEM_DEFAULT */ + static int __init cf_check reboot_init(void) { /* @@ -542,8 +547,12 @@ static int __init cf_check reboot_init(void) if ( reboot_type != BOOT_INVALID ) return 0; +#ifdef CONFIG_REBOOT_SYSTEM_DEFAULT default_reboot_type(); dmi_check_system(reboot_dmi_table); +#else + set_reboot_type(CONFIG_REBOOT_METHOD); +#endif return 0; } __initcall(reboot_init); @@ -595,8 +604,10 @@ void machine_restart(unsigned int delay_millisecs) tboot_shutdown(TB_SHUTDOWN_REBOOT); } +#ifdef CONFIG_REBOOT_SYSTEM_DEFAULT /* Just in case reboot_init() didn't run yet. */ default_reboot_type(); +#endif orig_reboot_type = reboot_type; /* Rebooting needs to touch the page at absolute address 0. */ -- 2.31.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |