New qdev_init_nofail()

Like qdev_init(), but terminate program via hw_error() instead of
returning an error value.

Use it instead of qdev_init() where terminating the program on failure
is okay, either because it's during machine construction, or because
we know that failure can't happen.

Because relying in the latter is somewhat unclean, and the former is
not always obvious, it would be nice to go back to qdev_init() in the
not-so-obvious cases, only with proper error handling.  I'm leaving
that for another day, because it involves making sure that error
values are properly checked by all callers.

Patchworks-ID: 35168
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
diff --git a/hw/apb_pci.c b/hw/apb_pci.c
index eb77042..72f15af 100644
--- a/hw/apb_pci.c
+++ b/hw/apb_pci.c
@@ -236,7 +236,7 @@
 
     /* Ultrasparc PBM main bus */
     dev = qdev_create(NULL, "pbm");
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     /* apb_config */
     sysbus_mmio_map(s, 0, special_base + 0x2000ULL);
diff --git a/hw/arm_sysctl.c b/hw/arm_sysctl.c
index 26300ef..72c7ccb 100644
--- a/hw/arm_sysctl.c
+++ b/hw/arm_sysctl.c
@@ -212,7 +212,7 @@
 
     dev = qdev_create(NULL, "realview_sysctl");
     qdev_prop_set_uint32(dev, "sys_id", sys_id);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     sysbus_mmio_map(sysbus_from_qdev(dev), 0, base);
 }
 
diff --git a/hw/armv7m.c b/hw/armv7m.c
index a96288d..034323d 100644
--- a/hw/armv7m.c
+++ b/hw/armv7m.c
@@ -141,12 +141,12 @@
 
     dev = qdev_create(NULL, "ARM,bitband-memory");
     qdev_prop_set_uint32(dev, "base", 0x20000000);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     sysbus_mmio_map(sysbus_from_qdev(dev), 0, 0x22000000);
 
     dev = qdev_create(NULL, "ARM,bitband-memory");
     qdev_prop_set_uint32(dev, "base", 0x40000000);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     sysbus_mmio_map(sysbus_from_qdev(dev), 0, 0x42000000);
 }
 
@@ -202,7 +202,7 @@
 
     nvic = qdev_create(NULL, "armv7m_nvic");
     env->v7m.nvic = nvic;
