From b67d0bcdd41cb536883c3732a0f95803e975dcd8 Mon Sep 17 00:00:00 2001 From: Alistair Francis Date: Thu, 12 Mar 2026 14:31:56 +1000 Subject: [PATCH] hw/arm: fsl-imx8mp: Don't call qdev_get_machine in soc init Calling qdev_get_machine() in the soc_init function would result in the following assert ../hw/core/qdev.c:858: qdev_get_machine: Assertion `dev' failed. when trying to run ./qemu-system-aarch64 -S -display none -M virt -device fsl-imx8mp,help as the machine wasn't created yet. We call qdev_get_machine() to obtain the number of CPUs in the machine. So instead of initialising the CPUs in the SoC init let's instead do it in the realise where the machine will exist. Signed-off-by: Alistair Francis Tested-by: Markus Armbruster Message-ID: <20260312043158.4191378-6-alistair.francis@wdc.com> Signed-off-by: Thomas Huth --- hw/arm/fsl-imx8mp.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/hw/arm/fsl-imx8mp.c b/hw/arm/fsl-imx8mp.c index 79f91427772..b36df829719 100644 --- a/hw/arm/fsl-imx8mp.c +++ b/hw/arm/fsl-imx8mp.c @@ -193,16 +193,9 @@ static const struct { static void fsl_imx8mp_init(Object *obj) { - MachineState *ms = MACHINE(qdev_get_machine()); FslImx8mpState *s = FSL_IMX8MP(obj); - const char *cpu_type = ms->cpu_type ?: ARM_CPU_TYPE_NAME("cortex-a53"); int i; - for (i = 0; i < MIN(ms->smp.cpus, FSL_IMX8MP_NUM_CPUS); i++) { - g_autofree char *name = g_strdup_printf("cpu%d", i); - object_initialize_child(obj, name, &s->cpu[i], cpu_type); - } - object_initialize_child(obj, "gic", &s->gic, gicv3_class_name()); object_initialize_child(obj, "ccm", &s->ccm, TYPE_IMX8MP_CCM); @@ -265,6 +258,7 @@ static void fsl_imx8mp_realize(DeviceState *dev, Error **errp) MachineState *ms = MACHINE(qdev_get_machine()); FslImx8mpState *s = FSL_IMX8MP(dev); DeviceState *gicdev = DEVICE(&s->gic); + const char *cpu_type = ms->cpu_type ?: ARM_CPU_TYPE_NAME("cortex-a53"); int i; if (ms->smp.cpus > FSL_IMX8MP_NUM_CPUS) { @@ -273,6 +267,11 @@ static void fsl_imx8mp_realize(DeviceState *dev, Error **errp) return; } + for (i = 0; i < ms->smp.cpus; i++) { + g_autofree char *name = g_strdup_printf("cpu%d", i); + object_initialize_child(OBJECT(dev), name, &s->cpu[i], cpu_type); + } + /* CPUs */ for (i = 0; i < ms->smp.cpus; i++) { /* On uniprocessor, the CBAR is set to 0 */ -- 2.47.3