... it should be used only on slow path since it does recursive search
on /machine QOM tree for objects of TYPE_CPU
Signed-off-by: Igor Mammedov <[email protected]>
---
include/qom/cpu.h | 10 ++++++++++
qom/cpu.c | 21 +++++++++++++++++++++
2 files changed, 31 insertions(+)
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index 0d33009..5cac79b 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -227,6 +227,16 @@ void run_on_cpu(CPUState *cpu, void (*func)(void *data),
void *data);
*/
CPUState *qemu_get_cpu(int index);
+/**
+ * cpu_exists:
+ * @id - guest exposed CPU ID to lookup
+ *
+ * Search for CPU with specified ID.
+ *
+ * Returns: true - CPU is found, false - CPU isn't found
+ */
+bool cpu_exists(int64_t id);
+
#ifndef CONFIG_USER_ONLY
typedef void (*CPUInterruptHandler)(CPUState *, int);
diff --git a/qom/cpu.c b/qom/cpu.c
index a54d4d1..46b77d3 100644
--- a/qom/cpu.c
+++ b/qom/cpu.c
@@ -24,6 +24,27 @@
#include "qemu/notify.h"
#include "sysemu/sysemu.h"
+static int cpu_exist_cb(Object *obj, void *opaque)
+{
+ int64_t id = *(int64_t *)opaque;
+ Object *cpu_obj = object_dynamic_cast(obj, TYPE_CPU);
+
+ if (cpu_obj) {
+ CPUState *cpu = CPU(cpu_obj);
+ CPUClass *klass = CPU_GET_CLASS(cpu);
+
+ if (klass->get_firmware_id && klass->get_firmware_id(cpu) == id) {
+ return 1;
+ }
+ }
+ return object_child_foreach(obj, cpu_exist_cb, opaque);
+}
+
+bool cpu_exists(int64_t id)
+{
+ return cpu_exist_cb(qdev_get_machine(), &id) ? true : false;
+}
+
/* CPU hot-plug notifiers */
static NotifierList cpu_added_notifiers =
NOTIFIER_LIST_INITIALIZER(cpu_add_notifiers);
--
1.8.1.4