-    qdev_init(nvic);
+    qdev_init_nofail(nvic);
     cpu_pic = arm_pic_init_cpu(env);
     sysbus_connect_irq(sysbus_from_qdev(nvic), 0, cpu_pic[ARM_PIC_CPU_IRQ]);
     for (i = 0; i < 64; i++) {
diff --git a/hw/axis_dev88.c b/hw/axis_dev88.c
index 81a41c9..d6f14bc 100644
--- a/hw/axis_dev88.c
+++ b/hw/axis_dev88.c
@@ -300,7 +300,7 @@
     dev = qdev_create(NULL, "etraxfs,pic");
     /* FIXME: Is there a proper way to signal vectors to the CPU core?  */
     qdev_prop_set_ptr(dev, "interrupt_vector", &env->interrupt_vector);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     sysbus_mmio_map(s, 0, 0x3001c000);
     sysbus_connect_irq(s, 0, cpu_irq[0]);
diff --git a/hw/escc.c b/hw/escc.c
index 382719d..2970428 100644
--- a/hw/escc.c
+++ b/hw/escc.c
@@ -741,7 +741,7 @@
     qdev_prop_set_chr(dev, "chrA", chrA);
     qdev_prop_set_uint32(dev, "chnBtype", ser);
     qdev_prop_set_uint32(dev, "chnAtype", ser);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     sysbus_connect_irq(s, 0, irqB);
     sysbus_connect_irq(s, 1, irqA);
@@ -904,7 +904,7 @@
     qdev_prop_set_chr(dev, "chrA", NULL);
     qdev_prop_set_uint32(dev, "chnBtype", mouse);
     qdev_prop_set_uint32(dev, "chnAtype", kbd);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     sysbus_connect_irq(s, 0, irq);
     sysbus_connect_irq(s, 1, irq);
diff --git a/hw/esp.c b/hw/esp.c
index 5d86020..c2567a6 100644
--- a/hw/esp.c
+++ b/hw/esp.c
@@ -647,7 +647,7 @@
     esp->dma_memory_write = dma_memory_write;
     esp->dma_opaque = dma_opaque;
     esp->it_shift = it_shift;
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     sysbus_connect_irq(s, 0, irq);
     sysbus_mmio_map(s, 0, espaddr);
diff --git a/hw/etraxfs.c b/hw/etraxfs.c
index 4f451c5..7937e48 100644
--- a/hw/etraxfs.c
+++ b/hw/etraxfs.c
@@ -92,7 +92,7 @@
     dev = qdev_create(NULL, "etraxfs,pic");
     /* FIXME: Is there a proper way to signal vectors to the CPU core?  */
     qdev_prop_set_ptr(dev, "interrupt_vector", &env->interrupt_vector);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     sysbus_mmio_map(s, 0, 0x3001c000);
     sysbus_connect_irq(s, 0, cpu_irq[0]);
diff --git a/hw/fdc.c b/hw/fdc.c
index 6a6e7a8..f1b2f9a 100644
--- a/hw/fdc.c
+++ b/hw/fdc.c
@@ -1866,8 +1866,7 @@
     fdctrl->dma_chann = dma_chann; /* FIXME */
     qdev_prop_set_drive(dev, "driveA", fds[0]);
     qdev_prop_set_drive(dev, "driveB", fds[1]);
-    if (qdev_init(dev) != 0)
-        return NULL;
+    qdev_init_nofail(dev);
     sysbus_connect_irq(&sys->busdev, 0, irq);
     sysbus_mmio_map(&sys->busdev, 0, mmio_base);
 
@@ -1883,8 +1882,7 @@
 
     dev = qdev_create(NULL, "SUNW,fdtwo");
     qdev_prop_set_drive(dev, "drive", fds[0]);
-    if (qdev_init(dev) != 0)
-        return NULL;
+    qdev_init_nofail(dev);
     sys = DO_UPCAST(fdctrl_sysbus_t, busdev.qdev, dev);
     fdctrl = &sys->state;
     sysbus_connect_irq(&sys->busdev, 0, irq);
diff --git a/hw/grackle_pci.c b/hw/grackle_pci.c
index d878cf6..b49cf1e 100644
--- a/hw/grackle_pci.c
+++ b/hw/grackle_pci.c
@@ -138,7 +138,7 @@
     GrackleState *d;
 
     dev = qdev_create(NULL, "grackle");
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     d = FROM_SYSBUS(GrackleState, s);
     d->host_state.bus = pci_register_bus(&d->busdev.qdev, "pci",
diff --git a/hw/i2c.c b/hw/i2c.c
index 6cd4701..5c291ce 100644
--- a/hw/i2c.c
+++ b/hw/i2c.c
@@ -189,6 +189,6 @@
 
     dev = qdev_create(&bus->qbus, name);
     qdev_prop_set_uint8(dev, "address", addr);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     return dev;
 }
diff --git a/hw/ide/pci.c b/hw/ide/pci.c
index 6d090bc..9504e44 100644
--- a/hw/ide/pci.c
+++ b/hw/ide/pci.c
@@ -445,7 +445,7 @@
 
     dev = pci_create(bus, -1, "CMD646 IDE");
     qdev_prop_set_uint32(&dev->qdev, "secondary", secondary_ide_enabled);
-    qdev_init(&dev->qdev);
+    qdev_init_nofail(&dev->qdev);
 
     pci_ide_create_devs(dev, hd_table);
 }
diff --git a/hw/integratorcp.c b/hw/integratorcp.c
index 21e7712..bee8298 100644
--- a/hw/integratorcp.c
+++ b/hw/integratorcp.c
@@ -477,7 +477,7 @@
 
     dev = qdev_create(NULL, "integrator_core");
     qdev_prop_set_uint32(dev, "memsz", ram_size >> 20);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     sysbus_mmio_map((SysBusDevice *)dev, 0, 0x10000000);
 
     cpu_pic = arm_pic_init_cpu(env);
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index fb90be4..f7e73d2 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -45,7 +45,7 @@
     }
     if (NULL == dev) {
         dev = qdev_create(NULL, "isabus-bridge");
-        qdev_init(dev);
+        qdev_init_nofail(dev);
     }
 
     isabus = FROM_QBUS(ISABus, qbus_create(&isa_bus_info, dev, NULL));
