return r;
 }
 
-static int kvm_reboot(struct notifier_block *notifier, unsigned long val,
-                     void *v)
+static void kvm_shutdown(void)
 {
        /*
-        * Some (well, at least mine) BIOSes hang on reboot if
-        * in vmx root mode.
-        *
-        * And Intel TXT required VMX off for all cpu when system shutdown.
+        * Disable hardware virtualization and set kvm_rebooting to indicate
+        * that KVM has asynchronously disabled hardware virtualization, i.e.
+        * that relevant errors and exceptions aren't entirely unexpected.
+        * Some flavors of hardware virtualization need to be disabled before
+        * transferring control to firmware (to perform shutdown/reboot), e.g.
+        * on x86, virtualization can block INIT interrupts, which are used by
+        * firmware to pull APs back under firmware control.  Note, this path
+        * is used for both shutdown and reboot scenarios, i.e. neither name is
+        * 100% comprehensive.
         */
        pr_info("kvm: exiting hardware virtualization\n");
        kvm_rebooting = true;
        on_each_cpu(hardware_disable_nolock, NULL, 1);
-       return NOTIFY_OK;
 }
 
-static struct notifier_block kvm_reboot_notifier = {
-       .notifier_call = kvm_reboot,
-       .priority = 0,
-};
-
 static int kvm_suspend(void)
 {
        /*
 static struct syscore_ops kvm_syscore_ops = {
        .suspend = kvm_suspend,
        .resume = kvm_resume,
+       .shutdown = kvm_shutdown,
 };
 #else /* CONFIG_KVM_GENERIC_HARDWARE_ENABLING */
 static int hardware_enable_all(void)
        if (r)
                return r;
 
-       register_reboot_notifier(&kvm_reboot_notifier);
        register_syscore_ops(&kvm_syscore_ops);
 #endif
 
 err_vcpu_cache:
 #ifdef CONFIG_KVM_GENERIC_HARDWARE_ENABLING
        unregister_syscore_ops(&kvm_syscore_ops);
-       unregister_reboot_notifier(&kvm_reboot_notifier);
        cpuhp_remove_state_nocalls(CPUHP_AP_KVM_ONLINE);
 #endif
        return r;
        kvm_async_pf_deinit();
 #ifdef CONFIG_KVM_GENERIC_HARDWARE_ENABLING
        unregister_syscore_ops(&kvm_syscore_ops);
-       unregister_reboot_notifier(&kvm_reboot_notifier);
        cpuhp_remove_state_nocalls(CPUHP_AP_KVM_ONLINE);
 #endif
        kvm_irqfd_exit();