From: Zhao Liu <zhao1.liu@intel.com>
PPC supports CPU hotplug at core granularity, thus ppc-core only accepts
all CPUs in a core are plugged.
Check if plugged_threads and nr_threads are equal when ppc-core
realizes.
Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
---
hw/ppc/ppc_core.c | 18 ++++++++++++++++++
include/hw/ppc/ppc_core.h | 1 +
2 files changed, 19 insertions(+)
diff --git a/hw/ppc/ppc_core.c b/hw/ppc/ppc_core.c
index 4433b54af506..3857f3150052 100644
--- a/hw/ppc/ppc_core.c
+++ b/hw/ppc/ppc_core.c
@@ -53,20 +53,38 @@ static void powerpc_core_prop_set_core_id(Object *obj, Visitor *v,
core->core_id = value;
}
+static void powerpc_core_realize(DeviceState *dev, Error **errp)
+{
+ CPUCore *core = CPU_CORE(dev);
+ PowerPCCoreClass *ppc_class = POWERPC_CORE_GET_CLASS(dev);
+
+ if (core->plugged_threads != -1 &&
+ core->nr_threads != core->plugged_threads) {
+ error_setg(errp, "nr_threads and plugged-threads must be equal");
+ return;
+ }
+
+ ppc_class->parent_realize(dev, errp);
+}
+
static void powerpc_core_class_init(ObjectClass *oc, void *data)
{
DeviceClass *dc = DEVICE_CLASS(oc);
+ PowerPCCoreClass *ppc_class = POWERPC_CORE_CLASS(oc);
object_class_property_add(oc, "core-id", "int",
powerpc_core_prop_get_core_id,
powerpc_core_prop_set_core_id,
NULL, NULL);
+ device_class_set_parent_realize(dc, powerpc_core_realize,
+ &ppc_class->parent_realize);
}
static const TypeInfo powerpc_core_type_info = {
.name = TYPE_POWERPC_CORE,
.parent = TYPE_CPU_CORE,
.abstract = true,
+ .class_size = sizeof(PowerPCCoreClass),
.class_init = powerpc_core_class_init,
.instance_size = sizeof(PowerPCCore),
};
diff --git a/include/hw/ppc/ppc_core.h b/include/hw/ppc/ppc_core.h
index bcc83e426e3f..1207d220872a 100644
--- a/include/hw/ppc/ppc_core.h
+++ b/include/hw/ppc/ppc_core.h
@@ -34,6 +34,7 @@ struct PowerPCCoreClass {
CPUCoreClass parent_class;
/*< public >*/
+ DeviceRealize parent_realize;
};
struct PowerPCCore {
--
2.34.1