diff --git a/hw/m48t59.c b/hw/m48t59.c
index b9892cc..0f45071 100644
--- a/hw/m48t59.c
+++ b/hw/m48t59.c
@@ -636,7 +636,7 @@
     qdev_prop_set_uint32(dev, "type", type);
     qdev_prop_set_uint32(dev, "size", size);
     qdev_prop_set_uint32(dev, "io_base", io_base);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     sysbus_connect_irq(s, 0, IRQ);
     if (io_base != 0) {
@@ -662,7 +662,7 @@
     qdev_prop_set_uint32(&dev->qdev, "type", type);
     qdev_prop_set_uint32(&dev->qdev, "size", size);
     qdev_prop_set_uint32(&dev->qdev, "io_base", io_base);
-    qdev_init(&dev->qdev);
+    qdev_init_nofail(&dev->qdev);
     d = DO_UPCAST(M48t59ISAState, busdev, dev);
     s = &d->state;
 
diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
index bec5687..d82131a 100644
--- a/hw/mc146818rtc.c
+++ b/hw/mc146818rtc.c
@@ -637,7 +637,7 @@
 
     dev = isa_create("mc146818rtc");
     qdev_prop_set_int32(&dev->qdev, "base_year", base_year);
-    qdev_init(&dev->qdev);
+    qdev_init_nofail(&dev->qdev);
     return DO_UPCAST(RTCState, dev, dev);
 }
 
diff --git a/hw/mips_malta.c b/hw/mips_malta.c
index d0266d5..b26bbee 100644
--- a/hw/mips_malta.c
+++ b/hw/mips_malta.c
@@ -933,7 +933,7 @@
         eeprom = qdev_create((BusState *)smbus, "smbus-eeprom");
         qdev_prop_set_uint8(eeprom, "address", 0x50 + i);
         qdev_prop_set_ptr(eeprom, "data", eeprom_buf + (i * 256));
-        qdev_init(eeprom);
+        qdev_init_nofail(eeprom);
     }
     pit = pit_init(0x40, isa_reserve_irq(0));
     DMA_init(0);
diff --git a/hw/musicpal.c b/hw/musicpal.c
index 1fad36f..02d4c70 100644
--- a/hw/musicpal.c
+++ b/hw/musicpal.c
@@ -1551,7 +1551,7 @@
     qemu_check_nic_model(&nd_table[0], "mv88w8618");
     dev = qdev_create(NULL, "mv88w8618_eth");
     dev->nd = &nd_table[0];
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     sysbus_mmio_map(sysbus_from_qdev(dev), 0, MP_ETH_BASE);
     sysbus_connect_irq(sysbus_from_qdev(dev), 0, pic[MP_ETH_IRQ]);
 
@@ -1589,7 +1589,7 @@
     dev = qdev_create(NULL, "mv88w8618_audio");
     s = sysbus_from_qdev(dev);
     qdev_prop_set_ptr(dev, "wm8750", wm8750_dev);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     sysbus_mmio_map(s, 0, MP_AUDIO_BASE);
     sysbus_connect_irq(s, 0, pic[MP_AUDIO_IRQ]);
 #endif
diff --git a/hw/ne2000-isa.c b/hw/ne2000-isa.c
index 54c0478..e346731 100644
--- a/hw/ne2000-isa.c
+++ b/hw/ne2000-isa.c
@@ -87,7 +87,7 @@
     dev->qdev.nd = nd; /* hack alert */
     qdev_prop_set_uint32(&dev->qdev, "iobase", base);
     qdev_prop_set_uint32(&dev->qdev, "irq",    irq);
-    qdev_init(&dev->qdev);
+    qdev_init_nofail(&dev->qdev);
 }
 
 static ISADeviceInfo ne2000_isa_info = {
diff --git a/hw/pc.c b/hw/pc.c
index 2ca15a3..19bef49 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -1294,7 +1294,7 @@
             eeprom = qdev_create((BusState *)smbus, "smbus-eeprom");
             qdev_prop_set_uint8(eeprom, "address", 0x50 + i);
             qdev_prop_set_ptr(eeprom, "data", eeprom_buf + (i * 256));
-            qdev_init(eeprom);
+            qdev_init_nofail(eeprom);
         }
         piix4_acpi_system_hot_add_init(pci_bus);
     }
diff --git a/hw/pci.c b/hw/pci.c
index da5cc56..49651d0 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -946,7 +946,7 @@
     dev = pci_create(bus, devfn, "pci-bridge");
     qdev_prop_set_uint32(&dev->qdev, "vendorid", vid);
     qdev_prop_set_uint32(&dev->qdev, "deviceid", did);
