}
 
 /*
- * this function calls the 'stop' function on all other CPUs in the system.
+ * Disable virtualization, APIC etc. and park the CPU in a HLT loop
  */
 DEFINE_IDTENTRY_SYSVEC(sysvec_reboot)
 {
         * 2) Wait for all other CPUs to report that they reached the
         *    HLT loop in stop_this_cpu()
         *
-        * 3) If #2 timed out send an NMI to the CPUs which did not
-        *    yet report
+        * 3) If the system uses INIT/STARTUP for CPU bringup, then
+        *    send all present CPUs an INIT vector, which brings them
+        *    completely out of the way.
         *
-        * 4) Wait for all other CPUs to report that they reached the
+        * 4) If #3 is not possible and #2 timed out send an NMI to the
+        *    CPUs which did not yet report
+        *
+        * 5) Wait for all other CPUs to report that they reached the
         *    HLT loop in stop_this_cpu()
         *
-        * #3 can obviously race against a CPU reaching the HLT loop late.
+        * #4 can obviously race against a CPU reaching the HLT loop late.
         * That CPU will have reported already and the "have all CPUs
         * reached HLT" condition will be true despite the fact that the
         * other CPU is still handling the NMI. Again, there is no
                /*
                 * Don't wait longer than a second for IPI completion. The
                 * wait request is not checked here because that would
-                * prevent an NMI shutdown attempt in case that not all
+                * prevent an NMI/INIT shutdown in case that not all
                 * CPUs reach shutdown state.
                 */
                timeout = USEC_PER_SEC;
                        udelay(1);
        }
 
-       /* if the REBOOT_VECTOR didn't work, try with the NMI */
+       /*
+        * Park all other CPUs in INIT including "offline" CPUs, if
+        * possible. That's a safe place where they can't resume execution
+        * of HLT and then execute the HLT loop from overwritten text or
+        * page tables.
+        *
+        * The only downside is a broadcast MCE, but up to the point where
+        * the kexec() kernel brought all APs online again an MCE will just
+        * make HLT resume and handle the MCE. The machine crashes and burns
+        * due to overwritten text, page tables and data. So there is a
+        * choice between fire and frying pan. The result is pretty much
+        * the same. Chose frying pan until x86 provides a sane mechanism
+        * to park a CPU.
+        */
+       if (smp_park_other_cpus_in_init())
+               goto done;
+
+       /*
+        * If park with INIT was not possible and the REBOOT_VECTOR didn't
+        * take all secondary CPUs offline, try with the NMI.
+        */
        if (!cpumask_empty(&cpus_stop_mask)) {
                /*
                 * If NMI IPI is enabled, try to register the stop handler
                        udelay(1);
        }
 
+done:
        local_irq_save(flags);
        disable_local_APIC();
        mcheck_cpu_clear(this_cpu_ptr(&cpu_info));