|
@@ -36,22 +36,6 @@ void (*pm_power_off)(void);
|
|
|
EXPORT_SYMBOL(pm_power_off);
|
|
|
|
|
|
static const struct desc_ptr no_idt = {};
|
|
|
-static enum reboot_mode reboot_mode;
|
|
|
-enum reboot_type reboot_type = BOOT_ACPI;
|
|
|
-int reboot_force;
|
|
|
-
|
|
|
-/*
|
|
|
- * This variable is used privately to keep track of whether or not
|
|
|
- * reboot_type is still set to its default value (i.e., reboot= hasn't
|
|
|
- * been set on the command line). This is needed so that we can
|
|
|
- * suppress DMI scanning for reboot quirks. Without it, it's
|
|
|
- * impossible to override a faulty reboot quirk without recompiling.
|
|
|
- */
|
|
|
-static int reboot_default = 1;
|
|
|
-
|
|
|
-#ifdef CONFIG_SMP
|
|
|
-static int reboot_cpu = -1;
|
|
|
-#endif
|
|
|
|
|
|
/*
|
|
|
* This is set if we need to go through the 'emergency' path.
|
|
@@ -63,79 +47,6 @@ static int reboot_emergency;
|
|
|
/* This is set by the PCI code if either type 1 or type 2 PCI is detected */
|
|
|
bool port_cf9_safe = false;
|
|
|
|
|
|
-/*
|
|
|
- * reboot=b[ios] | s[mp] | t[riple] | k[bd] | e[fi] [, [w]arm | [c]old] | p[ci]
|
|
|
- * warm Don't set the cold reboot flag
|
|
|
- * cold Set the cold reboot flag
|
|
|
- * bios Reboot by jumping through the BIOS
|
|
|
- * smp Reboot by executing reset on BSP or other CPU
|
|
|
- * triple Force a triple fault (init)
|
|
|
- * kbd Use the keyboard controller. cold reset (default)
|
|
|
- * acpi Use the RESET_REG in the FADT
|
|
|
- * efi Use efi reset_system runtime service
|
|
|
- * pci Use the so-called "PCI reset register", CF9
|
|
|
- * force Avoid anything that could hang.
|
|
|
- */
|
|
|
-static int __init reboot_setup(char *str)
|
|
|
-{
|
|
|
- for (;;) {
|
|
|
- /*
|
|
|
- * Having anything passed on the command line via
|
|
|
- * reboot= will cause us to disable DMI checking
|
|
|
- * below.
|
|
|
- */
|
|
|
- reboot_default = 0;
|
|
|
-
|
|
|
- switch (*str) {
|
|
|
- case 'w':
|
|
|
- reboot_mode = REBOOT_WARM;
|
|
|
- break;
|
|
|
-
|
|
|
- case 'c':
|
|
|
- reboot_mode = REBOOT_COLD;
|
|
|
- break;
|
|
|
-
|
|
|
-#ifdef CONFIG_SMP
|
|
|
- case 's':
|
|
|
- if (isdigit(*(str+1))) {
|
|
|
- reboot_cpu = (int) (*(str+1) - '0');
|
|
|
- if (isdigit(*(str+2)))
|
|
|
- reboot_cpu = reboot_cpu*10 + (int)(*(str+2) - '0');
|
|
|
- }
|
|
|
- /*
|
|
|
- * We will leave sorting out the final value
|
|
|
- * when we are ready to reboot, since we might not
|
|
|
- * have detected BSP APIC ID or smp_num_cpu
|
|
|
- */
|
|
|
- break;
|
|
|
-#endif /* CONFIG_SMP */
|
|
|
-
|
|
|
- case 'b':
|
|
|
- case 'a':
|
|
|
- case 'k':
|
|
|
- case 't':
|
|
|
- case 'e':
|
|
|
- case 'p':
|
|
|
- reboot_type = *str;
|
|
|
- break;
|
|
|
-
|
|
|
- case 'f':
|
|
|
- reboot_force = 1;
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- str = strchr(str, ',');
|
|
|
- if (str)
|
|
|
- str++;
|
|
|
- else
|
|
|
- break;
|
|
|
- }
|
|
|
- return 1;
|
|
|
-}
|
|
|
-
|
|
|
-__setup("reboot=", reboot_setup);
|
|
|
-
|
|
|
-
|
|
|
/*
|
|
|
* Reboot options and system auto-detection code provided by
|
|
|
* Dell Inc. so their systems "just work". :-)
|
|
@@ -616,26 +527,10 @@ void native_machine_shutdown(void)
|
|
|
{
|
|
|
/* Stop the cpus and apics */
|
|
|
#ifdef CONFIG_SMP
|
|
|
-
|
|
|
- /* The boot cpu is always logical cpu 0 */
|
|
|
- int reboot_cpu_id = 0;
|
|
|
-
|
|
|
- /* See if there has been given a command line override */
|
|
|
- if ((reboot_cpu != -1) && (reboot_cpu < nr_cpu_ids) &&
|
|
|
- cpu_online(reboot_cpu))
|
|
|
- reboot_cpu_id = reboot_cpu;
|
|
|
-
|
|
|
- /* Make certain the cpu I'm about to reboot on is online */
|
|
|
- if (!cpu_online(reboot_cpu_id))
|
|
|
- reboot_cpu_id = smp_processor_id();
|
|
|
-
|
|
|
- /* Make certain I only run on the appropriate processor */
|
|
|
- set_cpus_allowed_ptr(current, cpumask_of(reboot_cpu_id));
|
|
|
-
|
|
|
/*
|
|
|
- * O.K Now that I'm on the appropriate processor, stop all of the
|
|
|
- * others. Also disable the local irq to not receive the per-cpu
|
|
|
- * timer interrupt which may trigger scheduler's load balance.
|
|
|
+ * Stop all of the others. Also disable the local irq to
|
|
|
+ * not receive the per-cpu timer interrupt which may trigger
|
|
|
+ * scheduler's load balance.
|
|
|
*/
|
|
|
local_irq_disable();
|
|
|
stop_other_cpus();
|