[RFC PATCH v2 044/137] hw/sparc: Give onboard devices a QOM parent

Alexander Graf <[email protected]>
Newsgroups org.nongnu.qemu-arm,org.nongnu.qemu-devel,org.nongnu.qemu-riscv
Message-ID <[email protected]>
Convert the *_orphan() device-creation calls in hw/sparc to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.

The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children.  Names follow existing QOM conventions.

Per-site rationale (reviewers: dispute the modeling here):

hw/sparc/leon3.c:295 | qdev_new | OBJECT(machine) | "ahb-pnp" | leon3_generic_hw_init() board init
hw/sparc/leon3.c:302 | qdev_new | OBJECT(machine) | "apb-pnp" | leon3_generic_hw_init() board init
hw/sparc/leon3.c:310 | qdev_new | OBJECT(machine) | "irqmp" | leon3_generic_hw_init() board init
hw/sparc/leon3.c:409 | qdev_new | OBJECT(machine) | "gptimer" | leon3_generic_hw_init() board init
hw/sparc/leon3.c:426 | qdev_new | OBJECT(machine) | "uart" | leon3_generic_hw_init() board init
hw/sparc/sun4m.c:283 | qdev_new | parent | "iommu" | iommu_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:305 | qdev_new | parent | "dma" | sparc32_dma_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:350 | qdev_new | parent | "intctl" | slavio_intctl_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:379 | qdev_new | parent | "timer" | slavio_timer_init_all() helper: thread Object *parent from board init
hw/sparc/sun4m.c:417 | qdev_new | parent | "misc" | slavio_misc_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:454 | qdev_new | parent | "ecc" | ecc_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:470 | qdev_new | parent | "apc" | apc_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:484 | qdev_new | parent | "tcx" | tcx_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:536 | qdev_new | parent | "cgthree" | cg3_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:565 | qdev_new | parent | "idreg" | idreg_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:624 | qdev_new | parent | "afx" | afx_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:681 | qdev_new | parent | "prom" | prom_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:838 | qdev_new | OBJECT(machine) | "ram" | sun4m_hw_init() board init
hw/sparc/sun4m.c:950 | qdev_new | OBJECT(machine) | "nvram" | sun4m_hw_init() board init
hw/sparc/sun4m.c:962 | qdev_new | OBJECT(machine) | "escc-kbd" | sun4m_hw_init() board init; keyboard/mouse ESCC
hw/sparc/sun4m.c:975 | qdev_new | OBJECT(machine) | "ms-kb-orgate" | sun4m_hw_init() board init; drop _and_unref
hw/sparc/sun4m.c:982 | qdev_new | OBJECT(machine) | "escc-serial" | sun4m_hw_init() board init; serial ESCC
hw/sparc/sun4m.c:996 | qdev_new | OBJECT(machine) | "serial-orgate" | sun4m_hw_init() board init; drop _and_unref
hw/sparc/sun4m.c:1022 | sysbus_create_simple | OBJECT(machine) | "cs4231" | sun4m_hw_init() board init
hw/sparc/sun4m.c:1055 | qdev_new | OBJECT(machine) | TYPE_FW_CFG | collapse existing object_property_add_child(); keep name; drop _and_unref

Link: https://lore.kernel.org/qemu-devel/[email protected]/
AI-used-for: code (refactoring)
Signed-off-by: Alexander Graf <[email protected]>
---
 hw/sparc/leon3.c |  22 ++++----
 hw/sparc/sun4m.c | 142 ++++++++++++++++++++++++-----------------------
 2 files changed, 85 insertions(+), 79 deletions(-)

diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
index d921cd8dc6..a96ccca8e3 100644
--- a/hw/sparc/leon3.c
+++ b/hw/sparc/leon3.c
@@ -292,25 +292,27 @@ static void leon3_generic_hw_init(MachineState *machine)
         qemu_register_reset(leon3_cpu_reset, &reset_info->info[i]);
     }
 
