Adds various utility functions which might be required to fetch or check the state of the possible vcpus. This also introduces concept of *disabled* vcpus, which are part of the *possible* vcpus but are not part of the *present* vcpu. This state shall be used during machine init time to check the presence of vcpus.
Co-developed-by: Keqian Zhu <zhukeqi...@huawei.com> Signed-off-by: Salil Mehta <salil.me...@huawei.com> --- cpus-common.c | 20 ++++++++++++++++++++ include/hw/core/cpu.h | 21 +++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/cpus-common.c b/cpus-common.c index 70a9d12981..7cf900289b 100644 --- a/cpus-common.c +++ b/cpus-common.c @@ -23,6 +23,7 @@ #include "hw/core/cpu.h" #include "sysemu/cpus.h" #include "qemu/lockable.h" +#include "hw/boards.h" static QemuMutex qemu_cpu_list_lock; static QemuCond exclusive_cond; @@ -82,6 +83,25 @@ void cpu_list_add(CPUState *cpu) assert(!cpu_index_auto_assigned); } QTAILQ_INSERT_TAIL_RCU(&cpus, cpu, node); + qemu_mutex_unlock(&qemu_cpu_list_lock); +} + +CPUState *qemu_get_possible_cpu(int index) +{ + MachineState *ms = MACHINE(qdev_get_machine()); + const CPUArchIdList *possible_cpus = ms->possible_cpus; + CPUState *cpu; + + assert((index >= 0) && (index < possible_cpus->len)); + + cpu = CPU(possible_cpus->cpus[index].cpu); + + return cpu; +} + +bool qemu_present_cpu(CPUState *cpu) +{ + return (cpu && !cpu->disabled); } void cpu_list_remove(CPUState *cpu) diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h index 497600c49e..d9cae71ea5 100644 --- a/include/hw/core/cpu.h +++ b/include/hw/core/cpu.h @@ -419,6 +419,7 @@ struct CPUState { GArray *plugin_mem_cbs; + bool disabled; /* TODO Move common fields from CPUArchState here. */ int cpu_index; int cluster_index; @@ -802,6 +803,26 @@ static inline bool cpu_in_exclusive_context(const CPUState *cpu) */ CPUState *qemu_get_cpu(int index); +/** + * qemu_get_possible_cpu: + * @index: The CPUState@cpu_index value of the CPU to obtain. + * + * Gets a CPU matching @index. + * + * Returns: The possible CPU or %NULL if there is no matching CPU. + */ +CPUState *qemu_get_possible_cpu(int index); + +/** + * qemu_present_cpu: + * @cpu: The vCPU to check + * + * Checks if the vcpu is amongst the present possible vcpus. + * + * Returns: True if it is present possible vcpu else false + */ +bool qemu_present_cpu(CPUState *cpu); + /** * cpu_exists: * @id: Guest-exposed CPU ID to lookup. -- 2.17.1