-    qdev_init(&dev->qdev);
+    qdev_init_nofail(&dev->qdev);
 
     s = DO_UPCAST(PCIBridge, dev, dev);
     pci_register_secondary_bus(&s->bus, &s->dev, map_irq, name);
@@ -1010,7 +1010,7 @@
 PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name)
 {
     PCIDevice *dev = pci_create(bus, devfn, name);
-    qdev_init(&dev->qdev);
+    qdev_init_nofail(&dev->qdev);
     return dev;
 }
 
diff --git a/hw/piix_pci.c b/hw/piix_pci.c
index 3cc7333..ed036fe 100644
--- a/hw/piix_pci.c
+++ b/hw/piix_pci.c
@@ -234,7 +234,7 @@
     s = FROM_SYSBUS(I440FXState, sysbus_from_qdev(dev));
     b = pci_bus_new(&s->busdev.qdev, NULL, 0);
     s->bus = b;
-    qdev_init(dev);
+    qdev_init_nofail(dev);
 
     d = pci_create_simple(b, 0, "i440FX");
     *pi440fx_state = DO_UPCAST(PCII440FXState, dev, d);
diff --git a/hw/qdev.c b/hw/qdev.c
index 8a62001..ca60923 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -269,6 +269,21 @@
     return 0;
 }
 
+/* Like qdev_init(), but terminate program via hw_error() instead of
+   returning an error value.  This is okay during machine creation.
+   Don't use for hotplug, because there callers need to recover from
+   failure.  Exception: if you know the device's init() callback can't
+   fail, then qdev_init_nofail() can't fail either, and is therefore
+   usable even then.  But relying on the device implementation that
+   way is somewhat unclean, and best avoided.  */
+void qdev_init_nofail(DeviceState *dev)
+{
+    DeviceInfo *info = dev->info;
+
+    if (qdev_init(dev) < 0)
+        hw_error("Initialization of device %s failed\n", info->name);
+}
+
 /* Unlink device from bus and free the structure.  */
 void qdev_free(DeviceState *dev)
 {
diff --git a/hw/qdev.h b/hw/qdev.h
index 893ae92..b385b25 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -101,6 +101,7 @@
 DeviceState *qdev_create(BusState *bus, const char *name);
 DeviceState *qdev_device_add(QemuOpts *opts);
 int qdev_init(DeviceState *dev);
+void qdev_init_nofail(DeviceState *dev);
 int qdev_unplug(DeviceState *dev);
 void qdev_free(DeviceState *dev);
 int qdev_simple_unplug_cb(DeviceState *dev);
diff --git a/hw/smc91c111.c b/hw/smc91c111.c
index a08bdb0..d58821a 100644
--- a/hw/smc91c111.c
+++ b/hw/smc91c111.c
@@ -735,7 +735,7 @@
     qemu_check_nic_model(nd, "smc91c111");
     dev = qdev_create(NULL, "smc91c111");
     dev->nd = nd;
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     sysbus_mmio_map(s, 0, base);
     sysbus_connect_irq(s, 0, irq);
diff --git a/hw/ssi.c b/hw/ssi.c
index 73cb541..cfe7c07 100644
--- a/hw/ssi.c
+++ b/hw/ssi.c
@@ -46,7 +46,7 @@
 {
     DeviceState *dev;
     dev = qdev_create(&bus->qbus, name);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     return dev;
 }
 
diff --git a/hw/stellaris.c b/hw/stellaris.c
index bcde0a2..1628914 100644
--- a/hw/stellaris.c
+++ b/hw/stellaris.c
@@ -1384,7 +1384,7 @@
 
         enet = qdev_create(NULL, "stellaris_enet");
         enet->nd = &nd_table[0];
-        qdev_init(enet);
+        qdev_init_nofail(enet);
         sysbus_mmio_map(sysbus_from_qdev(enet), 0, 0x40048000);
         sysbus_connect_irq(sysbus_from_qdev(enet), 0, pic[42]);
     }
diff --git a/hw/sun4m.c b/hw/sun4m.c
index 01c7cb4..8f46a0f 100644
--- a/hw/sun4m.c
+++ b/hw/sun4m.c
@@ -359,7 +359,7 @@
 
     dev = qdev_create(NULL, "iommu");
     qdev_prop_set_uint32(dev, "version", version);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     sysbus_connect_irq(s, 0, irq);
     sysbus_mmio_map(s, 0, addr);
