On Fri, 14 Mar 2025 at 18:32, Bernhard Beschow <[email protected]> wrote:
>
> Deriving from TYPE_SYS_BUS_DEVICE fixes the SoC object to be reset upon
> machine
> reset. It also makes the SoC implementation not user-creatable which can
> trigger
> the following crash:
>
> $ ./qemu-system-aarch64 -M virt -device fsl-imx8mp
> **
> ERROR:../../devel/qemu/tcg/tcg.c:1006:tcg_register_thread: assertion failed:
> (n < tcg_max_ctxs)
> Bail out! ERROR:../../devel/qemu/tcg/tcg.c:1006:tcg_register_thread:
> assertion failed: (n < tcg_max_ctxs)
> Aborted (core dumped)
> diff --git a/hw/arm/fsl-imx8mp.c b/hw/arm/fsl-imx8mp.c
> index c3f6da6322..82edf61082 100644
> --- a/hw/arm/fsl-imx8mp.c
> +++ b/hw/arm/fsl-imx8mp.c
> @@ -702,7 +702,7 @@ static void fsl_imx8mp_class_init(ObjectClass *oc, void
> *data)
> static const TypeInfo fsl_imx8mp_types[] = {
> {
> .name = TYPE_FSL_IMX8MP,
> - .parent = TYPE_DEVICE,
> + .parent = TYPE_SYS_BUS_DEVICE,
> .instance_size = sizeof(FslImx8mpState),
> .instance_init = fsl_imx8mp_init,
> .class_init = fsl_imx8mp_class_init,
> diff --git a/hw/arm/imx8mp-evk.c b/hw/arm/imx8mp-evk.c
> index e1a7892fd7..f17d5db466 100644
> --- a/hw/arm/imx8mp-evk.c
> +++ b/hw/arm/imx8mp-evk.c
> @@ -37,7 +37,7 @@ static void imx8mp_evk_init(MachineState *machine)
> s = FSL_IMX8MP(object_new(TYPE_FSL_IMX8MP));
> object_property_add_child(OBJECT(machine), "soc", OBJECT(s));
> object_property_set_uint(OBJECT(s), "fec1-phy-num", 1, &error_fatal);
> - qdev_realize(DEVICE(s), NULL, &error_fatal);
> + sysbus_realize_and_unref(SYS_BUS_DEVICE(s), &error_fatal);
You want sysbus_realize() here, not the _and_unref() variant,
because the device was created with object_initialize_child().
The pairing is:
* object_initialize_child() + sysbus_realize() / qdev_realize()
* qdev_new() + sysbus_realize_and_unref() / qdev_realize_and_unref()
(See the doc comment in include/hw/qdev-core.h for
qdev_realize_and_unref() for more detail.)
Otherwise
Reviewed-by: Peter Maydell <[email protected]>
thanks
-- PMM