If the helper is defined, it is called instead of halt() to stop the CPU at the
end of stop_this_cpu() and on crash CPU shutdown.
ACPI MADT will use it to hand over the CPU to BIOS in order to be able to wake
it up again after kexec.
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Kai Huang <kai.huang@intel.com>
Tested-by: Tao Liu <ltao@redhat.com>
Link: https://lore.kernel.org/r/20240614095904.1345461-17-kirill.shutemov@linux.intel.com
        int (*cpu_disable)(void);
        void (*cpu_die)(unsigned int cpu);
        void (*play_dead)(void);
+       void (*stop_this_cpu)(void);
 
        void (*send_call_func_ipi)(const struct cpumask *mask);
        void (*send_call_func_single_ipi)(int cpu);
 
         */
        cpumask_clear_cpu(cpu, &cpus_stop_mask);
 
+#ifdef CONFIG_SMP
+       if (smp_ops.stop_this_cpu) {
+               smp_ops.stop_this_cpu();
+               unreachable();
+       }
+#endif
+
        for (;;) {
                /*
                 * Use native_halt() so that memory contents don't change
 
        cpu_emergency_disable_virtualization();
 
        atomic_dec(&waiting_for_crash_ipi);
+
+       if (smp_ops.stop_this_cpu) {
+               smp_ops.stop_this_cpu();
+               unreachable();
+       }
+
        /* Assume hlt works */
        halt();
        for (;;)