From: Ruslan Ruslichenko <[email protected]> Actually realize objects with TYPE_DEVICE after main allocations done and properties set for qdev.
Signed-off-by: Ruslan Ruslichenko <[email protected]> --- hw/core/fdt_generic_util.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/hw/core/fdt_generic_util.c b/hw/core/fdt_generic_util.c index 2a3862b9ac..43fa862f31 100644 --- a/hw/core/fdt_generic_util.c +++ b/hw/core/fdt_generic_util.c @@ -681,6 +681,30 @@ static int fdt_init_qdev(char *node_path, FDTMachineInfo *fdti, char *compat) fdt_init_qdev_scalar_prop(OBJECT(dev), p, fdti, node_path, prop); } + if (object_dynamic_cast(dev, TYPE_DEVICE)) { + DeviceClass *dc = DEVICE_GET_CLASS(dev); + const char *short_name = strrchr(node_path, '/') + 1; + + /* Regular TYPE_DEVICE houskeeping */ + DB_PRINT_NP(0, "Short naming node: %s\n", short_name); + (DEVICE(dev))->id = g_strdup(short_name); + + if (object_dynamic_cast(dev, TYPE_CPU_CLUSTER)) { + /* + * CPU clusters must be realized at the end to make sure all child + * CPUs are parented. + */ + fdt_init_register_user_cpu_cluster(fdti, OBJECT(dev)); + } else { + object_property_set_bool(OBJECT(dev), "realized", true, + &error_fatal); + if (dc->legacy_reset) { + qemu_register_reset((void (*)(void *))dc->legacy_reset, + dev); + } + } + } + g_free(dev_type); g_free(props); -- 2.43.0