-    ahb_pnp = GRLIB_AHB_PNP(qdev_new_orphan(TYPE_GRLIB_AHB_PNP));
-    sysbus_realize_and_unref(SYS_BUS_DEVICE(ahb_pnp), &error_fatal);
+    ahb_pnp = GRLIB_AHB_PNP(qdev_new(OBJECT(machine), "ahb-pnp",
+                                     TYPE_GRLIB_AHB_PNP));
+    sysbus_realize(SYS_BUS_DEVICE(ahb_pnp), &error_fatal);
     sysbus_mmio_map(SYS_BUS_DEVICE(ahb_pnp), 0, LEON3_AHB_PNP_OFFSET);
     grlib_ahb_pnp_add_entry(ahb_pnp, 0, 0, GRLIB_VENDOR_GAISLER,
                             GRLIB_LEON3_DEV, GRLIB_AHB_MASTER,
                             GRLIB_CPU_AREA);
 
-    apb_pnp = GRLIB_APB_PNP(qdev_new_orphan(TYPE_GRLIB_APB_PNP));
-    sysbus_realize_and_unref(SYS_BUS_DEVICE(apb_pnp), &error_fatal);
+    apb_pnp = GRLIB_APB_PNP(qdev_new(OBJECT(machine), "apb-pnp",
+                                     TYPE_GRLIB_APB_PNP));
+    sysbus_realize(SYS_BUS_DEVICE(apb_pnp), &error_fatal);
     sysbus_mmio_map(SYS_BUS_DEVICE(apb_pnp), 0, LEON3_APB_PNP_OFFSET);
     grlib_ahb_pnp_add_entry(ahb_pnp, LEON3_APB_PNP_OFFSET, 0xFFF,
                             GRLIB_VENDOR_GAISLER, GRLIB_APBMST_DEV,
                             GRLIB_AHB_SLAVE, GRLIB_AHBMEM_AREA);
 
     /* Allocate IRQ manager */
-    irqmpdev = qdev_new_orphan(TYPE_GRLIB_IRQMP);
+    irqmpdev = qdev_new(OBJECT(machine), "irqmp", TYPE_GRLIB_IRQMP);
     object_property_set_int(OBJECT(irqmpdev), "ncpus", machine->smp.cpus,
                             &error_fatal);
-    sysbus_realize_and_unref(SYS_BUS_DEVICE(irqmpdev), &error_fatal);
+    sysbus_realize(SYS_BUS_DEVICE(irqmpdev), &error_fatal);
 
     for (i = 0; i < machine->smp.cpus; i++) {
         cpu = reset_info->info[i].cpu;
@@ -406,11 +408,11 @@ static void leon3_generic_hw_init(MachineState *machine)
     }
 
     /* Allocate timers */
-    dev = qdev_new_orphan(TYPE_GRLIB_GPTIMER);
+    dev = qdev_new(OBJECT(machine), "gptimer", TYPE_GRLIB_GPTIMER);
     qdev_prop_set_uint32(dev, "nr-timers", LEON3_TIMER_COUNT);
     qdev_prop_set_uint32(dev, "frequency", CPU_CLK);
     qdev_prop_set_uint32(dev, "irq-line", LEON3_TIMER_IRQ);
-    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+    sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
 
     sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, LEON3_TIMER_OFFSET);
     for (i = 0; i < LEON3_TIMER_COUNT; i++) {
@@ -423,9 +425,9 @@ static void leon3_generic_hw_init(MachineState *machine)
                             0, LEON3_TIMER_IRQ, GRLIB_APBIO_AREA);
 
     /* Allocate uart */
-    dev = qdev_new_orphan(TYPE_GRLIB_APB_UART);
+    dev = qdev_new(OBJECT(machine), "uart", TYPE_GRLIB_APB_UART);
     qdev_prop_set_chr(dev, "chrdev", serial_hd(0));
-    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+    sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
     sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, LEON3_UART_OFFSET);
     sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
                        qdev_get_gpio_in(irqmpdev, LEON3_UART_IRQ));
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 52627dbdec..b0f018a3c5 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -275,22 +275,23 @@ static unsigned long sun4m_load_kernel(const char *kernel_filename,
     return kernel_size;
 }
 
