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. */