@@ -375,7 +375,7 @@
 
     dev = qdev_create(NULL, "sparc32_dma");
     qdev_prop_set_ptr(dev, "iommu_opaque", iommu);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     sysbus_connect_irq(s, 0, parent_irq);
     *dev_irq = qdev_get_gpio_in(dev, 0);
@@ -396,7 +396,7 @@
     dev = qdev_create(NULL, "lance");
     dev->nd = nd;
     qdev_prop_set_ptr(dev, "dma", dma_opaque);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     sysbus_mmio_map(s, 0, leaddr);
     sysbus_connect_irq(s, 0, irq);
@@ -413,7 +413,7 @@
     unsigned int i, j;
 
     dev = qdev_create(NULL, "slavio_intctl");
-    qdev_init(dev);
+    qdev_init_nofail(dev);
 
     s = sysbus_from_qdev(dev);
 
@@ -442,7 +442,7 @@
 
     dev = qdev_create(NULL, "slavio_timer");
     qdev_prop_set_uint32(dev, "num_cpus", num_cpus);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     sysbus_connect_irq(s, 0, master_irq);
     sysbus_mmio_map(s, 0, addr + SYS_TIMER_OFFSET);
@@ -468,7 +468,7 @@
     SysBusDevice *s;
 
     dev = qdev_create(NULL, "slavio_misc");
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     if (base) {
         /* 8 bit registers */
@@ -505,7 +505,7 @@
 
     dev = qdev_create(NULL, "eccmemctl");
     qdev_prop_set_uint32(dev, "version", version);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     sysbus_connect_irq(s, 0, irq);
     sysbus_mmio_map(s, 0, base);
@@ -520,7 +520,7 @@
     SysBusDevice *s;
 
     dev = qdev_create(NULL, "apc");
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     /* Power management (APC) XXX: not a Slavio device */
     sysbus_mmio_map(s, 0, power_base);
@@ -539,7 +539,7 @@
     qdev_prop_set_uint16(dev, "width", width);
     qdev_prop_set_uint16(dev, "height", height);
     qdev_prop_set_uint16(dev, "depth", depth);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     /* 8-bit plane */
     sysbus_mmio_map(s, 0, addr + 0x00800000ULL);
@@ -569,7 +569,7 @@
     SysBusDevice *s;
 
     dev = qdev_create(NULL, "macio_idreg");
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
 
     sysbus_mmio_map(s, 0, addr);
@@ -607,7 +607,7 @@
     int ret;
 
     dev = qdev_create(NULL, "openprom");
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
 
     sysbus_mmio_map(s, 0, addr);
@@ -697,7 +697,7 @@
 
     d = FROM_SYSBUS(RamDevice, s);
     d->size = RAM_size;
-    qdev_init(dev);
+    qdev_init_nofail(dev);
 
     sysbus_mmio_map(s, 0, addr);
 }
@@ -1344,7 +1344,7 @@
     unsigned int i;
 
     dev = qdev_create(NULL, "sbi");
-    qdev_init(dev);
+    qdev_init_nofail(dev);
 
     s = sysbus_from_qdev(dev);
 
@@ -1534,7 +1534,7 @@
     unsigned int i;
 
     dev = qdev_create(NULL, "sun4c_intctl");
-    qdev_init(dev);
+    qdev_init_nofail(dev);
 
     s = sysbus_from_qdev(dev);
 
diff --git a/hw/sun4u.c b/hw/sun4u.c
index 58d708a..276b17b 100644
--- a/hw/sun4u.c
+++ b/hw/sun4u.c
@@ -415,7 +415,7 @@
     int ret;
 
     dev = qdev_create(NULL, "openprom");
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
 
     sysbus_mmio_map(s, 0, addr);
@@ -498,7 +498,7 @@
 
     d = FROM_SYSBUS(RamDevice, s);
     d->size = RAM_size;
-    qdev_init(dev);
+    qdev_init_nofail(dev);
 
     sysbus_mmio_map(s, 0, addr);
 }