-static void *iommu_init(hwaddr addr, uint32_t version, qemu_irq irq)
+static void *iommu_init(Object *parent, hwaddr addr, uint32_t version,
+                        qemu_irq irq)
 {
     DeviceState *dev;
     SysBusDevice *s;
 
-    dev = qdev_new_orphan(TYPE_SUN4M_IOMMU);
+    dev = qdev_new(parent, "iommu", TYPE_SUN4M_IOMMU);
     qdev_prop_set_uint32(dev, "version", version);
     s = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(s, &error_fatal);
+    sysbus_realize(s, &error_fatal);
     sysbus_connect_irq(s, 0, irq);
     sysbus_mmio_map(s, 0, addr);
 
     return s;
 }
 
-static void *sparc32_dma_init(hwaddr dma_base,
+static void *sparc32_dma_init(Object *parent, hwaddr dma_base,
                               hwaddr esp_base, qemu_irq espdma_irq,
                               hwaddr le_base, qemu_irq ledma_irq,
                               MACAddr *mac)
@@ -302,7 +303,7 @@ static void *sparc32_dma_init(hwaddr dma_base,
     SysBusPCNetState *lance;
     NICInfo *nd = qemu_find_nic_info("lance", true, NULL);
 
-    dma = qdev_new_orphan(TYPE_SPARC32_DMA);
+    dma = qdev_new(parent, "dma", TYPE_SPARC32_DMA);
     espdma = SPARC32_ESPDMA_DEVICE(object_resolve_path_component(
                                    OBJECT(dma), "espdma"));
 
@@ -322,7 +323,7 @@ static void *sparc32_dma_init(hwaddr dma_base,
         qdev_prop_set_macaddr(DEVICE(lance), "mac", mac->a);
     }
 
-    sysbus_realize_and_unref(SYS_BUS_DEVICE(dma), &error_fatal);
+    sysbus_realize(SYS_BUS_DEVICE(dma), &error_fatal);
 
     sysbus_connect_irq(SYS_BUS_DEVICE(espdma), 0, espdma_irq);
 
@@ -338,7 +339,7 @@ static void *sparc32_dma_init(hwaddr dma_base,
     return dma;
 }
 
-static DeviceState *slavio_intctl_init(hwaddr addr,
+static DeviceState *slavio_intctl_init(Object *parent, hwaddr addr,
                                        hwaddr addrg,
                                        unsigned int smp_cpus,
                                        DeviceState **cpus)
@@ -347,10 +348,10 @@ static DeviceState *slavio_intctl_init(hwaddr addr,
     SysBusDevice *s;
     unsigned int i, j;
 
-    dev = qdev_new_orphan("slavio_intctl");
+    dev = qdev_new(parent, "intctl", "slavio_intctl");
 
     s = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(s, &error_fatal);
+    sysbus_realize(s, &error_fatal);
 
     for (i = 0; i < smp_cpus; i++) {
         for (j = 0; j < MAX_PILS; j++) {
@@ -369,17 +370,18 @@ static DeviceState *slavio_intctl_init(hwaddr addr,
 #define SYS_TIMER_OFFSET      0x10000ULL
 #define CPU_TIMER_OFFSET(cpu) (0x1000ULL * cpu)
 
-static void slavio_timer_init_all(hwaddr addr, qemu_irq master_irq,
+static void slavio_timer_init_all(Object *parent, hwaddr addr,
+                                  qemu_irq master_irq,
                                   qemu_irq *cpu_irqs, unsigned int num_cpus)
 {
     DeviceState *dev;
     SysBusDevice *s;
     unsigned int i;
 
-    dev = qdev_new_orphan("slavio_timer");
+    dev = qdev_new(parent, "timer", "slavio_timer");
     qdev_prop_set_uint32(dev, "num_cpus", num_cpus);
     s = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(s, &error_fatal);
+    sysbus_realize(s, &error_fatal);
     sysbus_connect_irq(s, 0, master_irq);
     sysbus_mmio_map(s, 0, addr + SYS_TIMER_OFFSET);
 
@@ -406,7 +408,7 @@ static Notifier slavio_system_powerdown_notifier = {
 #define MISC_MDM  0x01b00000
 #define MISC_SYS  0x01f00000
 
-static void slavio_misc_init(hwaddr base,
+static void slavio_misc_init(Object *parent, hwaddr base,
                              hwaddr aux1_base,
                              hwaddr aux2_base, qemu_irq irq,
                              qemu_irq fdc_tc)
@@ -414,9 +416,9 @@ static void slavio_misc_init(hwaddr base,
     DeviceState *dev;
     SysBusDevice *s;
 
-    dev = qdev_new_orphan("slavio_misc");
+    dev = qdev_new(parent, "misc", "slavio_misc");
     s = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(s, &error_fatal);
+    sysbus_realize(s, &error_fatal);
     if (base) {
         /* 8 bit registers */
         /* Slavio control */
@@ -446,15 +448,16 @@ static void slavio_misc_init(hwaddr base,
     qemu_register_powerdown_notifier(&slavio_system_powerdown_notifier);
 }
 
-static void ecc_init(hwaddr base, qemu_irq irq, uint32_t version)
+static void ecc_init(Object *parent, hwaddr base, qemu_irq irq,
+                     uint32_t version)
 {
     DeviceState *dev;
     SysBusDevice *s;
 
-    dev = qdev_new_orphan("eccmemctl");
+    dev = qdev_new(parent, "ecc", "eccmemctl");
     qdev_prop_set_uint32(dev, "version", version);
     s = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(s, &error_fatal);
+    sysbus_realize(s, &error_fatal);
     sysbus_connect_irq(s, 0, irq);
     sysbus_mmio_map(s, 0, base);
     if (version == 0) { // SS-600MP only
@@ -462,32 +465,32 @@ static void ecc_init(hwaddr base, qemu_irq irq, uint32_t version)
     }
 }
 
-static void apc_init(hwaddr power_base, qemu_irq cpu_halt)
+static void apc_init(Object *parent, hwaddr power_base, qemu_irq cpu_halt)
 {
     DeviceState *dev;
     SysBusDevice *s;
 
-    dev = qdev_new_orphan("apc");
+    dev = qdev_new(parent, "apc", "apc");
     s = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(s, &error_fatal);
+    sysbus_realize(s, &error_fatal);
     /* Power management (APC) XXX: not a Slavio device */
     sysbus_mmio_map(s, 0, power_base);
     sysbus_connect_irq(s, 0, cpu_halt);
 }
 
-static void tcx_init(hwaddr addr, qemu_irq irq, int vram_size, int width,
-                     int height, int depth)
+static void tcx_init(Object *parent, hwaddr addr, qemu_irq irq, int vram_size,
+                     int width, int height, int depth)
 {
     DeviceState *dev;
     SysBusDevice *s;
 
-    dev = qdev_new_orphan("sun-tcx");
+    dev = qdev_new(parent, "tcx", "sun-tcx");
     qdev_prop_set_uint32(dev, "vram_size", vram_size);
     qdev_prop_set_uint16(dev, "width", width);
     qdev_prop_set_uint16(dev, "height", height);
     qdev_prop_set_uint16(dev, "depth", depth);
     s = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(s, &error_fatal);
+    sysbus_realize(s, &error_fatal);
 
     /* 10/ROM : FCode ROM */
     sysbus_mmio_map(s, 0, addr);
@@ -527,19 +530,19 @@ static void tcx_init(hwaddr addr, qemu_irq irq, int vram_size, int width,
     sysbus_connect_irq(s, 0, irq);
 }
 
-static void cg3_init(hwaddr addr, qemu_irq irq, int vram_size, int width,
-                     int height, int depth)
+static void cg3_init(Object *parent, hwaddr addr, qemu_irq irq, int vram_size,
+                     int width, int height, int depth)
 {
     DeviceState *dev;
     SysBusDevice *s;
 
-    dev = qdev_new_orphan("cgthree");
+    dev = qdev_new(parent, "cgthree", "cgthree");
     qdev_prop_set_uint32(dev, "vram-size", vram_size);
     qdev_prop_set_uint16(dev, "width", width);
     qdev_prop_set_uint16(dev, "height", height);
     qdev_prop_set_uint16(dev, "depth", depth);
     s = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(s, &error_fatal);
+    sysbus_realize(s, &error_fatal);
 
     /* FCode ROM */
     sysbus_mmio_map(s, 0, addr);
@@ -557,14 +560,14 @@ static void cg3_init(hwaddr addr, qemu_irq irq, int vram_size, int width,
 
 static const uint8_t idreg_data[] = { 0xfe, 0x81, 0x01, 0x03 };
 
-static void idreg_init(hwaddr addr)
+static void idreg_init(Object *parent, hwaddr addr)
 {
     DeviceState *dev;
     SysBusDevice *s;
 
-    dev = qdev_new_orphan(TYPE_MACIO_ID_REGISTER);
+    dev = qdev_new(parent, "idreg", TYPE_MACIO_ID_REGISTER);
     s = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(s, &error_fatal);
+    sysbus_realize(s, &error_fatal);
 
     sysbus_mmio_map(s, 0, addr);
     address_space_write_rom(&address_space_memory, addr,
@@ -616,14 +619,14 @@ struct AFXState {
 };
 
 /* SS-5 TCX AFX register */
-static void afx_init(hwaddr addr)
+static void afx_init(Object *parent, hwaddr addr)
 {
     DeviceState *dev;
     SysBusDevice *s;
 
-    dev = qdev_new_orphan(TYPE_TCX_AFX);
+    dev = qdev_new(parent, "afx", TYPE_TCX_AFX);
     s = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(s, &error_fatal);
+    sysbus_realize(s, &error_fatal);
 
     sysbus_mmio_map(s, 0, addr);
 }
@@ -671,16 +674,16 @@ static uint64_t translate_prom_address(void *opaque, uint64_t addr)
     return addr + *base_addr - PROM_VADDR;
 }
 
-static void prom_init(hwaddr addr, const char *bios_name)
+static void prom_init(Object *parent, hwaddr addr, const char *bios_name)
 {
     DeviceState *dev;
     SysBusDevice *s;
     char *filename;
     int ret;
 
-    dev = qdev_new_orphan(TYPE_OPENPROM);
+    dev = qdev_new(parent, "prom", TYPE_OPENPROM);
     s = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(s, &error_fatal);
+    sysbus_realize(s, &error_fatal);
 
     sysbus_mmio_map(s, 0, addr);
 
@@ -835,9 +838,9 @@ static void sun4m_hw_init(MachineState *machine)
     }
 
     /* Create and map RAM frontend */
-    dev = qdev_new_orphan("memory");
+    dev = qdev_new(OBJECT(machine), "ram", "memory");
     object_property_set_link(OBJECT(dev), "memdev", OBJECT(ram_memdev), &error_fatal);
-    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+    sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
     sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0);
 
     /* models without ECC don't trap when missing ram is accessed */
@@ -846,9 +849,9 @@ static void sun4m_hw_init(MachineState *machine)
                         hwdef->max_mem - machine->ram_size);
     }
 
-    prom_init(hwdef->slavio_base, machine->firmware);
+    prom_init(OBJECT(machine), hwdef->slavio_base, machine->firmware);
 
-    slavio_intctl = slavio_intctl_init(hwdef->intctl_base,
+    slavio_intctl = slavio_intctl_init(OBJECT(machine), hwdef->intctl_base,
                                        hwdef->intctl_base + 0x10000ULL,
                                        smp_cpus,
                                        cpus);
@@ -861,14 +864,15 @@ static void sun4m_hw_init(MachineState *machine)
     }
 
     if (hwdef->idreg_base) {
-        idreg_init(hwdef->idreg_base);
+        idreg_init(OBJECT(machine), hwdef->idreg_base);
     }
 
     if (hwdef->afx_base) {
-        afx_init(hwdef->afx_base);
+        afx_init(OBJECT(machine), hwdef->afx_base);
     }
 
-    iommu_init(hwdef->iommu_base, hwdef->iommu_version, slavio_irq[30]);
+    iommu_init(OBJECT(machine), hwdef->iommu_base, hwdef->iommu_version,
+               slavio_irq[30]);
 
     if (hwdef->iommu_pad_base) {
         /* On the real hardware (SS-5, LX) the MMU is not padded, but aliased.
@@ -879,7 +883,7 @@ static void sun4m_hw_init(MachineState *machine)
                         hwdef->iommu_pad_base, hwdef->iommu_pad_len);
     }
 
-    sparc32_dma_init(hwdef->dma_base,
+    sparc32_dma_init(OBJECT(machine), hwdef->dma_base,
                      hwdef->esp_base, slavio_irq[18],
                      hwdef->le_base, slavio_irq[16], &hostid);
 
@@ -911,7 +915,7 @@ static void sun4m_hw_init(MachineState *machine)
             }
 
             /* sbus irq 5 */
-            cg3_init(hwdef->tcx_base, slavio_irq[11], 0x00100000,
+            cg3_init(OBJECT(machine), hwdef->tcx_base, slavio_irq[11], 0x00100000,
                      graphic_width, graphic_height, graphic_depth);
             vga_interface_created = true;
         } else {
@@ -927,7 +931,7 @@ static void sun4m_hw_init(MachineState *machine)
                 exit(1);
             }
 
-            tcx_init(hwdef->tcx_base, slavio_irq[11], 0x00100000,
+            tcx_init(OBJECT(machine), hwdef->tcx_base, slavio_irq[11], 0x00100000,
                      graphic_width, graphic_height, graphic_depth);
             vga_interface_created = true;
         }
@@ -947,19 +951,20 @@ static void sun4m_hw_init(MachineState *machine)
         create_unimplemented_device("sun-sx", hwdef->sx_base, 0x2000);
     }
 
-    dev = qdev_new_orphan("sysbus-m48t08");
+    dev = qdev_new(OBJECT(machine), "nvram", "sysbus-m48t08");
     qdev_prop_set_int32(dev, "base-year", 1968);
     s = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(s, &error_fatal);
+    sysbus_realize(s, &error_fatal);
     sysbus_connect_irq(s, 0, slavio_irq[0]);
     sysbus_mmio_map(s, 0, hwdef->nvram_base);
     nvram = NVRAM(dev);
 
-    slavio_timer_init_all(hwdef->counter_base, slavio_irq[19], slavio_cpu_irq, smp_cpus);
+    slavio_timer_init_all(OBJECT(machine), hwdef->counter_base, slavio_irq[19],
+                          slavio_cpu_irq, smp_cpus);
 
     /* Slavio TTYA (base+4, Linux ttyS0) is the first QEMU serial device
        Slavio TTYB (base+0, Linux ttyS1) is the second QEMU serial device */
-    dev = qdev_new_orphan(TYPE_ESCC);
+    dev = qdev_new(OBJECT(machine), "escc-kbd", TYPE_ESCC);
     qdev_prop_set_uint32(dev, "disabled", !machine->enable_graphics);
     qdev_prop_set_uint32(dev, "frequency", ESCC_CLOCK);
     qdev_prop_set_uint32(dev, "it_shift", 1);
@@ -968,18 +973,18 @@ static void sun4m_hw_init(MachineState *machine)
     qdev_prop_set_uint32(dev, "chnBtype", escc_mouse);
     qdev_prop_set_uint32(dev, "chnAtype", escc_kbd);
     s = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(s, &error_fatal);
+    sysbus_realize(s, &error_fatal);
     sysbus_mmio_map(s, 0, hwdef->ms_kb_base);
 
     /* Logically OR both its IRQs together */
-    ms_kb_orgate = qdev_new_orphan(TYPE_OR_IRQ);
+    ms_kb_orgate = qdev_new(OBJECT(machine), "ms-kb-orgate", TYPE_OR_IRQ);
     object_property_set_int(OBJECT(ms_kb_orgate), "num-lines", 2, &error_fatal);
-    qdev_realize_and_unref(ms_kb_orgate, NULL, &error_fatal);
+    qdev_realize(ms_kb_orgate, NULL, &error_fatal);
     sysbus_connect_irq(s, 0, qdev_get_gpio_in(ms_kb_orgate, 0));
     sysbus_connect_irq(s, 1, qdev_get_gpio_in(ms_kb_orgate, 1));
     qdev_connect_gpio_out(ms_kb_orgate, 0, slavio_irq[14]);
 
-    dev = qdev_new_orphan(TYPE_ESCC);
+    dev = qdev_new(OBJECT(machine), "escc-serial", TYPE_ESCC);
     qdev_prop_set_uint32(dev, "disabled", 0);
     qdev_prop_set_uint32(dev, "frequency", ESCC_CLOCK);
     qdev_prop_set_uint32(dev, "it_shift", 1);
@@ -989,20 +994,21 @@ static void sun4m_hw_init(MachineState *machine)
     qdev_prop_set_uint32(dev, "chnAtype", escc_serial);
 
     s = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(s, &error_fatal);
+    sysbus_realize(s, &error_fatal);
     sysbus_mmio_map(s, 0, hwdef->serial_base);
 
     /* Logically OR both its IRQs together */
-    serial_orgate = qdev_new_orphan(TYPE_OR_IRQ);
+    serial_orgate = qdev_new(OBJECT(machine), "serial-orgate", TYPE_OR_IRQ);
     object_property_set_int(OBJECT(serial_orgate), "num-lines", 2,
                             &error_fatal);
-    qdev_realize_and_unref(serial_orgate, NULL, &error_fatal);
+    qdev_realize(serial_orgate, NULL, &error_fatal);
     sysbus_connect_irq(s, 0, qdev_get_gpio_in(serial_orgate, 0));
     sysbus_connect_irq(s, 1, qdev_get_gpio_in(serial_orgate, 1));
     qdev_connect_gpio_out(serial_orgate, 0, slavio_irq[15]);
 
     if (hwdef->apc_base) {
-        apc_init(hwdef->apc_base, qemu_allocate_irq(cpu_halt_signal, NULL, 0));
+        apc_init(OBJECT(machine), hwdef->apc_base,
+                 qemu_allocate_irq(cpu_halt_signal, NULL, 0));
     }
 
     if (hwdef->fd_base) {
@@ -1015,12 +1021,12 @@ static void sun4m_hw_init(MachineState *machine)
         fdc_tc = qemu_allocate_irq(dummy_fdc_tc, NULL, 0);
     }
 
-    slavio_misc_init(hwdef->slavio_base, hwdef->aux1_base, hwdef->aux2_base,
-                     slavio_irq[30], fdc_tc);
+    slavio_misc_init(OBJECT(machine), hwdef->slavio_base, hwdef->aux1_base,
+                     hwdef->aux2_base, slavio_irq[30], fdc_tc);
 
     if (hwdef->cs_base) {
-        sysbus_create_simple_orphan("sun-CS4231", hwdef->cs_base,
-                             slavio_irq[5]);
+        sysbus_create_simple(OBJECT(machine), "cs4231", "sun-CS4231",
+                             hwdef->cs_base, slavio_irq[5]);
     }
 
     if (hwdef->dbri_base) {
@@ -1049,17 +1055,15 @@ static void sun4m_hw_init(MachineState *machine)
                hwdef->nvram_machine_id, "Sun4m");
 
     if (hwdef->ecc_base)
-        ecc_init(hwdef->ecc_base, slavio_irq[28],
+        ecc_init(OBJECT(machine), hwdef->ecc_base, slavio_irq[28],
                  hwdef->ecc_version);
 
-    dev = qdev_new_orphan(TYPE_FW_CFG_MEM);
+    dev = qdev_new(OBJECT(machine), TYPE_FW_CFG, TYPE_FW_CFG_MEM);
     fw_cfg = FW_CFG(dev);
     qdev_prop_set_uint32(dev, "data_width", 1);
     qdev_prop_set_bit(dev, "dma_enabled", false);
-    object_property_add_child(OBJECT(qdev_get_machine()), TYPE_FW_CFG,
-                              OBJECT(fw_cfg));
     s = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(s, &error_fatal);
+    sysbus_realize(s, &error_fatal);
     sysbus_mmio_map(s, 0, CFG_ADDR);
     sysbus_mmio_map(s, 1, CFG_ADDR + 2);
 
-- 
2.47.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.