Skip to content

Commit

Permalink
Merge branch 'x86-reboot-for-linus' of git://git.kernel.org/pub/scm/l…
Browse files Browse the repository at this point in the history
…inux/kernel/git/tip/tip

Pull x86 reboot changes from Ingo Molnar:
 "Refine the reboot logic around the CF9 and EFI reboot methods, to make
  it more robust.  The expectation is for no working system to break,
  and for a couple of reboot-force systems to start rebooting
  automatically again"

* 'x86-reboot-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86, reboot: Only use CF9_COND automatically, not CF9
  x86, reboot: Add EFI and CF9 reboot methods into the default list
  • Loading branch information
torvalds committed Apr 1, 2014
2 parents 1694f0b + fb3bd7b commit 4b2ce8f
Showing 1 changed file with 10 additions and 5 deletions.
15 changes: 10 additions & 5 deletions arch/x86/kernel/reboot.c
Original file line number Diff line number Diff line change
Expand Up @@ -464,9 +464,12 @@ void __attribute__((weak)) mach_reboot_fixups(void)
* 2) If still alive, write to the keyboard controller
* 3) If still alive, write to the ACPI reboot register again
* 4) If still alive, write to the keyboard controller again
* 5) If still alive, call the EFI runtime service to reboot
* 6) If still alive, write to the PCI IO port 0xCF9 to reboot
* 7) If still alive, inform BIOS to do a proper reboot
*
* If the machine is still alive at this stage, it gives up. We default to
* following the same pattern, except that if we're still alive after (4) we'll
* following the same pattern, except that if we're still alive after (7) we'll
* try to force a triple fault and then cycle between hitting the keyboard
* controller and doing that
*/
Expand Down Expand Up @@ -502,21 +505,23 @@ static void native_machine_emergency_restart(void)
attempt = 1;
reboot_type = BOOT_ACPI;
} else {
reboot_type = BOOT_TRIPLE;
reboot_type = BOOT_EFI;
}
break;

case BOOT_TRIPLE:
load_idt(&no_idt);
__asm__ __volatile__("int3");

/* We're probably dead after this, but... */
reboot_type = BOOT_KBD;
break;

case BOOT_BIOS:
machine_real_restart(MRR_BIOS);

reboot_type = BOOT_KBD;
/* We're probably dead after this, but... */
reboot_type = BOOT_TRIPLE;
break;

case BOOT_ACPI:
Expand All @@ -530,7 +535,7 @@ static void native_machine_emergency_restart(void)
EFI_RESET_WARM :
EFI_RESET_COLD,
EFI_SUCCESS, 0, NULL);
reboot_type = BOOT_KBD;
reboot_type = BOOT_CF9_COND;
break;

case BOOT_CF9:
Expand All @@ -548,7 +553,7 @@ static void native_machine_emergency_restart(void)
outb(cf9|reboot_code, 0xcf9);
udelay(50);
}
reboot_type = BOOT_KBD;
reboot_type = BOOT_BIOS;
break;
}
}
Expand Down

0 comments on commit 4b2ce8f

Please sign in to comment.