On 7/25/2026 9:00 AM, Marc-André Lureau wrote:
virt_instance_init() built the FDT unconditionally at QOM
instance-init time, so simply instantiating the object (e.g. via
qom-test's introspection, without ever realizing the machine) leaked
the 1MB FDT blob: machine_finalize() does not free machine->fdt.

Other boards (arm/virt, riscv/virt, ...) build the FDT lazily from
their MachineClass::init callback, which only runs when the machine
is actually selected to boot. Do the same here by moving create_fdt()
into virt_init().

Fixes: 88a8bc7f43ff ("hw/hexagon: Define hexagon "virt" machine")
Signed-off-by: Marc-André Lureau <[email protected]>
---

Reviewed-by: Brian Cain <[email protected]>


  hw/hexagon/virt.c | 9 +--------
  1 file changed, 1 insertion(+), 8 deletions(-)

diff --git a/hw/hexagon/virt.c b/hw/hexagon/virt.c
index a3638998b873..b75047250260 100644
--- a/hw/hexagon/virt.c
+++ b/hw/hexagon/virt.c
@@ -175,13 +175,6 @@ static void fdt_add_cpu_nodes(const 
HexagonVirtMachineState *vms)
-static void virt_instance_init(Object *obj)
-{
-    HexagonVirtMachineState *vms = HEXAGON_VIRT_MACHINE(obj);
-
-    create_fdt(vms);
-}
-
  void hexagon_load_fdt(const HexagonVirtMachineState *vms)
  {
      MachineState *ms = MACHINE(vms);
@@ -242,6 +235,7 @@ static void virt_init(MachineState *ms)
      DeviceState *cpu0;
      int32_t clk_phandle;
+ create_fdt(vms);
      qemu_fdt_setprop_string(ms->fdt, "/chosen", "bootargs", 
ms->kernel_cmdline);
vms->sys = get_system_memory();
@@ -341,7 +335,6 @@ static const TypeInfo virt_machine_types[] = { {
      .parent = TYPE_HEXAGON_COMMON_MACHINE,
      .instance_size = sizeof(HexagonVirtMachineState),
      .class_init = virt_class_init,
-    .instance_init = virt_instance_init,
  } };
DEFINE_TYPES(virt_machine_types)


Reply via email to