1*b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 2a52482d9SVitaly Kuznetsov #include <asm/smp.h> 3a52482d9SVitaly Kuznetsov 484d582d2SBoris Ostrovsky #include <xen/events.h> 584d582d2SBoris Ostrovsky 6a52482d9SVitaly Kuznetsov #include "xen-ops.h" 7a52482d9SVitaly Kuznetsov #include "smp.h" 8a52482d9SVitaly Kuznetsov 9a52482d9SVitaly Kuznetsov 10a52482d9SVitaly Kuznetsov static void __init xen_hvm_smp_prepare_boot_cpu(void) 11a52482d9SVitaly Kuznetsov { 12a52482d9SVitaly Kuznetsov BUG_ON(smp_processor_id() != 0); 13a52482d9SVitaly Kuznetsov native_smp_prepare_boot_cpu(); 14a52482d9SVitaly Kuznetsov 15a52482d9SVitaly Kuznetsov /* 16ad73fd59SAnkur Arora * Setup vcpu_info for boot CPU. Secondary CPUs get their vcpu_info 17ad73fd59SAnkur Arora * in xen_cpu_up_prepare_hvm(). 18a52482d9SVitaly Kuznetsov */ 19a52482d9SVitaly Kuznetsov xen_vcpu_setup(0); 20a52482d9SVitaly Kuznetsov 21a52482d9SVitaly Kuznetsov /* 22a52482d9SVitaly Kuznetsov * The alternative logic (which patches the unlock/lock) runs before 23a52482d9SVitaly Kuznetsov * the smp bootup up code is activated. Hence we need to set this up 24a52482d9SVitaly Kuznetsov * the core kernel is being patched. Otherwise we will have only 25a52482d9SVitaly Kuznetsov * modules patched but not core code. 26a52482d9SVitaly Kuznetsov */ 27a52482d9SVitaly Kuznetsov xen_init_spinlocks(); 28a52482d9SVitaly Kuznetsov } 29a52482d9SVitaly Kuznetsov 30a52482d9SVitaly Kuznetsov static void __init xen_hvm_smp_prepare_cpus(unsigned int max_cpus) 31a52482d9SVitaly Kuznetsov { 320b64ffb8SAnkur Arora int cpu; 330b64ffb8SAnkur Arora 34a52482d9SVitaly Kuznetsov native_smp_prepare_cpus(max_cpus); 35a52482d9SVitaly Kuznetsov WARN_ON(xen_smp_intr_init(0)); 36a52482d9SVitaly Kuznetsov 37a52482d9SVitaly Kuznetsov xen_init_lock_cpu(0); 380b64ffb8SAnkur Arora 390b64ffb8SAnkur Arora for_each_possible_cpu(cpu) { 400b64ffb8SAnkur Arora if (cpu == 0) 410b64ffb8SAnkur Arora continue; 420b64ffb8SAnkur Arora 430b64ffb8SAnkur Arora /* Set default vcpu_id to make sure that we don't use cpu-0's */ 440b64ffb8SAnkur Arora per_cpu(xen_vcpu_id, cpu) = XEN_VCPU_ID_INVALID; 450b64ffb8SAnkur Arora } 46a52482d9SVitaly Kuznetsov } 47a52482d9SVitaly Kuznetsov 48a52482d9SVitaly Kuznetsov #ifdef CONFIG_HOTPLUG_CPU 49a52482d9SVitaly Kuznetsov static void xen_hvm_cpu_die(unsigned int cpu) 50a52482d9SVitaly Kuznetsov { 51a52482d9SVitaly Kuznetsov if (common_cpu_die(cpu) == 0) { 52a52482d9SVitaly Kuznetsov xen_smp_intr_free(cpu); 53a52482d9SVitaly Kuznetsov xen_uninit_lock_cpu(cpu); 54a52482d9SVitaly Kuznetsov xen_teardown_timer(cpu); 55a52482d9SVitaly Kuznetsov } 56a52482d9SVitaly Kuznetsov } 57a52482d9SVitaly Kuznetsov #else 58a52482d9SVitaly Kuznetsov static void xen_hvm_cpu_die(unsigned int cpu) 59a52482d9SVitaly Kuznetsov { 60a52482d9SVitaly Kuznetsov BUG(); 61a52482d9SVitaly Kuznetsov } 62a52482d9SVitaly Kuznetsov #endif 63a52482d9SVitaly Kuznetsov 64a52482d9SVitaly Kuznetsov void __init xen_hvm_smp_init(void) 65a52482d9SVitaly Kuznetsov { 6684d582d2SBoris Ostrovsky if (!xen_have_vector_callback) 6784d582d2SBoris Ostrovsky return; 6884d582d2SBoris Ostrovsky 69a52482d9SVitaly Kuznetsov smp_ops.smp_prepare_cpus = xen_hvm_smp_prepare_cpus; 70a52482d9SVitaly Kuznetsov smp_ops.smp_send_reschedule = xen_smp_send_reschedule; 71a52482d9SVitaly Kuznetsov smp_ops.cpu_die = xen_hvm_cpu_die; 72a52482d9SVitaly Kuznetsov smp_ops.send_call_func_ipi = xen_smp_send_call_function_ipi; 73a52482d9SVitaly Kuznetsov smp_ops.send_call_func_single_ipi = xen_smp_send_call_function_single_ipi; 74a52482d9SVitaly Kuznetsov smp_ops.smp_prepare_boot_cpu = xen_hvm_smp_prepare_boot_cpu; 75ae039001SAnkur Arora smp_ops.smp_cpus_done = xen_smp_cpus_done; 76a52482d9SVitaly Kuznetsov } 77