diff --git a/hw/syborg.c b/hw/syborg.c
index d8d38d4..2aec769 100644
--- a/hw/syborg.c
+++ b/hw/syborg.c
@@ -65,7 +65,7 @@
 
     dev = qdev_create(NULL, "syborg,timer");
     qdev_prop_set_uint32(dev, "frequency", 1000000);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     sysbus_mmio_map(sysbus_from_qdev(dev), 0, 0xC0002000);
     sysbus_connect_irq(sysbus_from_qdev(dev), 0, pic[1]);
 
@@ -84,7 +84,7 @@
         qemu_check_nic_model(&nd_table[0], "virtio");
         dev = qdev_create(NULL, "syborg,virtio-net");
         dev->nd = &nd_table[0];
-        qdev_init(dev);
+        qdev_init_nofail(dev);
         s = sysbus_from_qdev(dev);
         sysbus_mmio_map(s, 0, 0xc000c000);
         sysbus_connect_irq(s, 0, pic[9]);
diff --git a/hw/sysbus.c b/hw/sysbus.c
index f6516fd..1f7f138 100644
--- a/hw/sysbus.c
+++ b/hw/sysbus.c
@@ -143,7 +143,7 @@
 
     dev = qdev_create(NULL, name);
     s = sysbus_from_qdev(dev);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     if (addr != (target_phys_addr_t)-1) {
         sysbus_mmio_map(s, 0, addr);
     }
diff --git a/hw/unin_pci.c b/hw/unin_pci.c
index a202153..4abb5c8 100644
--- a/hw/unin_pci.c
+++ b/hw/unin_pci.c
@@ -253,7 +253,7 @@
     /* Use values found on a real PowerMac */
     /* Uninorth main bus */
     dev = qdev_create(NULL, "Uni-north main");
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     s = sysbus_from_qdev(dev);
     d = FROM_SYSBUS(UNINState, s);
     d->host_state.bus = pci_register_bus(&d->busdev.qdev, "pci",
diff --git a/hw/usb-bus.c b/hw/usb-bus.c
index 0c63279..98987a1 100644
--- a/hw/usb-bus.c
+++ b/hw/usb-bus.c
@@ -101,7 +101,7 @@
 USBDevice *usb_create_simple(USBBus *bus, const char *name)
 {
     USBDevice *dev = usb_create(bus, name);
-    qdev_init(&dev->qdev);
+    qdev_init_nofail(&dev->qdev);
     return dev;
 }
 
diff --git a/hw/vga-pci.c b/hw/vga-pci.c
index 7cb2d6f..5e75938 100644
--- a/hw/vga-pci.c
+++ b/hw/vga-pci.c
@@ -128,7 +128,7 @@
     dev = pci_create(bus, -1, "VGA");
     qdev_prop_set_uint32(&dev->qdev, "bios-offset", vga_bios_offset);
     qdev_prop_set_uint32(&dev->qdev, "bios-size", vga_bios_offset);
-    qdev_init(&dev->qdev);
+    qdev_init_nofail(&dev->qdev);
 
     return 0;
 }
diff --git a/hw/xilinx.h b/hw/xilinx.h
index 070679c..5e6aeea 100644
--- a/hw/xilinx.h
+++ b/hw/xilinx.h
@@ -9,7 +9,7 @@
 
     dev = qdev_create(NULL, "xilinx,intc");
     qdev_prop_set_uint32(dev, "kind-of-intr", kind_of_intr);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     sysbus_mmio_map(sysbus_from_qdev(dev), 0, base);
     sysbus_connect_irq(sysbus_from_qdev(dev), 0, irq);
     return dev;
@@ -24,7 +24,7 @@
     dev = qdev_create(NULL, "xilinx,timer");
     qdev_prop_set_uint32(dev, "nr-timers", nr);
     qdev_prop_set_uint32(dev, "frequency", freq);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     sysbus_mmio_map(sysbus_from_qdev(dev), 0, base);
     sysbus_connect_irq(sysbus_from_qdev(dev), 0, irq);
     return dev;
@@ -43,7 +43,7 @@
     dev->nd = nd;
     qdev_prop_set_uint32(dev, "txpingpong", txpingpong);
     qdev_prop_set_uint32(dev, "rxpingpong", rxpingpong);
-    qdev_init(dev);
+    qdev_init_nofail(dev);
     sysbus_mmio_map(sysbus_from_qdev(dev), 0, base);
     sysbus_connect_irq(sysbus_from_qdev(dev), 0, irq);
     return dev;