qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC v3 7/8] memory: extend memory_region_add_subregion() t


From: Igor Mammedov
Subject: [Qemu-devel] [RFC v3 7/8] memory: extend memory_region_add_subregion() to support error reporting
Date: Wed, 8 Jul 2015 11:46:47 +0200

extends memory_region_add_subregion() by adding Error**
argument to allow t fail and return a error from it.

Signed-off-by: Igor Mammedov <address@hidden>
---
 hw/acpi/core.c                           |  6 ++--
 hw/acpi/cpu_hotplug.c                    |  2 +-
 hw/acpi/ich9.c                           |  8 +++--
 hw/acpi/memory_hotplug.c                 |  3 +-
 hw/acpi/pcihp.c                          |  3 +-
 hw/acpi/piix4.c                          |  6 ++--
 hw/alpha/typhoon.c                       | 16 ++++-----
 hw/arm/armv7m.c                          |  2 +-
 hw/arm/cubieboard.c                      |  2 +-
 hw/arm/digic_boards.c                    |  2 +-
 hw/arm/exynos4210.c                      | 12 +++----
 hw/arm/highbank.c                        |  4 +--
 hw/arm/integratorcp.c                    |  5 +--
 hw/arm/kzm.c                             |  9 +++--
 hw/arm/mainstone.c                       |  2 +-
 hw/arm/musicpal.c                        |  5 +--
 hw/arm/omap1.c                           | 59 ++++++++++++++++++--------------
 hw/arm/omap2.c                           |  8 +++--
 hw/arm/omap_sx1.c                        | 19 ++++++----
 hw/arm/palm.c                            | 14 +++++---
 hw/arm/pxa2xx.c                          | 30 ++++++++++------
 hw/arm/realview.c                        |  8 ++---
 hw/arm/spitz.c                           |  2 +-
 hw/arm/stellaris.c                       |  7 ++--
 hw/arm/stm32f205_soc.c                   |  8 +++--
 hw/arm/strongarm.c                       |  2 +-
 hw/arm/tosa.c                            |  2 +-
 hw/arm/versatilepb.c                     |  2 +-
 hw/arm/vexpress.c                        | 15 ++++----
 hw/arm/virt.c                            | 12 ++++---
 hw/arm/xilinx_zynq.c                     |  5 +--
 hw/arm/xlnx-ep108.c                      |  3 +-
 hw/arm/xlnx-zynqmp.c                     |  3 +-
 hw/block/onenand.c                       |  2 +-
 hw/block/pflash_cfi02.c                  |  3 +-
 hw/char/debugcon.c                       |  2 +-
 hw/char/mcf_uart.c                       |  2 +-
 hw/char/omap_uart.c                      |  2 +-
 hw/char/parallel.c                       |  2 +-
 hw/char/serial-pci.c                     |  2 +-
 hw/char/serial.c                         |  4 +--
 hw/char/sh_serial.c                      |  6 ++--
 hw/core/platform-bus.c                   |  2 +-
 hw/core/sysbus.c                         |  4 +--
 hw/cpu/a15mpcore.c                       |  6 ++--
 hw/cpu/a9mpcore.c                        | 18 ++++++----
 hw/cpu/arm11mpcore.c                     | 15 +++++---
 hw/cris/axis_dev88.c                     | 10 +++---
 hw/display/cirrus_vga.c                  | 11 +++---
 hw/display/omap_dss.c                    |  2 +-
 hw/display/omap_lcdc.c                   |  2 +-
 hw/display/pxa2xx_lcd.c                  |  2 +-
 hw/display/sm501.c                       |  9 ++---
 hw/display/tc6393xb.c                    |  5 +--
 hw/display/vga-isa-mm.c                  |  6 ++--
 hw/display/vga-pci.c                     |  6 ++--
 hw/display/vga.c                         |  3 +-
 hw/dma/etraxfs_dma.c                     |  3 +-
 hw/dma/i8257.c                           |  5 +--
 hw/dma/omap_dma.c                        |  4 +--
 hw/dma/rc4030.c                          |  4 +--
 hw/i386/kvm/pci-assign.c                 |  6 ++--
 hw/i386/pc.c                             | 12 ++++---
 hw/i386/pc_sysfw.c                       |  2 +-
 hw/ide/cmd646.c                          |  6 ++--
 hw/ide/piix.c                            |  6 ++--
 hw/ide/via.c                             |  6 ++--
 hw/input/pxa2xx_keypad.c                 |  2 +-
 hw/intc/apic_common.c                    |  3 +-
 hw/intc/armv7m_nvic.c                    |  5 +--
 hw/intc/exynos4210_gic.c                 |  6 ++--
 hw/intc/openpic.c                        |  2 +-
 hw/intc/realview_gic.c                   |  6 ++--
 hw/intc/sh_intc.c                        |  6 ++--
 hw/isa/apm.c                             |  2 +-
 hw/isa/isa-bus.c                         |  3 +-
 hw/isa/vt82c686.c                        |  7 ++--
 hw/lm32/lm32_boards.c                    |  6 ++--
 hw/lm32/milkymist.c                      |  3 +-
 hw/m68k/an5206.c                         |  5 +--
 hw/m68k/dummy_m68k.c                     |  2 +-
 hw/m68k/mcf5206.c                        |  2 +-
 hw/m68k/mcf5208.c                        | 10 +++---
 hw/m68k/mcf_intc.c                       |  2 +-
 hw/mem/pc-dimm.c                         |  2 +-
 hw/microblaze/petalogix_ml605_mmu.c      |  6 ++--
 hw/microblaze/petalogix_s3adsp1800_mmu.c |  5 +--
 hw/mips/gt64xxx_pci.c                    |  9 ++---
 hw/mips/mips_fulong2e.c                  |  5 +--
 hw/mips/mips_jazz.c                      | 30 ++++++++++------
 hw/mips/mips_malta.c                     | 17 +++++----
 hw/mips/mips_mipssim.c                   | 11 +++---
 hw/mips/mips_r4k.c                       | 14 +++++---
 hw/misc/debugexit.c                      |  2 +-
 hw/misc/ivshmem.c                        |  4 +--
 hw/misc/macio/macio.c                    | 24 +++++++------
 hw/misc/omap_gpmc.c                      |  7 ++--
 hw/misc/omap_l4.c                        |  3 +-
 hw/misc/omap_sdrc.c                      |  2 +-
 hw/misc/pc-testdev.c                     | 11 +++---
 hw/moxie/moxiesim.c                      |  4 +--
 hw/net/fsl_etsec/etsec.c                 |  3 +-
 hw/net/mcf_fec.c                         |  2 +-
 hw/openrisc/openrisc_sim.c               |  6 ++--
 hw/pci-host/apb.c                        |  3 +-
 hw/pci-host/grackle.c                    |  2 +-
 hw/pci-host/piix.c                       |  3 +-
 hw/pci-host/ppce500.c                    | 13 ++++---
 hw/pci-host/prep.c                       | 24 ++++++++-----
 hw/pci-host/q35.c                        |  8 +++--
 hw/pci-host/uninorth.c                   |  4 +--
 hw/pci/msix.c                            |  6 ++--
 hw/pci/pcie_host.c                       |  3 +-
 hw/pci/shpc.c                            |  2 +-
 hw/pcmcia/pxa2xx.c                       |  6 ++--
 hw/ppc/e500.c                            | 14 ++++----
 hw/ppc/mac_newworld.c                    | 14 +++++---
 hw/ppc/mac_oldworld.c                    |  6 ++--
 hw/ppc/ppc405_boards.c                   | 12 ++++---
 hw/ppc/ppc405_uc.c                       | 16 +++++----
 hw/ppc/ppc440_bamboo.c                   |  3 +-
 hw/ppc/ppc4xx_devs.c                     |  4 +--
 hw/ppc/ppc4xx_pci.c                      |  9 +++--
 hw/ppc/prep.c                            |  4 +--
 hw/ppc/spapr.c                           |  4 +--
 hw/ppc/spapr_pci.c                       |  8 ++---
 hw/ppc/spapr_pci_vfio.c                  |  2 +-
 hw/ppc/virtex_ml507.c                    |  3 +-
 hw/s390x/s390-virtio-ccw.c               |  2 +-
 hw/s390x/s390-virtio.c                   |  2 +-
 hw/s390x/sclp.c                          |  3 +-
 hw/sd/omap_mmc.c                         |  2 +-
 hw/sd/pxa2xx_mmci.c                      |  2 +-
 hw/sh4/r2d.c                             |  5 +--
 hw/sh4/sh7750.c                          | 21 ++++++++----
 hw/sh4/sh_pci.c                          |  6 ++--
 hw/sh4/shix.c                            |  6 ++--
 hw/sparc/leon3.c                         |  6 ++--
 hw/sparc64/sun4u.c                       |  2 +-
 hw/timer/m48t59.c                        |  3 +-
 hw/timer/sh_timer.c                      |  6 ++--
 hw/tpm/tpm_tis.c                         |  2 +-
 hw/tricore/tricore_testboard.c           | 12 +++----
 hw/unicore32/puv3.c                      |  6 ++--
 hw/usb/hcd-ehci-sysbus.c                 |  2 +-
 hw/usb/hcd-ehci.c                        |  8 +++--
 hw/usb/hcd-xhci.c                        | 15 +++++---
 hw/vfio/common.c                         |  2 +-
 hw/vfio/pci.c                            |  6 ++--
 hw/virtio/virtio-pci.c                   |  3 +-
 hw/xtensa/sim.c                          |  5 +--
 hw/xtensa/xtfpga.c                       | 18 +++++-----
 include/exec/memory.h                    |  3 +-
 ioport.c                                 |  2 +-
 memory.c                                 |  9 ++---
 numa.c                                   |  2 +-
 156 files changed, 619 insertions(+), 420 deletions(-)

diff --git a/hw/acpi/core.c b/hw/acpi/core.c
index fe6215a..4269240 100644
--- a/hw/acpi/core.c
+++ b/hw/acpi/core.c
@@ -465,7 +465,7 @@ void acpi_pm1_evt_init(ACPIREGS *ar, acpi_update_sci_fn 
update_sci,
     ar->pm1.evt.update_sci = update_sci;
     memory_region_init_io(&ar->pm1.evt.io, memory_region_owner(parent),
                           &acpi_pm_evt_ops, ar, "acpi-evt", 4);
-    memory_region_add_subregion(parent, 0, &ar->pm1.evt.io);
+    memory_region_add_subregion(parent, 0, &ar->pm1.evt.io, &error_abort);
 }
 
 /* ACPI PM_TMR */
@@ -529,7 +529,7 @@ void acpi_pm_tmr_init(ACPIREGS *ar, acpi_update_sci_fn 
update_sci,
     memory_region_init_io(&ar->tmr.io, memory_region_owner(parent),
                           &acpi_pm_tmr_ops, ar, "acpi-tmr", 4);
     memory_region_clear_global_locking(&ar->tmr.io);
-    memory_region_add_subregion(parent, 8, &ar->tmr.io);
+    memory_region_add_subregion(parent, 8, &ar->tmr.io, &error_abort);
 }
 
 void acpi_pm_tmr_reset(ACPIREGS *ar)
@@ -604,7 +604,7 @@ void acpi_pm1_cnt_init(ACPIREGS *ar, MemoryRegion *parent,
     qemu_register_wakeup_notifier(&ar->wakeup);
     memory_region_init_io(&ar->pm1.cnt.io, memory_region_owner(parent),
                           &acpi_pm_cnt_ops, ar, "acpi-cnt", 2);
-    memory_region_add_subregion(parent, 4, &ar->pm1.cnt.io);
+    memory_region_add_subregion(parent, 4, &ar->pm1.cnt.io, &error_abort);
 
     fw_cfg = fw_cfg_find();
     if (fw_cfg) {
diff --git a/hw/acpi/cpu_hotplug.c b/hw/acpi/cpu_hotplug.c
index f5b9972..7678fec 100644
--- a/hw/acpi/cpu_hotplug.c
+++ b/hw/acpi/cpu_hotplug.c
@@ -72,5 +72,5 @@ void acpi_cpu_hotplug_init(MemoryRegion *parent, Object 
*owner,
     }
     memory_region_init_io(&gpe_cpu->io, owner, &AcpiCpuHotplug_ops,
                           gpe_cpu, "acpi-cpu-hotplug", ACPI_GPE_PROC_LEN);
-    memory_region_add_subregion(parent, base, &gpe_cpu->io);
+    memory_region_add_subregion(parent, base, &gpe_cpu->io, &error_abort);
 }
diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c
index f4dc7a8..daf5a28 100644
--- a/hw/acpi/ich9.c
+++ b/hw/acpi/ich9.c
@@ -215,7 +215,7 @@ void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm, 
bool smm_enabled,
     memory_region_init(&pm->io, OBJECT(lpc_pci), "ich9-pm", ICH9_PMIO_SIZE);
     memory_region_set_enabled(&pm->io, false);
     memory_region_add_subregion(pci_address_space_io(lpc_pci),
-                                0, &pm->io);
+                                0, &pm->io, &error_abort);
 
     acpi_pm_tmr_init(&pm->acpi_regs, ich9_pm_update_sci_fn, &pm->io);
     acpi_pm1_evt_init(&pm->acpi_regs, ich9_pm_update_sci_fn, &pm->io);
@@ -225,11 +225,13 @@ void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm, 
bool smm_enabled,
     acpi_gpe_init(&pm->acpi_regs, ICH9_PMIO_GPE0_LEN);
     memory_region_init_io(&pm->io_gpe, OBJECT(lpc_pci), &ich9_gpe_ops, pm,
                           "acpi-gpe0", ICH9_PMIO_GPE0_LEN);
-    memory_region_add_subregion(&pm->io, ICH9_PMIO_GPE0_STS, &pm->io_gpe);
+    memory_region_add_subregion(&pm->io, ICH9_PMIO_GPE0_STS, &pm->io_gpe,
+                                &error_abort);
 
     memory_region_init_io(&pm->io_smi, OBJECT(lpc_pci), &ich9_smi_ops, pm,
                           "acpi-smi", 8);
-    memory_region_add_subregion(&pm->io, ICH9_PMIO_SMI_EN, &pm->io_smi);
+    memory_region_add_subregion(&pm->io, ICH9_PMIO_SMI_EN, &pm->io_smi,
+                                &error_abort);
 
     pm->smm_enabled = smm_enabled;
     pm->irq = sci_irq;
diff --git a/hw/acpi/memory_hotplug.c b/hw/acpi/memory_hotplug.c
index 2ff0d5c..81695cc 100644
--- a/hw/acpi/memory_hotplug.c
+++ b/hw/acpi/memory_hotplug.c
@@ -188,7 +188,8 @@ void acpi_memory_hotplug_init(MemoryRegion *as, Object 
*owner,
     state->devs = g_malloc0(sizeof(*state->devs) * state->dev_count);
     memory_region_init_io(&state->io, owner, &acpi_memory_hotplug_ops, state,
                           "acpi-mem-hotplug", ACPI_MEMORY_HOTPLUG_IO_LEN);
-    memory_region_add_subregion(as, ACPI_MEMORY_HOTPLUG_BASE, &state->io);
+    memory_region_add_subregion(as, ACPI_MEMORY_HOTPLUG_BASE, &state->io,
+                                &error_abort);
 }
 
 /**
diff --git a/hw/acpi/pcihp.c b/hw/acpi/pcihp.c
index fbbc4dd..e1b804a 100644
--- a/hw/acpi/pcihp.c
+++ b/hw/acpi/pcihp.c
@@ -314,7 +314,8 @@ void acpi_pcihp_init(Object *owner, AcpiPciHpState *s, 
PCIBus *root_bus,
 
     memory_region_init_io(&s->io, owner, &acpi_pcihp_io_ops, s,
                           "acpi-pci-hotplug", s->io_len);
-    memory_region_add_subregion(address_space_io, s->io_base, &s->io);
+    memory_region_add_subregion(address_space_io, s->io_base, &s->io,
+                                &error_abort);
 
     object_property_add_uint16_ptr(owner, ACPI_PCIHP_IO_BASE_PROP, &s->io_base,
                                    &error_abort);
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
index 2cd2fee..634986c 100644
--- a/hw/acpi/piix4.c
+++ b/hw/acpi/piix4.c
@@ -467,12 +467,12 @@ static void piix4_pm_realize(PCIDevice *dev, Error **errp)
     pm_smbus_init(DEVICE(dev), &s->smb);
     memory_region_set_enabled(&s->smb.io, pci_conf[0xd2] & 1);
     memory_region_add_subregion(pci_address_space_io(dev),
-                                s->smb_io_base, &s->smb.io);
+                                s->smb_io_base, &s->smb.io, &error_abort);
 
     memory_region_init(&s->io, OBJECT(s), "piix4-pm", 64);
     memory_region_set_enabled(&s->io, false);
     memory_region_add_subregion(pci_address_space_io(dev),
-                                0, &s->io);
+                                0, &s->io, &error_abort);
 
     acpi_pm_tmr_init(&s->ar, pm_tmr_timer, &s->io);
     acpi_pm1_evt_init(&s->ar, pm_tmr_timer, &s->io);
@@ -563,7 +563,7 @@ static void piix4_acpi_system_hot_add_init(MemoryRegion 
*parent,
 {
     memory_region_init_io(&s->io_gpe, OBJECT(s), &piix4_gpe_ops, s,
                           "acpi-gpe0", GPE_LEN);
-    memory_region_add_subregion(parent, GPE_BASE, &s->io_gpe);
+    memory_region_add_subregion(parent, GPE_BASE, &s->io_gpe, &error_abort);
 
     acpi_pcihp_init(OBJECT(s), &s->acpi_pci_hotplug, bus, parent,
                     s->use_acpi_pci_hotplug);
diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c
index 421162e..4881491 100644
--- a/hw/alpha/typhoon.c
+++ b/hw/alpha/typhoon.c
@@ -847,7 +847,7 @@ PCIBus *typhoon_init(ram_addr_t ram_size, ISABus **isa_bus,
        but the address space hole reserved at this point is 8TB.  */
     memory_region_allocate_system_memory(&s->ram_region, OBJECT(s), "ram",
                                          ram_size);
-    memory_region_add_subregion(addr_space, 0, &s->ram_region);
+    memory_region_add_subregion(addr_space, 0, &s->ram_region, &error_abort);
 
     /* TIGbus, 0x801.0000.0000, 1GB.  */
     /* ??? The TIGbus is used for delivering interrupts, and access to
@@ -857,30 +857,30 @@ PCIBus *typhoon_init(ram_addr_t ram_size, ISABus 
**isa_bus,
     memory_region_init_io(&s->pchip.region, OBJECT(s), &pchip_ops, s, "pchip0",
                           256*MB);
     memory_region_add_subregion(addr_space, 0x80180000000ULL,
-                                &s->pchip.region);
+                                &s->pchip.region, &error_abort);
 
     /* Cchip CSRs, 0x801.A000.0000, 256MB.  */
     memory_region_init_io(&s->cchip.region, OBJECT(s), &cchip_ops, s, "cchip0",
                           256*MB);
     memory_region_add_subregion(addr_space, 0x801a0000000ULL,
-                                &s->cchip.region);
+                                &s->cchip.region, &error_abort);
 
     /* Dchip CSRs, 0x801.B000.0000, 256MB.  */
     memory_region_init_io(&s->dchip_region, OBJECT(s), &dchip_ops, s, "dchip0",
                           256*MB);
     memory_region_add_subregion(addr_space, 0x801b0000000ULL,
-                                &s->dchip_region);
+                                &s->dchip_region, &error_abort);
 
     /* Pchip0 PCI memory, 0x800.0000.0000, 4GB.  */
     memory_region_init(&s->pchip.reg_mem, OBJECT(s), "pci0-mem", 4*GB);
     memory_region_add_subregion(addr_space, 0x80000000000ULL,
-                                &s->pchip.reg_mem);
+                                &s->pchip.reg_mem, &error_abort);
 
     /* Pchip0 PCI I/O, 0x801.FC00.0000, 32MB.  */
     memory_region_init_io(&s->pchip.reg_io, OBJECT(s), &alpha_pci_ignore_ops,
                           NULL, "pci0-io", 32*MB);
     memory_region_add_subregion(addr_space, 0x801fc000000ULL,
-                                &s->pchip.reg_io);
+                                &s->pchip.reg_io, &error_abort);
 
     b = pci_register_bus(dev, "pci",
                          typhoon_set_irq, sys_map_irq, s,
@@ -898,13 +898,13 @@ PCIBus *typhoon_init(ram_addr_t ram_size, ISABus 
**isa_bus,
     memory_region_init_io(&s->pchip.reg_iack, OBJECT(s), &alpha_pci_iack_ops,
                           b, "pci0-iack", 64*MB);
     memory_region_add_subregion(addr_space, 0x801f8000000ULL,
-                                &s->pchip.reg_iack);
+                                &s->pchip.reg_iack, &error_abort);
 
     /* Pchip0 PCI configuration, 0x801.FE00.0000, 16MB.  */
     memory_region_init_io(&s->pchip.reg_conf, OBJECT(s), &alpha_pci_conf1_ops,
                           b, "pci0-conf", 16*MB);
     memory_region_add_subregion(addr_space, 0x801fe000000ULL,
-                                &s->pchip.reg_conf);
+                                &s->pchip.reg_conf, &error_abort);
 
     /* For the record, these are the mappings for the second PCI bus.
        We can get away with not implementing them because we indicate
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
index c6eab6d..e4739fb 100644
--- a/hw/arm/armv7m.c
+++ b/hw/arm/armv7m.c
@@ -231,7 +231,7 @@ qemu_irq *armv7m_init(MemoryRegion *system_memory, int 
mem_size, int num_irq,
        when returning from an exception.  */
     memory_region_init_ram(hack, NULL, "armv7m.hack", 0x1000, &error_abort);
     vmstate_register_ram_global(hack);
-    memory_region_add_subregion(system_memory, 0xfffff000, hack);
+    memory_region_add_subregion(system_memory, 0xfffff000, hack, &error_abort);
 
     qemu_register_reset(armv7m_reset, cpu);
     return pic;
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
index 1582250..d02bdfa 100644
--- a/hw/arm/cubieboard.c
+++ b/hw/arm/cubieboard.c
@@ -66,7 +66,7 @@ static void cubieboard_init(MachineState *machine)
     memory_region_allocate_system_memory(&s->sdram, NULL, "cubieboard.ram",
                                          machine->ram_size);
     memory_region_add_subregion(get_system_memory(), AW_A10_SDRAM_BASE,
-                                &s->sdram);
+                                &s->sdram, &error_abort);
 
     cubieboard_binfo.ram_size = machine->ram_size;
     cubieboard_binfo.kernel_filename = machine->kernel_filename;
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
index f8ba9e5..7d212d7 100644
--- a/hw/arm/digic_boards.c
+++ b/hw/arm/digic_boards.c
@@ -52,7 +52,7 @@ typedef struct DigicBoard {
 static void digic4_board_setup_ram(DigicBoardState *s, hwaddr ram_size)
 {
     memory_region_allocate_system_memory(&s->ram, NULL, "ram", ram_size);
-    memory_region_add_subregion(get_system_memory(), 0, &s->ram);
+    memory_region_add_subregion(get_system_memory(), 0, &s->ram, &error_abort);
 }
 
 static void digic4_board_init(DigicBoard *board)
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
index c55fab8..d9f01cf 100644
--- a/hw/arm/exynos4210.c
+++ b/hw/arm/exynos4210.c
@@ -255,7 +255,7 @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem,
     memory_region_init_io(&s->chipid_mem, NULL, &exynos4210_chipid_and_omr_ops,
         NULL, "exynos4210.chipid", sizeof(chipid_and_omr));
     memory_region_add_subregion(system_mem, EXYNOS4210_CHIPID_ADDR,
-                                &s->chipid_mem);
+                                &s->chipid_mem, &error_abort);
 
     /* Internal ROM */
     memory_region_init_ram(&s->irom_mem, NULL, "exynos4210.irom",
@@ -263,7 +263,7 @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem,
     vmstate_register_ram_global(&s->irom_mem);
     memory_region_set_readonly(&s->irom_mem, true);
     memory_region_add_subregion(system_mem, EXYNOS4210_IROM_BASE_ADDR,
-                                &s->irom_mem);
+                                &s->irom_mem, &error_abort);
     /* mirror of iROM */
     memory_region_init_alias(&s->irom_alias_mem, NULL, "exynos4210.irom_alias",
                              &s->irom_mem,
@@ -271,14 +271,14 @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem,
                              EXYNOS4210_IROM_SIZE);
     memory_region_set_readonly(&s->irom_alias_mem, true);
     memory_region_add_subregion(system_mem, EXYNOS4210_IROM_MIRROR_BASE_ADDR,
-                                &s->irom_alias_mem);
+                                &s->irom_alias_mem, &error_abort);
 
     /* Internal RAM */
     memory_region_init_ram(&s->iram_mem, NULL, "exynos4210.iram",
                            EXYNOS4210_IRAM_SIZE, &error_abort);
     vmstate_register_ram_global(&s->iram_mem);
     memory_region_add_subregion(system_mem, EXYNOS4210_IRAM_BASE_ADDR,
-                                &s->iram_mem);
+                                &s->iram_mem, &error_abort);
 
     /* DRAM */
     mem_size = ram_size;
@@ -287,14 +287,14 @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem,
                 mem_size - EXYNOS4210_DRAM_MAX_SIZE, &error_abort);
         vmstate_register_ram_global(&s->dram1_mem);
         memory_region_add_subregion(system_mem, EXYNOS4210_DRAM1_BASE_ADDR,
-                &s->dram1_mem);
+                &s->dram1_mem, &error_abort);
         mem_size = EXYNOS4210_DRAM_MAX_SIZE;
     }
     memory_region_init_ram(&s->dram0_mem, NULL, "exynos4210.dram0", mem_size,
                            &error_abort);
     vmstate_register_ram_global(&s->dram0_mem);
     memory_region_add_subregion(system_mem, EXYNOS4210_DRAM0_BASE_ADDR,
-            &s->dram0_mem);
+            &s->dram0_mem, &error_abort);
 
    /* PMU.
     * The only reason of existence at the moment is that secondary CPU boot
diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
index f8353a7..aff14d5 100644
--- a/hw/arm/highbank.c
+++ b/hw/arm/highbank.c
@@ -277,12 +277,12 @@ static void calxeda_init(MachineState *machine, enum 
cxmachines machine_id)
     dram = g_new(MemoryRegion, 1);
     memory_region_allocate_system_memory(dram, NULL, "highbank.dram", 
ram_size);
     /* SDRAM at address zero.  */
-    memory_region_add_subregion(sysmem, 0, dram);
+    memory_region_add_subregion(sysmem, 0, dram, &error_abort);
 
     sysram = g_new(MemoryRegion, 1);
     memory_region_init_ram(sysram, NULL, "highbank.sysram", 0x8000,
                            &error_abort);
-    memory_region_add_subregion(sysmem, 0xfff88000, sysram);
+    memory_region_add_subregion(sysmem, 0xfff88000, sysram, &error_abort);
     if (bios_name != NULL) {
         sysboot_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
         if (sysboot_filename != NULL) {
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index 0fbbf99..5a2094e 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -572,10 +572,11 @@ static void integratorcp_init(MachineState *machine)
     /* ??? On a real system the first 1Mb is mapped as SSRAM or boot flash.  */
     /* ??? RAM should repeat to fill physical memory space.  */
     /* SDRAM at address zero*/
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, ram, &error_abort);
     /* And again at address 0x80000000 */
     memory_region_init_alias(ram_alias, NULL, "ram.alias", ram, 0, ram_size);
-    memory_region_add_subregion(address_space_mem, 0x80000000, ram_alias);
+    memory_region_add_subregion(address_space_mem, 0x80000000, ram_alias,
+                                &error_abort);
 
     dev = qdev_create(NULL, TYPE_INTEGRATOR_CM);
     qdev_prop_set_uint32(dev, "memsz", ram_size >> 20);
diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
index 5be0369..5999585 100644
--- a/hw/arm/kzm.c
+++ b/hw/arm/kzm.c
@@ -98,13 +98,16 @@ static void kzm_init(MachineState *machine)
     /* On a real system, the first 16k is a `secure boot rom' */
 
     memory_region_allocate_system_memory(ram, NULL, "kzm.ram", ram_size);
-    memory_region_add_subregion(address_space_mem, KZM_RAMADDRESS, ram);
+    memory_region_add_subregion(address_space_mem, KZM_RAMADDRESS, ram,
+                                &error_abort);
 
     memory_region_init_alias(ram_alias, NULL, "ram.alias", ram, 0, ram_size);
-    memory_region_add_subregion(address_space_mem, 0x88000000, ram_alias);
+    memory_region_add_subregion(address_space_mem, 0x88000000, ram_alias,
+                                &error_abort);
 
     memory_region_init_ram(sram, NULL, "kzm.sram", 0x4000, &error_abort);
-    memory_region_add_subregion(address_space_mem, 0x1FFFC000, sram);
+    memory_region_add_subregion(address_space_mem, 0x1FFFC000, sram,
+                                &error_abort);
 
     dev = sysbus_create_varargs("imx_avic", 0x68000000,
                                 qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ),
diff --git a/hw/arm/mainstone.c b/hw/arm/mainstone.c
index 0da02a6..49850d5 100644
--- a/hw/arm/mainstone.c
+++ b/hw/arm/mainstone.c
@@ -127,7 +127,7 @@ static void mainstone_common_init(MemoryRegion 
*address_space_mem,
                            &error_abort);
     vmstate_register_ram_global(rom);
     memory_region_set_readonly(rom, true);
-    memory_region_add_subregion(address_space_mem, 0, rom);
+    memory_region_add_subregion(address_space_mem, 0, rom, &error_abort);
 
 #ifdef TARGET_WORDS_BIGENDIAN
     be = 1;
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index a3b1314..2456767 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -1602,12 +1602,13 @@ static void musicpal_init(MachineState *machine)
     /* For now we use a fixed - the original - RAM size */
     memory_region_allocate_system_memory(ram, NULL, "musicpal.ram",
                                          MP_RAM_DEFAULT_SIZE);
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, ram, &error_abort);
 
     memory_region_init_ram(sram, NULL, "musicpal.sram", MP_SRAM_SIZE,
                            &error_abort);
     vmstate_register_ram_global(sram);
-    memory_region_add_subregion(address_space_mem, MP_SRAM_BASE, sram);
+    memory_region_add_subregion(address_space_mem, MP_SRAM_BASE, sram,
+                                &error_abort);
 
     dev = sysbus_create_simple(TYPE_MV88W8618_PIC, MP_PIC_BASE,
                                qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ));
diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
index de2b289..8014014 100644
--- a/hw/arm/omap1.c
+++ b/hw/arm/omap1.c
@@ -271,7 +271,7 @@ static struct omap_mpu_timer_s 
*omap_mpu_timer_init(MemoryRegion *system_memory,
     memory_region_init_io(&s->iomem, NULL, &omap_mpu_timer_ops, s,
                           "omap-mpu-timer", 0x100);
 
-    memory_region_add_subregion(system_memory, base, &s->iomem);
+    memory_region_add_subregion(system_memory, base, &s->iomem, &error_abort);
 
     return s;
 }
@@ -399,7 +399,7 @@ static struct omap_watchdog_timer_s 
*omap_wd_timer_init(MemoryRegion *memory,
 
     memory_region_init_io(&s->iomem, NULL, &omap_wd_timer_ops, s,
                           "omap-wd-timer", 0x100);
-    memory_region_add_subregion(memory, base, &s->iomem);
+    memory_region_add_subregion(memory, base, &s->iomem, &error_abort);
 
     return s;
 }
@@ -506,7 +506,7 @@ static struct omap_32khz_timer_s 
*omap_os_timer_init(MemoryRegion *memory,
 
     memory_region_init_io(&s->iomem, NULL, &omap_os_timer_ops, s,
                           "omap-os-timer", 0x800);
-    memory_region_add_subregion(memory, base, &s->iomem);
+    memory_region_add_subregion(memory, base, &s->iomem, &error_abort);
 
     return s;
 }
@@ -740,7 +740,8 @@ static void omap_ulpd_pm_init(MemoryRegion *system_memory,
 {
     memory_region_init_io(&mpu->ulpd_pm_iomem, NULL, &omap_ulpd_pm_ops, mpu,
                           "omap-ulpd-pm", 0x800);
-    memory_region_add_subregion(system_memory, base, &mpu->ulpd_pm_iomem);
+    memory_region_add_subregion(system_memory, base, &mpu->ulpd_pm_iomem,
+                                &error_abort);
     omap_ulpd_pm_reset(mpu);
 }
 
@@ -963,7 +964,8 @@ static void omap_pin_cfg_init(MemoryRegion *system_memory,
 {
     memory_region_init_io(&mpu->pin_cfg_iomem, NULL, &omap_pin_cfg_ops, mpu,
                           "omap-pin-cfg", 0x800);
-    memory_region_add_subregion(system_memory, base, &mpu->pin_cfg_iomem);
+    memory_region_add_subregion(system_memory, base, &mpu->pin_cfg_iomem,
+                                &error_abort);
     omap_pin_cfg_reset(mpu);
 }
 
@@ -1038,14 +1040,17 @@ static void omap_id_init(MemoryRegion *memory, struct 
omap_mpu_state_s *mpu)
                           "omap-id", 0x100000000ULL);
     memory_region_init_alias(&mpu->id_iomem_e18, NULL, "omap-id-e18", 
&mpu->id_iomem,
                              0xfffe1800, 0x800);
-    memory_region_add_subregion(memory, 0xfffe1800, &mpu->id_iomem_e18);
+    memory_region_add_subregion(memory, 0xfffe1800, &mpu->id_iomem_e18,
+                                &error_abort);
     memory_region_init_alias(&mpu->id_iomem_ed4, NULL, "omap-id-ed4", 
&mpu->id_iomem,
                              0xfffed400, 0x100);
-    memory_region_add_subregion(memory, 0xfffed400, &mpu->id_iomem_ed4);
+    memory_region_add_subregion(memory, 0xfffed400, &mpu->id_iomem_ed4,
+                                &error_abort);
     if (!cpu_is_omap15xx(mpu)) {
         memory_region_init_alias(&mpu->id_iomem_ed4, NULL, "omap-id-e20",
                                  &mpu->id_iomem, 0xfffe2000, 0x800);
-        memory_region_add_subregion(memory, 0xfffe2000, &mpu->id_iomem_e20);
+        memory_region_add_subregion(memory, 0xfffe2000, &mpu->id_iomem_e20,
+                                    &error_abort);
     }
 }
 
@@ -1131,7 +1136,7 @@ static void omap_mpui_init(MemoryRegion *memory, hwaddr 
base,
 {
     memory_region_init_io(&mpu->mpui_iomem, NULL, &omap_mpui_ops, mpu,
                           "omap-mpui", 0x100);
-    memory_region_add_subregion(memory, base, &mpu->mpui_iomem);
+    memory_region_add_subregion(memory, base, &mpu->mpui_iomem, &error_abort);
 
     omap_mpui_reset(mpu);
 }
@@ -1244,7 +1249,7 @@ static struct omap_tipb_bridge_s *omap_tipb_bridge_init(
 
     memory_region_init_io(&s->iomem, NULL, &omap_tipb_bridge_ops, s,
                           "omap-tipb-bridge", 0x100);
-    memory_region_add_subregion(memory, base, &s->iomem);
+    memory_region_add_subregion(memory, base, &s->iomem, &error_abort);
 
     return s;
 }
@@ -1354,7 +1359,7 @@ static void omap_tcmi_init(MemoryRegion *memory, hwaddr 
base,
 {
     memory_region_init_io(&mpu->tcmi_iomem, NULL, &omap_tcmi_ops, mpu,
                           "omap-tcmi", 0x100);
-    memory_region_add_subregion(memory, base, &mpu->tcmi_iomem);
+    memory_region_add_subregion(memory, base, &mpu->tcmi_iomem, &error_abort);
     omap_tcmi_reset(mpu);
 }
 
@@ -1440,7 +1445,7 @@ static struct dpll_ctl_s  *omap_dpll_init(MemoryRegion 
*memory,
     s->dpll = clk;
     omap_dpll_reset(s);
 
-    memory_region_add_subregion(memory, base, &s->iomem);
+    memory_region_add_subregion(memory, base, &s->iomem, &error_abort);
     return s;
 }
 
@@ -1861,8 +1866,9 @@ static void omap_clkm_init(MemoryRegion *memory, hwaddr 
mpu_base,
     omap_clkm_reset(s);
     s->clkm.cold_start = 0x3a;
 
-    memory_region_add_subregion(memory, mpu_base, &s->clkm_iomem);
-    memory_region_add_subregion(memory, dsp_base, &s->clkdsp_iomem);
+    memory_region_add_subregion(memory, mpu_base, &s->clkm_iomem, 
&error_abort);
+    memory_region_add_subregion(memory, dsp_base, &s->clkdsp_iomem,
+                                &error_abort);
 }
 
 /* MPU I/O */
@@ -2110,7 +2116,7 @@ static struct omap_mpuio_s *omap_mpuio_init(MemoryRegion 
*memory,
 
     memory_region_init_io(&s->iomem, NULL, &omap_mpuio_ops, s,
                           "omap-mpuio", 0x800);
-    memory_region_add_subregion(memory, base, &s->iomem);
+    memory_region_add_subregion(memory, base, &s->iomem, &error_abort);
 
     omap_clk_adduser(clk, qemu_allocate_irq(omap_mpuio_onoff, s, 0));
 
@@ -2301,7 +2307,7 @@ static struct omap_uwire_s *omap_uwire_init(MemoryRegion 
*system_memory,
     omap_uwire_reset(s);
 
     memory_region_init_io(&s->iomem, NULL, &omap_uwire_ops, s, "omap-uwire", 
0x800);
-    memory_region_add_subregion(system_memory, base, &s->iomem);
+    memory_region_add_subregion(system_memory, base, &s->iomem, &error_abort);
 
     return s;
 }
@@ -2415,7 +2421,7 @@ static struct omap_pwl_s *omap_pwl_init(MemoryRegion 
*system_memory,
 
     memory_region_init_io(&s->iomem, NULL, &omap_pwl_ops, s,
                           "omap-pwl", 0x800);
-    memory_region_add_subregion(system_memory, base, &s->iomem);
+    memory_region_add_subregion(system_memory, base, &s->iomem, &error_abort);
 
     omap_clk_adduser(clk, qemu_allocate_irq(omap_pwl_clk_update, s, 0));
     return s;
@@ -2523,7 +2529,7 @@ static struct omap_pwt_s *omap_pwt_init(MemoryRegion 
*system_memory,
 
     memory_region_init_io(&s->iomem, NULL, &omap_pwt_ops, s,
                           "omap-pwt", 0x800);
-    memory_region_add_subregion(system_memory, base, &s->iomem);
+    memory_region_add_subregion(system_memory, base, &s->iomem, &error_abort);
     return s;
 }
 
@@ -2943,7 +2949,7 @@ static struct omap_rtc_s *omap_rtc_init(MemoryRegion 
*system_memory,
 
     memory_region_init_io(&s->iomem, NULL, &omap_rtc_ops, s,
                           "omap-rtc", 0x800);
-    memory_region_add_subregion(system_memory, base, &s->iomem);
+    memory_region_add_subregion(system_memory, base, &s->iomem, &error_abort);
 
     return s;
 }
@@ -3480,7 +3486,7 @@ static struct omap_mcbsp_s *omap_mcbsp_init(MemoryRegion 
*system_memory,
     omap_mcbsp_reset(s);
 
     memory_region_init_io(&s->iomem, NULL, &omap_mcbsp_ops, s, "omap-mcbsp", 
0x800);
-    memory_region_add_subregion(system_memory, base, &s->iomem);
+    memory_region_add_subregion(system_memory, base, &s->iomem, &error_abort);
 
     return s;
 }
@@ -3656,7 +3662,7 @@ static struct omap_lpg_s *omap_lpg_init(MemoryRegion 
*system_memory,
     omap_lpg_reset(s);
 
     memory_region_init_io(&s->iomem, NULL, &omap_lpg_ops, s, "omap-lpg", 
0x800);
-    memory_region_add_subregion(system_memory, base, &s->iomem);
+    memory_region_add_subregion(system_memory, base, &s->iomem, &error_abort);
 
     omap_clk_adduser(clk, qemu_allocate_irq(omap_lpg_clk_update, s, 0));
 
@@ -3697,7 +3703,7 @@ static void omap_setup_mpui_io(MemoryRegion 
*system_memory,
     memory_region_init_io(&mpu->mpui_io_iomem, NULL, &omap_mpui_io_ops, mpu,
                           "omap-mpui-io", 0x7fff);
     memory_region_add_subregion(system_memory, OMAP_MPUI_BASE,
-                                &mpu->mpui_io_iomem);
+                                &mpu->mpui_io_iomem, &error_abort);
 }
 
 /* General chip reset */
@@ -3777,7 +3783,8 @@ static void omap_setup_dsp_mapping(MemoryRegion 
*system_memory,
         io = g_new(MemoryRegion, 1);
         memory_region_init_alias(io, NULL, map->name,
                                  system_memory, map->phys_mpu, map->size);
-        memory_region_add_subregion(system_memory, map->phys_dsp, io);
+        memory_region_add_subregion(system_memory, map->phys_dsp, io,
+                                    &error_abort);
     }
 }
 
@@ -3880,11 +3887,13 @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion 
*system_memory,
     /* Memory-mapped stuff */
     memory_region_allocate_system_memory(&s->emiff_ram, NULL, "omap1.dram",
                                          s->sdram_size);
-    memory_region_add_subregion(system_memory, OMAP_EMIFF_BASE, &s->emiff_ram);
+    memory_region_add_subregion(system_memory, OMAP_EMIFF_BASE, &s->emiff_ram,
+                                &error_abort);
     memory_region_init_ram(&s->imif_ram, NULL, "omap1.sram", s->sram_size,
                            &error_abort);
     vmstate_register_ram_global(&s->imif_ram);
-    memory_region_add_subregion(system_memory, OMAP_IMIF_BASE, &s->imif_ram);
+    memory_region_add_subregion(system_memory, OMAP_IMIF_BASE, &s->imif_ram,
+                                &error_abort);
 
     omap_clkm_init(system_memory, 0xfffece00, 0xe1008000, s);
 
diff --git a/hw/arm/omap2.c b/hw/arm/omap2.c
index e39b317..6d70831 100644
--- a/hw/arm/omap2.c
+++ b/hw/arm/omap2.c
@@ -802,7 +802,8 @@ static struct omap_sti_s *omap_sti_init(struct 
omap_target_agent_s *ta,
 
     memory_region_init_io(&s->iomem_fifo, NULL, &omap_sti_fifo_ops, s,
                           "omap.sti.fifo", 0x10000);
-    memory_region_add_subregion(sysmem, channel_base, &s->iomem_fifo);
+    memory_region_add_subregion(sysmem, channel_base, &s->iomem_fifo,
+                                &error_abort);
 
     return s;
 }
@@ -2274,11 +2275,12 @@ struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion 
*sysmem,
     /* Memory-mapped stuff */
     memory_region_allocate_system_memory(&s->sdram, NULL, "omap2.dram",
                                          s->sdram_size);
-    memory_region_add_subregion(sysmem, OMAP2_Q2_BASE, &s->sdram);
+    memory_region_add_subregion(sysmem, OMAP2_Q2_BASE, &s->sdram, 
&error_abort);
     memory_region_init_ram(&s->sram, NULL, "omap2.sram", s->sram_size,
                            &error_abort);
     vmstate_register_ram_global(&s->sram);
-    memory_region_add_subregion(sysmem, OMAP2_SRAM_BASE, &s->sram);
+    memory_region_add_subregion(sysmem, OMAP2_SRAM_BASE, &s->sram,
+                                &error_abort);
 
     s->l4 = omap_l4_init(sysmem, OMAP2_L4_BASE, 54);
 
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
index 4b0f7f9..93be711 100644
--- a/hw/arm/omap_sx1.c
+++ b/hw/arm/omap_sx1.c
@@ -125,23 +125,25 @@ static void sx1_init(MachineState *machine, const int 
version)
                            &error_abort);
     vmstate_register_ram_global(flash);
     memory_region_set_readonly(flash, true);
-    memory_region_add_subregion(address_space, OMAP_CS0_BASE, flash);
+    memory_region_add_subregion(address_space, OMAP_CS0_BASE, flash,
+                                &error_abort);
 
     memory_region_init_io(&cs[0], NULL, &static_ops, &cs0val,
                           "sx1.cs0", OMAP_CS0_SIZE - flash_size);
     memory_region_add_subregion(address_space,
-                                OMAP_CS0_BASE + flash_size, &cs[0]);
+                                OMAP_CS0_BASE + flash_size, &cs[0],
+                                &error_abort);
 
 
     memory_region_init_io(&cs[2], NULL, &static_ops, &cs2val,
                           "sx1.cs2", OMAP_CS2_SIZE);
     memory_region_add_subregion(address_space,
-                                OMAP_CS2_BASE, &cs[2]);
+                                OMAP_CS2_BASE, &cs[2], &error_abort);
 
     memory_region_init_io(&cs[3], NULL, &static_ops, &cs3val,
                           "sx1.cs3", OMAP_CS3_SIZE);
     memory_region_add_subregion(address_space,
-                                OMAP_CS2_BASE, &cs[3]);
+                                OMAP_CS2_BASE, &cs[3], &error_abort);
 
     fl_idx = 0;
 #ifdef TARGET_WORDS_BIGENDIAN
@@ -169,12 +171,14 @@ static void sx1_init(MachineState *machine, const int 
version)
                                &error_abort);
         vmstate_register_ram_global(flash_1);
         memory_region_set_readonly(flash_1, true);
-        memory_region_add_subregion(address_space, OMAP_CS1_BASE, flash_1);
+        memory_region_add_subregion(address_space, OMAP_CS1_BASE, flash_1,
+                                    &error_abort);
 
         memory_region_init_io(&cs[1], NULL, &static_ops, &cs1val,
                               "sx1.cs1", OMAP_CS1_SIZE - flash1_size);
         memory_region_add_subregion(address_space,
-                                OMAP_CS1_BASE + flash1_size, &cs[1]);
+                                OMAP_CS1_BASE + flash1_size, &cs[1],
+                                &error_abort);
 
         if (!pflash_cfi01_register(OMAP_CS1_BASE, NULL,
                                    "omap_sx1.flash1-1", flash1_size,
@@ -189,7 +193,8 @@ static void sx1_init(MachineState *machine, const int 
version)
         memory_region_init_io(&cs[1], NULL, &static_ops, &cs1val,
                               "sx1.cs1", OMAP_CS1_SIZE);
         memory_region_add_subregion(address_space,
-                                OMAP_CS1_BASE, &cs[1]);
+                                OMAP_CS1_BASE, &cs[1],
+                                &error_abort);
     }
 
     if (!machine->kernel_filename && !fl_idx && !qtest_enabled()) {
diff --git a/hw/arm/palm.c b/hw/arm/palm.c
index 7f1cfb8..7b34ba4 100644
--- a/hw/arm/palm.c
+++ b/hw/arm/palm.c
@@ -216,21 +216,25 @@ static void palmte_init(MachineState *machine)
                            &error_abort);
     vmstate_register_ram_global(flash);
     memory_region_set_readonly(flash, true);
-    memory_region_add_subregion(address_space_mem, OMAP_CS0_BASE, flash);
+    memory_region_add_subregion(address_space_mem, OMAP_CS0_BASE, flash,
+                                &error_abort);
 
     memory_region_init_io(&cs[0], NULL, &static_ops, &cs0val, "palmte-cs0",
                           OMAP_CS0_SIZE - flash_size);
     memory_region_add_subregion(address_space_mem, OMAP_CS0_BASE + flash_size,
-                                &cs[0]);
+                                &cs[0], &error_abort);
     memory_region_init_io(&cs[1], NULL, &static_ops, &cs1val, "palmte-cs1",
                           OMAP_CS1_SIZE);
-    memory_region_add_subregion(address_space_mem, OMAP_CS1_BASE, &cs[1]);
+    memory_region_add_subregion(address_space_mem, OMAP_CS1_BASE, &cs[1],
+                                &error_abort);
     memory_region_init_io(&cs[2], NULL, &static_ops, &cs2val, "palmte-cs2",
                           OMAP_CS2_SIZE);
-    memory_region_add_subregion(address_space_mem, OMAP_CS2_BASE, &cs[2]);
+    memory_region_add_subregion(address_space_mem, OMAP_CS2_BASE, &cs[2],
+                                &error_abort);
     memory_region_init_io(&cs[3], NULL, &static_ops, &cs3val, "palmte-cs3",
                           OMAP_CS3_SIZE);
-    memory_region_add_subregion(address_space_mem, OMAP_CS3_BASE, &cs[3]);
+    memory_region_add_subregion(address_space_mem, OMAP_CS3_BASE, &cs[3],
+                                &error_abort);
 
     palmte_microwire_setup(mpu);
 
diff --git a/hw/arm/pxa2xx.c b/hw/arm/pxa2xx.c
index ec353f7..8c38a57 100644
--- a/hw/arm/pxa2xx.c
+++ b/hw/arm/pxa2xx.c
@@ -1743,7 +1743,7 @@ static PXA2xxI2SState *pxa2xx_i2s_init(MemoryRegion 
*sysmem,
 
     memory_region_init_io(&s->iomem, NULL, &pxa2xx_i2s_ops, s,
                           "pxa2xx-i2s", 0x100000);
-    memory_region_add_subregion(sysmem, base, &s->iomem);
+    memory_region_add_subregion(sysmem, base, &s->iomem, &error_abort);
 
     vmstate_register(NULL, base, &vmstate_pxa2xx_i2s, s);
 
@@ -2081,12 +2081,13 @@ PXA2xxState *pxa270_init(MemoryRegion *address_space,
     memory_region_init_ram(&s->sdram, NULL, "pxa270.sdram", sdram_size,
                            &error_abort);
     vmstate_register_ram_global(&s->sdram);
-    memory_region_add_subregion(address_space, PXA2XX_SDRAM_BASE, &s->sdram);
+    memory_region_add_subregion(address_space, PXA2XX_SDRAM_BASE, &s->sdram,
+                                &error_abort);
     memory_region_init_ram(&s->internal, NULL, "pxa270.internal", 0x40000,
                            &error_abort);
     vmstate_register_ram_global(&s->internal);
     memory_region_add_subregion(address_space, PXA2XX_INTERNAL_BASE,
-                                &s->internal);
+                                &s->internal, &error_abort);
 
     s->pic = pxa2xx_pic_init(0x40d00000, s->cpu);
 
@@ -2138,7 +2139,8 @@ PXA2xxState *pxa270_init(MemoryRegion *address_space,
     s->cm_regs[CCCR >> 2] = 0x02000210;        /* 416.0 MHz */
     s->clkcfg = 0x00000009;            /* Turbo mode active */
     memory_region_init_io(&s->cm_iomem, NULL, &pxa2xx_cm_ops, s, "pxa2xx-cm", 
0x1000);
-    memory_region_add_subregion(address_space, s->cm_base, &s->cm_iomem);
+    memory_region_add_subregion(address_space, s->cm_base, &s->cm_iomem,
+                                &error_abort);
     vmstate_register(NULL, 0, &vmstate_pxa2xx_cm, s);
 
     pxa2xx_setup_cp14(s);
@@ -2148,12 +2150,14 @@ PXA2xxState *pxa270_init(MemoryRegion *address_space,
     s->mm_regs[MDREFR >> 2] = 0x03ca4000;
     s->mm_regs[MECR >> 2] = 0x00000001;        /* Two PC Card sockets */
     memory_region_init_io(&s->mm_iomem, NULL, &pxa2xx_mm_ops, s, "pxa2xx-mm", 
0x1000);
-    memory_region_add_subregion(address_space, s->mm_base, &s->mm_iomem);
+    memory_region_add_subregion(address_space, s->mm_base, &s->mm_iomem,
+                                &error_abort);
     vmstate_register(NULL, 0, &vmstate_pxa2xx_mm, s);
 
     s->pm_base = 0x40f00000;
     memory_region_init_io(&s->pm_iomem, NULL, &pxa2xx_pm_ops, s, "pxa2xx-pm", 
0x100);
-    memory_region_add_subregion(address_space, s->pm_base, &s->pm_iomem);
+    memory_region_add_subregion(address_space, s->pm_base, &s->pm_iomem,
+                                &error_abort);
     vmstate_register(NULL, 0, &vmstate_pxa2xx_pm, s);
 
     for (i = 0; pxa27x_ssp[i].io_base; i ++);
@@ -2215,12 +2219,13 @@ PXA2xxState *pxa255_init(MemoryRegion *address_space, 
unsigned int sdram_size)
     memory_region_init_ram(&s->sdram, NULL, "pxa255.sdram", sdram_size,
                            &error_abort);
     vmstate_register_ram_global(&s->sdram);
-    memory_region_add_subregion(address_space, PXA2XX_SDRAM_BASE, &s->sdram);
+    memory_region_add_subregion(address_space, PXA2XX_SDRAM_BASE, &s->sdram,
+                                &error_abort);
     memory_region_init_ram(&s->internal, NULL, "pxa255.internal",
                            PXA2XX_INTERNAL_SIZE, &error_abort);
     vmstate_register_ram_global(&s->internal);
     memory_region_add_subregion(address_space, PXA2XX_INTERNAL_BASE,
-                                &s->internal);
+                                &s->internal, &error_abort);
 
     s->pic = pxa2xx_pic_init(0x40d00000, s->cpu);
 
@@ -2271,7 +2276,8 @@ PXA2xxState *pxa255_init(MemoryRegion *address_space, 
unsigned int sdram_size)
     s->cm_regs[CCCR >> 2] = 0x02000210;        /* 416.0 MHz */
     s->clkcfg = 0x00000009;            /* Turbo mode active */
     memory_region_init_io(&s->cm_iomem, NULL, &pxa2xx_cm_ops, s, "pxa2xx-cm", 
0x1000);
-    memory_region_add_subregion(address_space, s->cm_base, &s->cm_iomem);
+    memory_region_add_subregion(address_space, s->cm_base, &s->cm_iomem,
+                                &error_abort);
     vmstate_register(NULL, 0, &vmstate_pxa2xx_cm, s);
 
     pxa2xx_setup_cp14(s);
@@ -2281,12 +2287,14 @@ PXA2xxState *pxa255_init(MemoryRegion *address_space, 
unsigned int sdram_size)
     s->mm_regs[MDREFR >> 2] = 0x03ca4000;
     s->mm_regs[MECR >> 2] = 0x00000001;        /* Two PC Card sockets */
     memory_region_init_io(&s->mm_iomem, NULL, &pxa2xx_mm_ops, s, "pxa2xx-mm", 
0x1000);
-    memory_region_add_subregion(address_space, s->mm_base, &s->mm_iomem);
+    memory_region_add_subregion(address_space, s->mm_base, &s->mm_iomem,
+                                &error_abort);
     vmstate_register(NULL, 0, &vmstate_pxa2xx_mm, s);
 
     s->pm_base = 0x40f00000;
     memory_region_init_io(&s->pm_iomem, NULL, &pxa2xx_pm_ops, s, "pxa2xx-pm", 
0x100);
-    memory_region_add_subregion(address_space, s->pm_base, &s->pm_iomem);
+    memory_region_add_subregion(address_space, s->pm_base, &s->pm_iomem,
+                                &error_abort);
     vmstate_register(NULL, 0, &vmstate_pxa2xx_pm, s);
 
     for (i = 0; pxa255_ssp[i].io_base; i ++);
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index ef2788d..b16c8ae 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -153,7 +153,7 @@ static void realview_init(MachineState *machine,
         memory_region_init_ram(ram_lo, NULL, "realview.lowmem", low_ram_size,
                                &error_abort);
         vmstate_register_ram_global(ram_lo);
-        memory_region_add_subregion(sysmem, 0x20000000, ram_lo);
+        memory_region_add_subregion(sysmem, 0x20000000, ram_lo, &error_abort);
     }
 
     memory_region_init_ram(ram_hi, NULL, "realview.highmem", ram_size,
@@ -165,10 +165,10 @@ static void realview_init(MachineState *machine,
     /* SDRAM at address zero.  */
     memory_region_init_alias(ram_alias, NULL, "realview.alias",
                              ram_hi, 0, low_ram_size);
-    memory_region_add_subregion(sysmem, 0, ram_alias);
+    memory_region_add_subregion(sysmem, 0, ram_alias, &error_abort);
     if (is_pb) {
         /* And again at a high address.  */
-        memory_region_add_subregion(sysmem, 0x70000000, ram_hi);
+        memory_region_add_subregion(sysmem, 0x70000000, ram_hi, &error_abort);
     } else {
         ram_size = low_ram_size;
     }
@@ -355,7 +355,7 @@ static void realview_init(MachineState *machine,
     memory_region_init_ram(ram_hack, NULL, "realview.hack", 0x1000,
                            &error_abort);
     vmstate_register_ram_global(ram_hack);
-    memory_region_add_subregion(sysmem, SMP_BOOT_ADDR, ram_hack);
+    memory_region_add_subregion(sysmem, SMP_BOOT_ADDR, ram_hack, &error_abort);
 
     realview_binfo.ram_size = ram_size;
     realview_binfo.kernel_filename = machine->kernel_filename;
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
index 5bf032a..5e6ac91 100644
--- a/hw/arm/spitz.c
+++ b/hw/arm/spitz.c
@@ -916,7 +916,7 @@ static void spitz_common_init(MachineState *machine,
     memory_region_init_ram(rom, NULL, "spitz.rom", SPITZ_ROM, &error_abort);
     vmstate_register_ram_global(rom);
     memory_region_set_readonly(rom, true);
-    memory_region_add_subregion(address_space_mem, 0, rom);
+    memory_region_add_subregion(address_space_mem, 0, rom, &error_abort);
 
     /* Setup peripherals */
     spitz_keyboard_register(mpu);
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index cb515ec..51c3bb9 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -683,7 +683,8 @@ static int stellaris_sys_init(uint32_t base, qemu_irq irq,
     s->user1 = macaddr[3] | (macaddr[4] << 8) | (macaddr[5] << 16);
 
     memory_region_init_io(&s->iomem, NULL, &ssys_ops, s, "ssys", 0x00001000);
-    memory_region_add_subregion(get_system_memory(), base, &s->iomem);
+    memory_region_add_subregion(get_system_memory(), base, &s->iomem,
+                                &error_abort);
     ssys_reset(s);
     vmstate_register(NULL, -1, &vmstate_stellaris_sys, s);
     return 0;
@@ -1234,12 +1235,12 @@ static void stellaris_init(const char *kernel_filename, 
const char *cpu_model,
                            &error_abort);
     vmstate_register_ram_global(flash);
     memory_region_set_readonly(flash, true);
-    memory_region_add_subregion(system_memory, 0, flash);
+    memory_region_add_subregion(system_memory, 0, flash, &error_abort);
 
     memory_region_init_ram(sram, NULL, "stellaris.sram", sram_size,
                            &error_abort);
     vmstate_register_ram_global(sram);
-    memory_region_add_subregion(system_memory, 0x20000000, sram);
+    memory_region_add_subregion(system_memory, 0x20000000, sram, &error_abort);
 
     pic = armv7m_init(system_memory, flash_size, NUM_IRQ_LINES,
                       kernel_filename, cpu_model);
diff --git a/hw/arm/stm32f205_soc.c b/hw/arm/stm32f205_soc.c
index 0f3bdc7..996538f 100644
--- a/hw/arm/stm32f205_soc.c
+++ b/hw/arm/stm32f205_soc.c
@@ -80,13 +80,15 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, 
Error **errp)
     memory_region_set_readonly(flash, true);
     memory_region_set_readonly(flash_alias, true);
 
-    memory_region_add_subregion(system_memory, FLASH_BASE_ADDRESS, flash);
-    memory_region_add_subregion(system_memory, 0, flash_alias);
+    memory_region_add_subregion(system_memory, FLASH_BASE_ADDRESS, flash,
+                                &error_abort);
+    memory_region_add_subregion(system_memory, 0, flash_alias, &error_abort);
 
     memory_region_init_ram(sram, NULL, "STM32F205.sram", SRAM_SIZE,
                            &error_abort);
     vmstate_register_ram_global(sram);
-    memory_region_add_subregion(system_memory, SRAM_BASE_ADDRESS, sram);
+    memory_region_add_subregion(system_memory, SRAM_BASE_ADDRESS, sram,
+                                &error_abort);
 
     pic = armv7m_init(get_system_memory(), FLASH_SIZE, 96,
                       s->kernel_filename, s->cpu_model);
diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c
index da9fc1d..7b2b970 100644
--- a/hw/arm/strongarm.c
+++ b/hw/arm/strongarm.c
@@ -1608,7 +1608,7 @@ StrongARMState *sa1110_init(MemoryRegion *sysmem,
 
     memory_region_allocate_system_memory(&s->sdram, NULL, "strongarm.sdram",
                                          sdram_size);
-    memory_region_add_subregion(sysmem, SA_SDCS0, &s->sdram);
+    memory_region_add_subregion(sysmem, SA_SDCS0, &s->sdram, &error_abort);
 
     s->pic = sysbus_create_varargs("strongarm_pic", 0x90050000,
                     qdev_get_gpio_in(DEVICE(s->cpu), ARM_CPU_IRQ),
diff --git a/hw/arm/tosa.c b/hw/arm/tosa.c
index 73572eb..bc56ae0 100644
--- a/hw/arm/tosa.c
+++ b/hw/arm/tosa.c
@@ -230,7 +230,7 @@ static void tosa_init(MachineState *machine)
     memory_region_init_ram(rom, NULL, "tosa.rom", TOSA_ROM, &error_abort);
     vmstate_register_ram_global(rom);
     memory_region_set_readonly(rom, true);
-    memory_region_add_subregion(address_space_mem, 0, rom);
+    memory_region_add_subregion(address_space_mem, 0, rom, &error_abort);
 
     tmio = tc6393xb_init(address_space_mem, 0x10000000,
             qdev_get_gpio_in(mpu->gpio, TOSA_GPIO_TC6393XB_INT));
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index 6c69f4e..82358eb 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -230,7 +230,7 @@ static void versatile_init(MachineState *machine, int 
board_id)
                                          machine->ram_size);
     /* ??? RAM should repeat to fill physical memory space.  */
     /* SDRAM at address zero.  */
-    memory_region_add_subregion(sysmem, 0, ram);
+    memory_region_add_subregion(sysmem, 0, ram, &error_abort);
 
     sysctl = qdev_create(NULL, "realview_sysctl");
     qdev_prop_set_uint32(sysctl, "sys_id", 0x41007004);
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index da21788..20cd79b 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -289,8 +289,8 @@ static void a9_daughterboard_init(const 
VexpressMachineState *vms,
      * things including ROM or RAM; we always map the RAM there.
      */
     memory_region_init_alias(lowram, NULL, "vexpress.lowmem", ram, 0, 
low_ram_size);
-    memory_region_add_subregion(sysmem, 0x0, lowram);
-    memory_region_add_subregion(sysmem, 0x60000000, ram);
+    memory_region_add_subregion(sysmem, 0x0, lowram, &error_abort);
+    memory_region_add_subregion(sysmem, 0x60000000, ram, &error_abort);
 
     /* 0x1e000000 A9MPCore (SCU) private memory region */
     init_cpus(cpu_model, "a9mpcore_priv", 0x1e000000, pic, vms->secure);
@@ -375,7 +375,7 @@ static void a15_daughterboard_init(const 
VexpressMachineState *vms,
     memory_region_allocate_system_memory(ram, NULL, "vexpress.highmem",
                                          ram_size);
     /* RAM is from 0x80000000 upwards; there is no low-memory alias for it. */
-    memory_region_add_subregion(sysmem, 0x80000000, ram);
+    memory_region_add_subregion(sysmem, 0x80000000, ram, &error_abort);
 
     /* 0x2c000000 A15MPCore private memory region (GIC) */
     init_cpus(cpu_model, "a15mpcore_priv", 0x2c000000, pic, vms->secure);
@@ -393,7 +393,7 @@ static void a15_daughterboard_init(const 
VexpressMachineState *vms,
     memory_region_init_ram(sram, NULL, "vexpress.a15sram", 0x10000,
                            &error_abort);
     vmstate_register_ram_global(sram);
-    memory_region_add_subregion(sysmem, 0x2e000000, sram);
+    memory_region_add_subregion(sysmem, 0x2e000000, sram, &error_abort);
 
     /* 0x7ffb0000: DMA330 DMA controller: not modelled */
     /* 0x7ffd0000: PL354 static memory controller: not modelled */
@@ -659,7 +659,8 @@ static void vexpress_common_init(MachineState *machine)
         flash0mem = sysbus_mmio_get_region(SYS_BUS_DEVICE(pflash0), 0);
         memory_region_init_alias(flashalias, NULL, "vexpress.flashalias",
                                  flash0mem, 0, VEXPRESS_FLASH_SIZE);
-        memory_region_add_subregion(sysmem, map[VE_NORFLASHALIAS], flashalias);
+        memory_region_add_subregion(sysmem, map[VE_NORFLASHALIAS], flashalias,
+                                    &error_abort);
     }
 
     dinfo = drive_get_next(IF_PFLASH);
@@ -673,13 +674,13 @@ static void vexpress_common_init(MachineState *machine)
     memory_region_init_ram(sram, NULL, "vexpress.sram", sram_size,
                            &error_abort);
     vmstate_register_ram_global(sram);
-    memory_region_add_subregion(sysmem, map[VE_SRAM], sram);
+    memory_region_add_subregion(sysmem, map[VE_SRAM], sram, &error_abort);
 
     vram_size = 0x800000;
     memory_region_init_ram(vram, NULL, "vexpress.vram", vram_size,
                            &error_abort);
     vmstate_register_ram_global(vram);
-    memory_region_add_subregion(sysmem, map[VE_VIDEORAM], vram);
+    memory_region_add_subregion(sysmem, map[VE_VIDEORAM], vram, &error_abort);
 
     /* 0x4e000000 LAN9118 Ethernet */
     if (nd_table[0].used) {
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 4846892..8ed9c05 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -685,7 +685,8 @@ static void create_pcie(const VirtBoardInfo *vbi, qemu_irq 
*pic)
     ecam_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
     memory_region_init_alias(ecam_alias, OBJECT(dev), "pcie-ecam",
                              ecam_reg, 0, size_ecam);
-    memory_region_add_subregion(get_system_memory(), base_ecam, ecam_alias);
+    memory_region_add_subregion(get_system_memory(), base_ecam, ecam_alias,
+                                &error_abort);
 
     /* Map the MMIO window into system address space so as to expose
      * the section of PCI MMIO space which starts at the same base address
@@ -696,7 +697,8 @@ static void create_pcie(const VirtBoardInfo *vbi, qemu_irq 
*pic)
     mmio_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 1);
     memory_region_init_alias(mmio_alias, OBJECT(dev), "pcie-mmio",
                              mmio_reg, base_mmio, size_mmio);
-    memory_region_add_subregion(get_system_memory(), base_mmio, mmio_alias);
+    memory_region_add_subregion(get_system_memory(), base_mmio, mmio_alias,
+                                &error_abort);
 
     /* Map IO port space */
     sysbus_mmio_map(SYS_BUS_DEVICE(dev), 2, base_pio);
@@ -769,7 +771,8 @@ static void create_platform_bus(VirtBoardInfo *vbi, 
qemu_irq *pic)
 
     memory_region_add_subregion(sysmem,
                                 platform_bus_params.platform_bus_base,
-                                sysbus_mmio_get_region(s, 0));
+                                sysbus_mmio_get_region(s, 0),
+                                &error_abort);
 }
 
 static void *machvirt_dtb(const struct arm_boot_info *binfo, int *fdt_size)
@@ -871,7 +874,8 @@ static void machvirt_init(MachineState *machine)
 
     memory_region_allocate_system_memory(ram, NULL, "mach-virt.ram",
                                          machine->ram_size);
-    memory_region_add_subregion(sysmem, vbi->memmap[VIRT_MEM].base, ram);
+    memory_region_add_subregion(sysmem, vbi->memmap[VIRT_MEM].base, ram,
+                                &error_abort);
 
     create_flash(vbi);
 
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index a4e7b5c..8cbce61 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -163,13 +163,14 @@ static void zynq_init(MachineState *machine)
     /* DDR remapped to address zero.  */
     memory_region_allocate_system_memory(ext_ram, NULL, "zynq.ext_ram",
                                          ram_size);
-    memory_region_add_subregion(address_space_mem, 0, ext_ram);
+    memory_region_add_subregion(address_space_mem, 0, ext_ram, &error_abort);
 
     /* 256K of on-chip memory */
     memory_region_init_ram(ocm_ram, NULL, "zynq.ocm_ram", 256 << 10,
                            &error_abort);
     vmstate_register_ram_global(ocm_ram);
-    memory_region_add_subregion(address_space_mem, 0xFFFC0000, ocm_ram);
+    memory_region_add_subregion(address_space_mem, 0xFFFC0000, ocm_ram,
+                                &error_abort);
 
     DriveInfo *dinfo = drive_get(IF_PFLASH, 0, 0);
 
diff --git a/hw/arm/xlnx-ep108.c b/hw/arm/xlnx-ep108.c
index f94da86..ab4dc21 100644
--- a/hw/arm/xlnx-ep108.c
+++ b/hw/arm/xlnx-ep108.c
@@ -58,7 +58,8 @@ static void xlnx_ep108_init(MachineState *machine)
 
     memory_region_allocate_system_memory(&s->ddr_ram, NULL, "ddr-ram",
                                          machine->ram_size);
-    memory_region_add_subregion(get_system_memory(), 0, &s->ddr_ram);
+    memory_region_add_subregion(get_system_memory(), 0, &s->ddr_ram,
+                                &error_abort);
 
     xlnx_ep108_binfo.ram_size = machine->ram_size;
     xlnx_ep108_binfo.kernel_filename = machine->kernel_filename;
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
index 5e72078..c6e6b0a 100644
--- a/hw/arm/xlnx-zynqmp.c
+++ b/hw/arm/xlnx-zynqmp.c
@@ -125,7 +125,8 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error 
**errp)
             addr += XLNX_ZYNQMP_GIC_REGION_SIZE;
             memory_region_init_alias(alias, OBJECT(s), "zynqmp-gic-alias", mr,
                                      0, XLNX_ZYNQMP_GIC_REGION_SIZE);
-            memory_region_add_subregion(system_memory, addr, alias);
+            memory_region_add_subregion(system_memory, addr, alias,
+                                        &error_abort);
         }
     }
 
diff --git a/hw/block/onenand.c b/hw/block/onenand.c
index 1b2c893..d8a5897 100644
--- a/hw/block/onenand.c
+++ b/hw/block/onenand.c
@@ -120,7 +120,7 @@ static void onenand_mem_setup(OneNANDState *s)
      * write boot commands.  Also take note of the BWPS bit.  */
     memory_region_init(&s->container, OBJECT(s), "onenand",
                        0x10000 << s->shift);
-    memory_region_add_subregion(&s->container, 0, &s->iomem);
+    memory_region_add_subregion(&s->container, 0, &s->iomem, &error_abort);
     memory_region_init_alias(&s->mapped_ram, OBJECT(s), "onenand-mapped-ram",
                              &s->ram, 0x0200 << s->shift,
                              0xbe00 << s->shift);
diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c
index 074a005..100e07c 100644
--- a/hw/block/pflash_cfi02.c
+++ b/hw/block/pflash_cfi02.c
@@ -111,7 +111,8 @@ static void pflash_setup_mappings(pflash_t *pfl)
     for (i = 0; i < pfl->mappings; ++i) {
         memory_region_init_alias(&pfl->mem_mappings[i], OBJECT(pfl),
                                  "pflash-alias", &pfl->orig_mem, 0, size);
-        memory_region_add_subregion(&pfl->mem, i * size, 
&pfl->mem_mappings[i]);
+        memory_region_add_subregion(&pfl->mem, i * size, &pfl->mem_mappings[i],
+                                    &error_abort);
     }
 }
 
diff --git a/hw/char/debugcon.c b/hw/char/debugcon.c
index 36f1c4a..1c0a04d 100644
--- a/hw/char/debugcon.c
+++ b/hw/char/debugcon.c
@@ -106,7 +106,7 @@ static void debugcon_isa_realizefn(DeviceState *dev, Error 
**errp)
     memory_region_init_io(&s->io, OBJECT(dev), &debugcon_ops, s,
                           TYPE_ISA_DEBUGCON_DEVICE, 1);
     memory_region_add_subregion(isa_address_space_io(d),
-                                isa->iobase, &s->io);
+                                isa->iobase, &s->io, &error_abort);
 }
 
 static Property debugcon_isa_properties[] = {
diff --git a/hw/char/mcf_uart.c b/hw/char/mcf_uart.c
index 98fd44e..ecb31a0 100644
--- a/hw/char/mcf_uart.c
+++ b/hw/char/mcf_uart.c
@@ -303,5 +303,5 @@ void mcf_uart_mm_init(MemoryRegion *sysmem,
 
     s = mcf_uart_init(irq, chr);
     memory_region_init_io(&s->iomem, NULL, &mcf_uart_ops, s, "uart", 0x40);
-    memory_region_add_subregion(sysmem, base, &s->iomem);
+    memory_region_add_subregion(sysmem, base, &s->iomem, &error_abort);
 }
diff --git a/hw/char/omap_uart.c b/hw/char/omap_uart.c
index 88f2094..1beb0f3 100644
--- a/hw/char/omap_uart.c
+++ b/hw/char/omap_uart.c
@@ -173,7 +173,7 @@ struct omap_uart_s *omap2_uart_init(MemoryRegion *sysmem,
 
     s->ta = ta;
 
-    memory_region_add_subregion(sysmem, base + 0x20, &s->iomem);
+    memory_region_add_subregion(sysmem, base + 0x20, &s->iomem, &error_abort);
 
     return s;
 }
diff --git a/hw/char/parallel.c b/hw/char/parallel.c
index c2b553f..72f4ef8 100644
--- a/hw/char/parallel.c
+++ b/hw/char/parallel.c
@@ -606,7 +606,7 @@ bool parallel_mm_init(MemoryRegion *address_space,
 
     memory_region_init_io(&s->iomem, NULL, &parallel_mm_ops, s,
                           "parallel", 8 << it_shift);
-    memory_region_add_subregion(address_space, base, &s->iomem);
+    memory_region_add_subregion(address_space, base, &s->iomem, &error_abort);
     return true;
 }
 
diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c
index 1c8b9be..751979b 100644
--- a/hw/char/serial-pci.c
+++ b/hw/char/serial-pci.c
@@ -123,7 +123,7 @@ static void multi_serial_pci_realize(PCIDevice *dev, Error 
**errp)
         pci->name[i] = g_strdup_printf("uart #%d", i+1);
         memory_region_init_io(&s->io, OBJECT(pci), &serial_io_ops, s,
                               pci->name[i], 8);
-        memory_region_add_subregion(&pci->iobar, 8 * i, &s->io);
+        memory_region_add_subregion(&pci->iobar, 8 * i, &s->io, &error_abort);
         pci->ports++;
     }
 }
diff --git a/hw/char/serial.c b/hw/char/serial.c
index 513d73c..a1cedca 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -904,7 +904,7 @@ SerialState *serial_init(int base, qemu_irq irq, int 
baudbase,
     vmstate_register(NULL, base, &vmstate_serial, s);
 
     memory_region_init_io(&s->io, NULL, &serial_io_ops, s, "serial", 8);
-    memory_region_add_subregion(system_io, base, &s->io);
+    memory_region_add_subregion(system_io, base, &s->io, &error_abort);
 
     return s;
 }
@@ -967,6 +967,6 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
 
     memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], s,
                           "serial", 8 << it_shift);
-    memory_region_add_subregion(address_space, base, &s->io);
+    memory_region_add_subregion(address_space, base, &s->io, &error_abort);
     return s;
 }
diff --git a/hw/char/sh_serial.c b/hw/char/sh_serial.c
index 9328dd1..45dee7b 100644
--- a/hw/char/sh_serial.c
+++ b/hw/char/sh_serial.c
@@ -386,11 +386,13 @@ void sh_serial_init(MemoryRegion *sysmem,
 
     memory_region_init_alias(&s->iomem_p4, NULL, "serial-p4", &s->iomem,
                              0, 0x28);
-    memory_region_add_subregion(sysmem, P4ADDR(base), &s->iomem_p4);
+    memory_region_add_subregion(sysmem, P4ADDR(base), &s->iomem_p4,
+                                &error_abort);
 
     memory_region_init_alias(&s->iomem_a7, NULL, "serial-a7", &s->iomem,
                              0, 0x28);
-    memory_region_add_subregion(sysmem, A7ADDR(base), &s->iomem_a7);
+    memory_region_add_subregion(sysmem, A7ADDR(base), &s->iomem_a7,
+                                &error_abort);
 
     s->chr = chr;
 
diff --git a/hw/core/platform-bus.c b/hw/core/platform-bus.c
index 70e0518..025af03 100644
--- a/hw/core/platform-bus.c
+++ b/hw/core/platform-bus.c
@@ -159,7 +159,7 @@ static int platform_bus_map_mmio(PlatformBusDevice *pbus, 
SysBusDevice *sbdev,
     }
 
     /* Map the device's region into our Platform Bus MMIO space */
-    memory_region_add_subregion(&pbus->mmio, off, sbdev_mr);
+    memory_region_add_subregion(&pbus->mmio, off, sbdev_mr, &error_abort);
 
     return 0;
 }
diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
index 3c58629..d7d2dc3 100644
--- a/hw/core/sysbus.c
+++ b/hw/core/sysbus.c
@@ -147,7 +147,7 @@ static void sysbus_mmio_map_common(SysBusDevice *dev, int 
n, hwaddr addr,
     else {
         memory_region_add_subregion(get_system_memory(),
                                     addr,
-                                    dev->mmio[n].memory);
+                                    dev->mmio[n].memory, &error_abort);
     }
 }
 
@@ -312,7 +312,7 @@ static char *sysbus_get_fw_dev_path(DeviceState *dev)
 void sysbus_add_io(SysBusDevice *dev, hwaddr addr,
                        MemoryRegion *mem)
 {
-    memory_region_add_subregion(get_system_io(), addr, mem);
+    memory_region_add_subregion(get_system_io(), addr, mem, &error_abort);
 }
 
 MemoryRegion *sysbus_address_space(SysBusDevice *dev)
diff --git a/hw/cpu/a15mpcore.c b/hw/cpu/a15mpcore.c
index acc419e..7f4d179 100644
--- a/hw/cpu/a15mpcore.c
+++ b/hw/cpu/a15mpcore.c
@@ -98,9 +98,11 @@ static void a15mp_priv_realize(DeviceState *dev, Error 
**errp)
      *  0x6000-0x7fff -- GIC virtual CPU interface (not modelled)
      */
     memory_region_add_subregion(&s->container, 0x1000,
-                                sysbus_mmio_get_region(busdev, 0));
+                                sysbus_mmio_get_region(busdev, 0),
+                                &error_abort);
     memory_region_add_subregion(&s->container, 0x2000,
-                                sysbus_mmio_get_region(busdev, 1));
+                                sysbus_mmio_get_region(busdev, 1),
+                                &error_abort);
 }
 
 static Property a15mp_priv_properties[] = {
diff --git a/hw/cpu/a9mpcore.c b/hw/cpu/a9mpcore.c
index c09358c..bb63075 100644
--- a/hw/cpu/a9mpcore.c
+++ b/hw/cpu/a9mpcore.c
@@ -112,21 +112,27 @@ static void a9mp_priv_realize(DeviceState *dev, Error 
**errp)
      *  0x1000-0x1fff -- GIC Distributor
      */
     memory_region_add_subregion(&s->container, 0,
-                                sysbus_mmio_get_region(scubusdev, 0));
+                                sysbus_mmio_get_region(scubusdev, 0),
+                                &error_abort);
     /* GIC CPU interface */
     memory_region_add_subregion(&s->container, 0x100,
-                                sysbus_mmio_get_region(gicbusdev, 1));
+                                sysbus_mmio_get_region(gicbusdev, 1),
+                                &error_abort);
     memory_region_add_subregion(&s->container, 0x200,
-                                sysbus_mmio_get_region(gtimerbusdev, 0));
+                                sysbus_mmio_get_region(gtimerbusdev, 0),
+                                &error_abort);
     /* Note that the A9 exposes only the "timer/watchdog for this core"
      * memory region, not the "timer/watchdog for core X" ones 11MPcore has.
      */
     memory_region_add_subregion(&s->container, 0x600,
-                                sysbus_mmio_get_region(mptimerbusdev, 0));
+                                sysbus_mmio_get_region(mptimerbusdev, 0),
+                                &error_abort);
     memory_region_add_subregion(&s->container, 0x620,
-                                sysbus_mmio_get_region(wdtbusdev, 0));
+                                sysbus_mmio_get_region(wdtbusdev, 0),
+                                &error_abort);
     memory_region_add_subregion(&s->container, 0x1000,
-                                sysbus_mmio_get_region(gicbusdev, 0));
+                                sysbus_mmio_get_region(gicbusdev, 0),
+                                &error_abort);
 
     /* Wire up the interrupt from each watchdog and timer.
      * For each core the global timer is PPI 27, the private
diff --git a/hw/cpu/arm11mpcore.c b/hw/cpu/arm11mpcore.c
index 717d3e4..987e7ec 100644
--- a/hw/cpu/arm11mpcore.c
+++ b/hw/cpu/arm11mpcore.c
@@ -28,14 +28,16 @@ static void mpcore_priv_map_setup(ARM11MPCorePriveState *s)
     SysBusDevice *wdtbusdev = SYS_BUS_DEVICE(&s->wdtimer);
 
     memory_region_add_subregion(&s->container, 0,
-                                sysbus_mmio_get_region(scubusdev, 0));
+                                sysbus_mmio_get_region(scubusdev, 0),
+                                &error_abort);
     /* GIC CPU interfaces: "current CPU" at 0x100, then specific CPUs
      * at 0x200, 0x300...
      */
     for (i = 0; i < (s->num_cpu + 1); i++) {
         hwaddr offset = 0x100 + (i * 0x100);
         memory_region_add_subregion(&s->container, offset,
-                                    sysbus_mmio_get_region(gicbusdev, i + 1));
+                                    sysbus_mmio_get_region(gicbusdev, i + 1),
+                                    &error_abort);
     }
     /* Add the regions for timer and watchdog for "current CPU" and
      * for each specific CPU.
@@ -44,12 +46,15 @@ static void mpcore_priv_map_setup(ARM11MPCorePriveState *s)
         /* Timers at 0x600, 0x700, ...; watchdogs at 0x620, 0x720, ... */
         hwaddr offset = 0x600 + i * 0x100;
         memory_region_add_subregion(&s->container, offset,
-                                    sysbus_mmio_get_region(timerbusdev, i));
+                                    sysbus_mmio_get_region(timerbusdev, i),
+                                    &error_abort);
         memory_region_add_subregion(&s->container, offset + 0x20,
-                                    sysbus_mmio_get_region(wdtbusdev, i));
+                                    sysbus_mmio_get_region(wdtbusdev, i),
+                                    &error_abort);
     }
     memory_region_add_subregion(&s->container, 0x1000,
-                                sysbus_mmio_get_region(gicbusdev, 0));
+                                sysbus_mmio_get_region(gicbusdev, 0),
+                                &error_abort);
     /* Wire up the interrupt from each watchdog and timer.
      * For each core the timer is PPI 29 and the watchdog PPI 30.
      */
diff --git a/hw/cris/axis_dev88.c b/hw/cris/axis_dev88.c
index 3cae480..fbe6219 100644
--- a/hw/cris/axis_dev88.c
+++ b/hw/cris/axis_dev88.c
@@ -272,14 +272,16 @@ void axisdev88_init(MachineState *machine)
     /* allocate RAM */
     memory_region_allocate_system_memory(phys_ram, NULL, "axisdev88.ram",
                                          ram_size);
-    memory_region_add_subregion(address_space_mem, 0x40000000, phys_ram);
+    memory_region_add_subregion(address_space_mem, 0x40000000, phys_ram,
+                                &error_abort);
 
     /* The ETRAX-FS has 128Kb on chip ram, the docs refer to it as the 
        internal memory.  */
     memory_region_init_ram(phys_intmem, NULL, "axisdev88.chipram", INTMEM_SIZE,
                            &error_abort);
     vmstate_register_ram_global(phys_intmem);
-    memory_region_add_subregion(address_space_mem, 0x38000000, phys_intmem);
+    memory_region_add_subregion(address_space_mem, 0x38000000, phys_intmem,
+                                &error_abort);
 
       /* Attach a NAND flash to CS1.  */
     nand = drive_get(IF_MTD, 0, 0);
@@ -288,13 +290,13 @@ void axisdev88_init(MachineState *machine)
     memory_region_init_io(&nand_state.iomem, NULL, &nand_ops, &nand_state,
                           "nand", 0x05000000);
     memory_region_add_subregion(address_space_mem, 0x10000000,
-                                &nand_state.iomem);
+                                &nand_state.iomem, &error_abort);
 
     gpio_state.nand = &nand_state;
     memory_region_init_io(&gpio_state.iomem, NULL, &gpio_ops, &gpio_state,
                           "gpio", 0x5c);
     memory_region_add_subregion(address_space_mem, 0x3001a000,
-                                &gpio_state.iomem);
+                                &gpio_state.iomem, &error_abort);
 
 
     dev = qdev_create(NULL, "etraxfs,pic");
diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c
index 5198037..b2bd4a9 100644
--- a/hw/display/cirrus_vga.c
+++ b/hw/display/cirrus_vga.c
@@ -2892,7 +2892,8 @@ static void cirrus_init_common(CirrusVGAState *s, Object 
*owner,
     memory_region_init_io(&s->cirrus_vga_io, owner, &cirrus_vga_io_ops, s,
                           "cirrus-io", 0x30);
     memory_region_set_flush_coalesced(&s->cirrus_vga_io);
-    memory_region_add_subregion(system_io, 0x3b0, &s->cirrus_vga_io);
+    memory_region_add_subregion(system_io, 0x3b0, &s->cirrus_vga_io,
+                                &error_abort);
 
     memory_region_init(&s->low_mem_container, owner,
                        "cirrus-lowmem-container",
@@ -2900,7 +2901,8 @@ static void cirrus_init_common(CirrusVGAState *s, Object 
*owner,
 
     memory_region_init_io(&s->low_mem, owner, &cirrus_vga_mem_ops, s,
                           "cirrus-low-memory", 0x20000);
-    memory_region_add_subregion(&s->low_mem_container, 0, &s->low_mem);
+    memory_region_add_subregion(&s->low_mem_container, 0, &s->low_mem,
+                                &error_abort);
     for (i = 0; i < 2; ++i) {
         static const char *names[] = { "vga.bank0", "vga.bank1" };
         MemoryRegion *bank = &s->cirrus_bank[i];
@@ -3036,9 +3038,10 @@ static void pci_cirrus_vga_realize(PCIDevice *dev, Error 
**errp)
     memory_region_init(&s->pci_bar, OBJECT(dev), "cirrus-pci-bar0", 0x2000000);
 
     /* XXX: add byte swapping apertures */
-    memory_region_add_subregion(&s->pci_bar, 0, &s->cirrus_linear_io);
+    memory_region_add_subregion(&s->pci_bar, 0, &s->cirrus_linear_io,
+                                &error_abort);
     memory_region_add_subregion(&s->pci_bar, 0x1000000,
-                                &s->cirrus_linear_bitblt_io);
+                                &s->cirrus_linear_bitblt_io, &error_abort);
 
      /* setup memory space */
      /* memory #0 LFB */
diff --git a/hw/display/omap_dss.c b/hw/display/omap_dss.c
index f1fef27..7cb255e 100644
--- a/hw/display/omap_dss.c
+++ b/hw/display/omap_dss.c
@@ -1073,7 +1073,7 @@ struct omap_dss_s *omap_dss_init(struct 
omap_target_agent_s *ta,
     omap_l4_attach(ta, 1, &s->iomem_disc1);
     omap_l4_attach(ta, 2, &s->iomem_rfbi1);
     omap_l4_attach(ta, 3, &s->iomem_venc1);
-    memory_region_add_subregion(sysmem, l3_base, &s->iomem_im3);
+    memory_region_add_subregion(sysmem, l3_base, &s->iomem_im3, &error_abort);
 
 #if 0
     s->state = graphic_console_init(omap_update_display,
diff --git a/hw/display/omap_lcdc.c b/hw/display/omap_lcdc.c
index fda81ba..63ec081 100644
--- a/hw/display/omap_lcdc.c
+++ b/hw/display/omap_lcdc.c
@@ -404,7 +404,7 @@ struct omap_lcd_panel_s *omap_lcdc_init(MemoryRegion 
*sysmem,
     omap_lcdc_reset(s);
 
     memory_region_init_io(&s->iomem, NULL, &omap_lcdc_ops, s, "omap.lcdc", 
0x100);
-    memory_region_add_subregion(sysmem, base, &s->iomem);
+    memory_region_add_subregion(sysmem, base, &s->iomem, &error_abort);
 
     s->con = graphic_console_init(NULL, 0, &omap_ops, s);
 
diff --git a/hw/display/pxa2xx_lcd.c b/hw/display/pxa2xx_lcd.c
index ac3c018..7672aa5 100644
--- a/hw/display/pxa2xx_lcd.c
+++ b/hw/display/pxa2xx_lcd.c
@@ -1001,7 +1001,7 @@ PXA2xxLCDState *pxa2xx_lcdc_init(MemoryRegion *sysmem,
 
     memory_region_init_io(&s->iomem, NULL, &pxa2xx_lcdc_ops, s,
                           "pxa2xx-lcd-controller", 0x00100000);
-    memory_region_add_subregion(sysmem, base, &s->iomem);
+    memory_region_add_subregion(sysmem, base, &s->iomem, &error_abort);
 
     s->con = graphic_console_init(NULL, 0, &pxa2xx_ops, s);
     surface = qemu_console_surface(s->con);
diff --git a/hw/display/sm501.c b/hw/display/sm501.c
index 15a5ba8..b7a7fbd 100644
--- a/hw/display/sm501.c
+++ b/hw/display/sm501.c
@@ -1415,23 +1415,24 @@ void sm501_init(MemoryRegion *address_space_mem, 
uint32_t base,
     vmstate_register_ram_global(&s->local_mem_region);
     memory_region_set_log(&s->local_mem_region, true, DIRTY_MEMORY_VGA);
     s->local_mem = memory_region_get_ram_ptr(&s->local_mem_region);
-    memory_region_add_subregion(address_space_mem, base, &s->local_mem_region);
+    memory_region_add_subregion(address_space_mem, base, &s->local_mem_region,
+                                &error_abort);
 
     /* map mmio */
     memory_region_init_io(sm501_system_config, NULL, &sm501_system_config_ops, 
s,
                           "sm501-system-config", 0x6c);
     memory_region_add_subregion(address_space_mem, base + MMIO_BASE_OFFSET,
-                                sm501_system_config);
+                                sm501_system_config, &error_abort);
     memory_region_init_io(sm501_disp_ctrl, NULL, &sm501_disp_ctrl_ops, s,
                           "sm501-disp-ctrl", 0x1000);
     memory_region_add_subregion(address_space_mem,
                                 base + MMIO_BASE_OFFSET + SM501_DC,
-                                sm501_disp_ctrl);
+                                sm501_disp_ctrl, &error_abort);
     memory_region_init_io(sm501_2d_engine, NULL, &sm501_2d_engine_ops, s,
                           "sm501-2d-engine", 0x54);
     memory_region_add_subregion(address_space_mem,
                                 base + MMIO_BASE_OFFSET + SM501_2D_ENGINE,
-                                sm501_2d_engine);
+                                sm501_2d_engine, &error_abort);
 
     /* bridge to usb host emulation module */
     dev = qdev_create(NULL, "sysbus-ohci");
diff --git a/hw/display/tc6393xb.c b/hw/display/tc6393xb.c
index f5f3f3e..a2f64ec 100644
--- a/hw/display/tc6393xb.c
+++ b/hw/display/tc6393xb.c
@@ -581,13 +581,14 @@ TC6393xbState *tc6393xb_init(MemoryRegion *sysmem, 
uint32_t base, qemu_irq irq)
                          NAND_MFR_TOSHIBA, 0x76);
 
     memory_region_init_io(&s->iomem, NULL, &tc6393xb_ops, s, "tc6393xb", 
0x10000);
-    memory_region_add_subregion(sysmem, base, &s->iomem);
+    memory_region_add_subregion(sysmem, base, &s->iomem, &error_abort);
 
     memory_region_init_ram(&s->vram, NULL, "tc6393xb.vram", 0x100000,
                            &error_abort);
     vmstate_register_ram_global(&s->vram);
     s->vram_ptr = memory_region_get_ram_ptr(&s->vram);
-    memory_region_add_subregion(sysmem, base + 0x100000, &s->vram);
+    memory_region_add_subregion(sysmem, base + 0x100000, &s->vram,
+                                &error_abort);
     s->scr_width = 480;
     s->scr_height = 640;
     s->con = graphic_console_init(NULL, 0, &tc6393xb_gfx_ops, s);
diff --git a/hw/display/vga-isa-mm.c b/hw/display/vga-isa-mm.c
index 4efc222..1c58361 100644
--- a/hw/display/vga-isa-mm.c
+++ b/hw/display/vga-isa-mm.c
@@ -116,10 +116,12 @@ static void vga_mm_init(ISAVGAMMState *s, hwaddr 
vram_base,
 
     vmstate_register(NULL, 0, &vmstate_vga_common, s);
 
-    memory_region_add_subregion(address_space, ctrl_base, s_ioport_ctrl);
+    memory_region_add_subregion(address_space, ctrl_base, s_ioport_ctrl,
+                                &error_abort);
     s->vga.bank_offset = 0;
     memory_region_add_subregion(address_space,
-                                vram_base + 0x000a0000, vga_io_memory);
+                                vram_base + 0x000a0000, vga_io_memory,
+                                &error_abort);
     memory_region_set_coalescing(vga_io_memory);
 }
 
diff --git a/hw/display/vga-pci.c b/hw/display/vga-pci.c
index 1dfa331..504ebb6 100644
--- a/hw/display/vga-pci.c
+++ b/hw/display/vga-pci.c
@@ -212,18 +212,18 @@ void pci_std_vga_mmio_region_init(VGACommonState *s,
     memory_region_init_io(&subs[0], NULL, &pci_vga_ioport_ops, s,
                           "vga ioports remapped", PCI_VGA_IOPORT_SIZE);
     memory_region_add_subregion(parent, PCI_VGA_IOPORT_OFFSET,
-                                &subs[0]);
+                                &subs[0], &error_abort);
 
     memory_region_init_io(&subs[1], NULL, &pci_vga_bochs_ops, s,
                           "bochs dispi interface", PCI_VGA_BOCHS_SIZE);
     memory_region_add_subregion(parent, PCI_VGA_BOCHS_OFFSET,
-                                &subs[1]);
+                                &subs[1], &error_abort);
 
     if (qext) {
         memory_region_init_io(&subs[2], NULL, &pci_vga_qext_ops, s,
                               "qemu extended regs", PCI_VGA_QEXT_SIZE);
         memory_region_add_subregion(parent, PCI_VGA_QEXT_OFFSET,
-                                    &subs[2]);
+                                    &subs[2], &error_abort);
     }
 }
 
diff --git a/hw/display/vga.c b/hw/display/vga.c
index b35d523..74bb4ed 100644
--- a/hw/display/vga.c
+++ b/hw/display/vga.c
@@ -2247,6 +2247,7 @@ void vga_init_vbe(VGACommonState *s, Object *obj, 
MemoryRegion *system_memory)
     /* XXX: use optimized standard vga accesses */
     memory_region_add_subregion(system_memory,
                                 VBE_DISPI_LFB_PHYSICAL_ADDRESS,
-                                &s->vram_vbe);
+                                &s->vram_vbe,
+                                &error_abort);
     s->vbe_mapped = 1;
 }
diff --git a/hw/dma/etraxfs_dma.c b/hw/dma/etraxfs_dma.c
index 3599513..7fd23dc 100644
--- a/hw/dma/etraxfs_dma.c
+++ b/hw/dma/etraxfs_dma.c
@@ -775,7 +775,8 @@ void *etraxfs_dmac_init(hwaddr base, int nr_channels)
 
        memory_region_init_io(&ctrl->mmio, NULL, &dma_ops, ctrl, "etraxfs-dma",
                              nr_channels * 0x2000);
-       memory_region_add_subregion(get_system_memory(), base, &ctrl->mmio);
+        memory_region_add_subregion(get_system_memory(), base, &ctrl->mmio,
+                                    &error_abort);
 
        return ctrl;
 }
diff --git a/hw/dma/i8257.c b/hw/dma/i8257.c
index a414029..15087ce 100644
--- a/hw/dma/i8257.c
+++ b/hw/dma/i8257.c
@@ -526,7 +526,7 @@ static void dma_init2(struct dma_cont *d, int base, int 
dshift,
     memory_region_init_io(&d->channel_io, NULL, &channel_io_ops, d,
                           "dma-chan", 8 << d->dshift);
     memory_region_add_subregion(isa_address_space_io(NULL),
-                                base, &d->channel_io);
+                                base, &d->channel_io, &error_abort);
 
     isa_register_portio_list(NULL, page_base, page_portio_list, d,
                              "dma-page");
@@ -538,7 +538,8 @@ static void dma_init2(struct dma_cont *d, int base, int 
dshift,
     memory_region_init_io(&d->cont_io, NULL, &cont_io_ops, d, "dma-cont",
                           8 << d->dshift);
     memory_region_add_subregion(isa_address_space_io(NULL),
-                                base + (8 << d->dshift), &d->cont_io);
+                                base + (8 << d->dshift), &d->cont_io,
+                                &error_abort);
 
     qemu_register_reset(dma_reset, d);
     dma_reset(d);
diff --git a/hw/dma/omap_dma.c b/hw/dma/omap_dma.c
index 97c57a0..02e7a15 100644
--- a/hw/dma/omap_dma.c
+++ b/hw/dma/omap_dma.c
@@ -1666,7 +1666,7 @@ struct soc_dma_s *omap_dma_init(hwaddr base, qemu_irq 
*irqs,
     omap_dma_clk_update(s, 0, 1);
 
     memory_region_init_io(&s->iomem, NULL, &omap_dma_ops, s, "omap.dma", 
memsize);
-    memory_region_add_subregion(sysmem, base, &s->iomem);
+    memory_region_add_subregion(sysmem, base, &s->iomem, &error_abort);
 
     mpu->drq = s->dma->drq;
 
@@ -2089,7 +2089,7 @@ struct soc_dma_s *omap_dma4_init(hwaddr base, qemu_irq 
*irqs,
     omap_dma_clk_update(s, 0, !!s->dma->freq);
 
     memory_region_init_io(&s->iomem, NULL, &omap_dma4_ops, s, "omap.dma4", 
0x1000);
-    memory_region_add_subregion(sysmem, base, &s->iomem);
+    memory_region_add_subregion(sysmem, base, &s->iomem, &error_abort);
 
     mpu->drq = s->dma->drq;
 
diff --git a/hw/dma/rc4030.c b/hw/dma/rc4030.c
index 3efa6de..2340b89 100644
--- a/hw/dma/rc4030.c
+++ b/hw/dma/rc4030.c
@@ -336,7 +336,7 @@ static void rc4030_dma_tt_update(rc4030State *s, uint32_t 
new_tl_base,
             rc4030_dma_as_update_one(s, i, dma_tl_contents[i].frame);
         }
         memory_region_add_subregion(get_system_memory(), new_tl_base,
-                                    &s->dma_tt_alias);
+                                    &s->dma_tt_alias, &error_abort);
         memory_region_transaction_commit();
     } else {
         memory_region_init(&s->dma_tt_alias, OBJECT(s),
@@ -782,7 +782,7 @@ static void rc4030_realize(DeviceState *dev, Error **errp)
                                  get_system_memory(), 0, DMA_PAGESIZE);
         memory_region_set_enabled(&s->dma_mrs[i], false);
         memory_region_add_subregion(&s->dma_mr, i * DMA_PAGESIZE,
-                                    &s->dma_mrs[i]);
+                                    &s->dma_mrs[i], &error_abort);
     }
     address_space_init(&s->dma_as, &s->dma_mr, "rc4030-dma");
 }
diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c
index 74d22f4..b177355 100644
--- a/hw/i386/kvm/pci-assign.c
+++ b/hw/i386/kvm/pci-assign.c
@@ -267,7 +267,8 @@ static void assigned_dev_iomem_setup(PCIDevice *pci_dev, 
int region_num,
     if (e_size > 0) {
         memory_region_init(&region->container, OBJECT(pci_dev),
                            "assigned-dev-container", e_size);
-        memory_region_add_subregion(&region->container, 0, 
&region->real_iomem);
+        memory_region_add_subregion(&region->container, 0, &region->real_iomem,
+                                    &error_abort);
 
         /* deal with MSI-X MMIO page */
         if (real_region->base_addr <= r_dev->msix_table_addr &&
@@ -301,7 +302,8 @@ static void assigned_dev_ioport_setup(PCIDevice *pci_dev, 
int region_num,
     memory_region_init_io(&region->real_iomem, OBJECT(pci_dev),
                           &assigned_dev_ioport_ops, r_dev->v_addrs + 
region_num,
                           "assigned-dev-iomem", size);
-    memory_region_add_subregion(&region->container, 0, &region->real_iomem);
+    memory_region_add_subregion(&region->container, 0, &region->real_iomem,
+                                &error_abort);
 }
 
 static uint32_t assigned_dev_pci_read(PCIDevice *d, int pos, int len)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index bd79d25..9afc653 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1256,14 +1256,14 @@ FWCfgState *pc_memory_init(MachineState *machine,
     ram_below_4g = g_malloc(sizeof(*ram_below_4g));
     memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", ram,
                              0, below_4g_mem_size);
-    memory_region_add_subregion(system_memory, 0, ram_below_4g);
+    memory_region_add_subregion(system_memory, 0, ram_below_4g, &error_abort);
     e820_add_entry(0, below_4g_mem_size, E820_RAM);
     if (above_4g_mem_size > 0) {
         ram_above_4g = g_malloc(sizeof(*ram_above_4g));
         memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g", ram,
                                  below_4g_mem_size, above_4g_mem_size);
         memory_region_add_subregion(system_memory, 0x100000000ULL,
-                                    ram_above_4g);
+                                    ram_above_4g, &error_abort);
         e820_add_entry(0x100000000ULL, above_4g_mem_size, E820_RAM);
     }
 
@@ -1314,7 +1314,7 @@ FWCfgState *pc_memory_init(MachineState *machine,
         memory_region_init_hva_range(&pcms->hotplug_memory.mr, OBJECT(pcms),
                                      "hotplug-memory", hotplug_mem_size);
         memory_region_add_subregion(system_memory, pcms->hotplug_memory.base,
-                                    &pcms->hotplug_memory.mr);
+                                    &pcms->hotplug_memory.mr, &error_abort);
     }
 
     /* Initialize PC system firmware */
@@ -1418,10 +1418,12 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq 
*gsi,
     MemoryRegion *ioportF0_io = g_new(MemoryRegion, 1);
 
     memory_region_init_io(ioport80_io, NULL, &ioport80_io_ops, NULL, 
"ioport80", 1);
-    memory_region_add_subregion(isa_bus->address_space_io, 0x80, ioport80_io);
+    memory_region_add_subregion(isa_bus->address_space_io, 0x80, ioport80_io,
+                                &error_abort);
 
     memory_region_init_io(ioportF0_io, NULL, &ioportF0_io_ops, NULL, 
"ioportF0", 1);
-    memory_region_add_subregion(isa_bus->address_space_io, 0xf0, ioportF0_io);
+    memory_region_add_subregion(isa_bus->address_space_io, 0xf0, ioportF0_io,
+                                &error_abort);
 
     /*
      * Check if an HPET shall be created.
diff --git a/hw/i386/pc_sysfw.c b/hw/i386/pc_sysfw.c
index 662d997..4b98777 100644
--- a/hw/i386/pc_sysfw.c
+++ b/hw/i386/pc_sysfw.c
@@ -225,7 +225,7 @@ static void old_pc_system_rom_init(MemoryRegion 
*rom_memory, bool isapc_ram_fw)
     /* map all the bios at the top of memory */
     memory_region_add_subregion(rom_memory,
                                 (uint32_t)(-bios_size),
-                                bios);
+                                bios, &error_abort);
 }
 
 void pc_system_firmware_init(MemoryRegion *rom_memory, bool isapc_ram_fw)
diff --git a/hw/ide/cmd646.c b/hw/ide/cmd646.c
index 66fb9d9..ac78f69 100644
--- a/hw/ide/cmd646.c
+++ b/hw/ide/cmd646.c
@@ -251,11 +251,13 @@ static void bmdma_setup_bar(PCIIDEState *d)
         bm = &d->bmdma[i];
         memory_region_init_io(&bm->extra_io, OBJECT(d), &cmd646_bmdma_ops, bm,
                               "cmd646-bmdma-bus", 4);
-        memory_region_add_subregion(&d->bmdma_bar, i * 8, &bm->extra_io);
+        memory_region_add_subregion(&d->bmdma_bar, i * 8, &bm->extra_io,
+                                    &error_abort);
         memory_region_init_io(&bm->addr_ioport, OBJECT(d),
                               &bmdma_addr_ioport_ops, bm,
                               "cmd646-bmdma-ioport", 4);
-        memory_region_add_subregion(&d->bmdma_bar, i * 8 + 4, 
&bm->addr_ioport);
+        memory_region_add_subregion(&d->bmdma_bar, i * 8 + 4, &bm->addr_ioport,
+                                    &error_abort);
     }
 }
 
diff --git a/hw/ide/piix.c b/hw/ide/piix.c
index adb6649..70acfce 100644
--- a/hw/ide/piix.c
+++ b/hw/ide/piix.c
@@ -96,10 +96,12 @@ static void bmdma_setup_bar(PCIIDEState *d)
 
         memory_region_init_io(&bm->extra_io, OBJECT(d), &piix_bmdma_ops, bm,
                               "piix-bmdma", 4);
-        memory_region_add_subregion(&d->bmdma_bar, i * 8, &bm->extra_io);
+        memory_region_add_subregion(&d->bmdma_bar, i * 8, &bm->extra_io,
+                                    &error_abort);
         memory_region_init_io(&bm->addr_ioport, OBJECT(d),
                               &bmdma_addr_ioport_ops, bm, "bmdma", 4);
-        memory_region_add_subregion(&d->bmdma_bar, i * 8 + 4, 
&bm->addr_ioport);
+        memory_region_add_subregion(&d->bmdma_bar, i * 8 + 4, &bm->addr_ioport,
+                                    &error_abort);
     }
 }
 
diff --git a/hw/ide/via.c b/hw/ide/via.c
index e2da9ef..5efb906 100644
--- a/hw/ide/via.c
+++ b/hw/ide/via.c
@@ -98,10 +98,12 @@ static void bmdma_setup_bar(PCIIDEState *d)
 
         memory_region_init_io(&bm->extra_io, OBJECT(d), &via_bmdma_ops, bm,
                               "via-bmdma", 4);
-        memory_region_add_subregion(&d->bmdma_bar, i * 8, &bm->extra_io);
+        memory_region_add_subregion(&d->bmdma_bar, i * 8, &bm->extra_io,
+                                    &error_abort);
         memory_region_init_io(&bm->addr_ioport, OBJECT(d),
                               &bmdma_addr_ioport_ops, bm, "bmdma", 4);
-        memory_region_add_subregion(&d->bmdma_bar, i * 8 + 4, 
&bm->addr_ioport);
+        memory_region_add_subregion(&d->bmdma_bar, i * 8 + 4, &bm->addr_ioport,
+                                    &error_abort);
     }
 }
 
diff --git a/hw/input/pxa2xx_keypad.c b/hw/input/pxa2xx_keypad.c
index 8501114..e2bde81 100644
--- a/hw/input/pxa2xx_keypad.c
+++ b/hw/input/pxa2xx_keypad.c
@@ -314,7 +314,7 @@ PXA2xxKeyPadState *pxa27x_keypad_init(MemoryRegion *sysmem,
 
     memory_region_init_io(&s->iomem, NULL, &pxa2xx_keypad_ops, s,
                           "pxa2xx-keypad", 0x00100000);
-    memory_region_add_subregion(sysmem, base, &s->iomem);
+    memory_region_add_subregion(sysmem, base, &s->iomem, &error_abort);
 
     vmstate_register(NULL, 0, &vmstate_pxa2xx_keypad, s);
 
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
index 0032b97..e65b66d 100644
--- a/hw/intc/apic_common.c
+++ b/hw/intc/apic_common.c
@@ -309,7 +309,8 @@ static void apic_common_realize(DeviceState *dev, Error 
**errp)
     info->realize(dev, errp);
     if (!mmio_registered) {
         ICCBus *b = ICC_BUS(qdev_get_parent_bus(dev));
-        memory_region_add_subregion(b->apic_address_space, 0, &s->io_memory);
+        memory_region_add_subregion(b->apic_address_space, 0, &s->io_memory,
+                                    &error_abort);
         mmio_registered = true;
     }
 
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
index e13b729..4b0f1c3 100644
--- a/hw/intc/armv7m_nvic.c
+++ b/hw/intc/armv7m_nvic.c
@@ -511,7 +511,7 @@ static void armv7m_nvic_realize(DeviceState *dev, Error 
**errp)
      */
     memory_region_init_io(&s->sysregmem, OBJECT(s), &nvic_sysreg_ops, s,
                           "nvic_sysregs", 0x1000);
-    memory_region_add_subregion(&s->container, 0, &s->sysregmem);
+    memory_region_add_subregion(&s->container, 0, &s->sysregmem, &error_abort);
     /* Alias the GIC region so we can get only the section of it
      * we need, and layer it on top of the system register region.
      */
@@ -523,7 +523,8 @@ static void armv7m_nvic_realize(DeviceState *dev, Error 
**errp)
     /* Map the whole thing into system memory at the location required
      * by the v7M architecture.
      */
-    memory_region_add_subregion(get_system_memory(), 0xe000e000, 
&s->container);
+    memory_region_add_subregion(get_system_memory(), 0xe000e000, &s->container,
+                                &error_abort);
     s->systick.timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, systick_timer_tick, s);
 }
 
diff --git a/hw/intc/exynos4210_gic.c b/hw/intc/exynos4210_gic.c
index b2a4950..57b6d1f 100644
--- a/hw/intc/exynos4210_gic.c
+++ b/hw/intc/exynos4210_gic.c
@@ -318,7 +318,8 @@ static int exynos4210_gic_init(SysBusDevice *sbd)
                                  0,
                                  EXYNOS4210_GIC_CPU_REGION_SIZE);
         memory_region_add_subregion(&s->cpu_container,
-                EXYNOS4210_EXT_GIC_CPU_GET_OFFSET(i), &s->cpu_alias[i]);
+                EXYNOS4210_EXT_GIC_CPU_GET_OFFSET(i), &s->cpu_alias[i],
+                &error_abort);
 
         /* Map Distributor per SMP Core */
         sprintf(dist_alias_name, "%s%x", dist_prefix, i);
@@ -328,7 +329,8 @@ static int exynos4210_gic_init(SysBusDevice *sbd)
                                  0,
                                  EXYNOS4210_GIC_DIST_REGION_SIZE);
         memory_region_add_subregion(&s->dist_container,
-                EXYNOS4210_EXT_GIC_DIST_GET_OFFSET(i), &s->dist_alias[i]);
+                EXYNOS4210_EXT_GIC_DIST_GET_OFFSET(i), &s->dist_alias[i],
+                &error_abort);
     }
 
     sysbus_init_mmio(sbd, &s->cpu_container);
diff --git a/hw/intc/openpic.c b/hw/intc/openpic.c
index 14ab0e3..b9aa8e6 100644
--- a/hw/intc/openpic.c
+++ b/hw/intc/openpic.c
@@ -1401,7 +1401,7 @@ static void map_list(OpenPICState *opp, const MemReg 
*list, int *count)
                               opp, list->name, list->size);
 
         memory_region_add_subregion(&opp->mem, list->start_addr,
-                                    &opp->sub_io_mem[*count]);
+                                    &opp->sub_io_mem[*count], &error_abort);
 
         (*count)++;
         list++;
diff --git a/hw/intc/realview_gic.c b/hw/intc/realview_gic.c
index 6c81296..da7dff7 100644
--- a/hw/intc/realview_gic.c
+++ b/hw/intc/realview_gic.c
@@ -43,9 +43,11 @@ static void realview_gic_realize(DeviceState *dev, Error 
**errp)
     qdev_init_gpio_in(dev, realview_gic_set_irq, numirq - 32);
 
     memory_region_add_subregion(&s->container, 0,
-                                sysbus_mmio_get_region(busdev, 1));
+                                sysbus_mmio_get_region(busdev, 1),
+                                &error_abort);
     memory_region_add_subregion(&s->container, 0x1000,
-                                sysbus_mmio_get_region(busdev, 0));
+                                sysbus_mmio_get_region(busdev, 0),
+                                &error_abort);
 }
 
 static void realview_gic_init(Object *obj)
diff --git a/hw/intc/sh_intc.c b/hw/intc/sh_intc.c
index 55c76e4..56c903f 100644
--- a/hw/intc/sh_intc.c
+++ b/hw/intc/sh_intc.c
@@ -319,11 +319,13 @@ static unsigned int sh_intc_register(MemoryRegion *sysmem,
 #define SH_INTC_IOMEM_FORMAT "interrupt-controller-%s-%s-%s"
     snprintf(name, sizeof(name), SH_INTC_IOMEM_FORMAT, type, action, "p4");
     memory_region_init_alias(iomem_p4, NULL, name, iomem, INTC_A7(address), 4);
-    memory_region_add_subregion(sysmem, P4ADDR(address), iomem_p4);
+    memory_region_add_subregion(sysmem, P4ADDR(address), iomem_p4,
+                                &error_abort);
 
     snprintf(name, sizeof(name), SH_INTC_IOMEM_FORMAT, type, action, "a7");
     memory_region_init_alias(iomem_a7, NULL, name, iomem, INTC_A7(address), 4);
-    memory_region_add_subregion(sysmem, A7ADDR(address), iomem_a7);
+    memory_region_add_subregion(sysmem, A7ADDR(address), iomem_a7,
+                                &error_abort);
 #undef SH_INTC_IOMEM_FORMAT
 
     /* used to increment aliases index */
diff --git a/hw/isa/apm.c b/hw/isa/apm.c
index 26ab170..f1709db 100644
--- a/hw/isa/apm.c
+++ b/hw/isa/apm.c
@@ -98,5 +98,5 @@ void apm_init(PCIDevice *dev, APMState *apm, 
apm_ctrl_changed_t callback,
     /* ioport 0xb2, 0xb3 */
     memory_region_init_io(&apm->io, OBJECT(dev), &apm_ops, apm, "apm-io", 2);
     memory_region_add_subregion(pci_address_space_io(dev), APM_CNT_IOPORT,
-                                &apm->io);
+                                &apm->io, &error_abort);
 }
diff --git a/hw/isa/isa-bus.c b/hw/isa/isa-bus.c
index 43e0cd8..b1d311a 100644
--- a/hw/isa/isa-bus.c
+++ b/hw/isa/isa-bus.c
@@ -101,7 +101,8 @@ static inline void isa_init_ioport(ISADevice *dev, uint16_t 
ioport)
 
 void isa_register_ioport(ISADevice *dev, MemoryRegion *io, uint16_t start)
 {
-    memory_region_add_subregion(isabus->address_space_io, start, io);
+    memory_region_add_subregion(isabus->address_space_io, start, io,
+                                &error_abort);
     isa_init_ioport(dev, start);
 }
 
diff --git a/hw/isa/vt82c686.c b/hw/isa/vt82c686.c
index 252e1d7..3db63ea 100644
--- a/hw/isa/vt82c686.c
+++ b/hw/isa/vt82c686.c
@@ -362,13 +362,14 @@ static void vt82c686b_pm_realize(PCIDevice *dev, Error 
**errp)
     pci_conf[0x91] = s->smb_io_base >> 8;
     pci_conf[0xd2] = 0x90;
     pm_smbus_init(&s->dev.qdev, &s->smb);
-    memory_region_add_subregion(get_system_io(), s->smb_io_base, &s->smb.io);
+    memory_region_add_subregion(get_system_io(), s->smb_io_base, &s->smb.io,
+                                &error_abort);
 
     apm_init(dev, &s->apm, NULL, s);
 
     memory_region_init(&s->io, OBJECT(dev), "vt82c686-pm", 64);
     memory_region_set_enabled(&s->io, false);
-    memory_region_add_subregion(get_system_io(), 0, &s->io);
+    memory_region_add_subregion(get_system_io(), 0, &s->io, &error_abort);
 
     acpi_pm_tmr_init(&s->ar, pm_tmr_timer, &s->io);
     acpi_pm1_evt_init(&s->ar, pm_tmr_timer, &s->io);
@@ -458,7 +459,7 @@ static void vt82c686b_realize(PCIDevice *d, Error **errp)
     /* The floppy also uses 0x3f0 and 0x3f1.
      * But we do not emulate a floppy, so just set it here. */
     memory_region_add_subregion(isa_bus->address_space_io, 0x3f0,
-                                &vt82c->superio);
+                                &vt82c->superio, &error_abort);
 
     qemu_register_reset(vt82c686b_reset, d);
 }
diff --git a/hw/lm32/lm32_boards.c b/hw/lm32/lm32_boards.c
index 70f48d3..ff744fd 100644
--- a/hw/lm32/lm32_boards.c
+++ b/hw/lm32/lm32_boards.c
@@ -113,7 +113,8 @@ static void lm32_evr_init(MachineState *machine)
 
     memory_region_allocate_system_memory(phys_ram, NULL, "lm32_evr.sdram",
                                          ram_size);
-    memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
+    memory_region_add_subregion(address_space_mem, ram_base, phys_ram,
+                                &error_abort);
 
     dinfo = drive_get(IF_PFLASH, 0, 0);
     /* Spansion S29NS128P */
@@ -214,7 +215,8 @@ static void lm32_uclinux_init(MachineState *machine)
 
     memory_region_allocate_system_memory(phys_ram, NULL,
                                          "lm32_uclinux.sdram", ram_size);
-    memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
+    memory_region_add_subregion(address_space_mem, ram_base, phys_ram,
+                                &error_abort);
 
     dinfo = drive_get(IF_PFLASH, 0, 0);
     /* Spansion S29NS128P */
diff --git a/hw/lm32/milkymist.c b/hw/lm32/milkymist.c
index e755f5b..0f35218 100644
--- a/hw/lm32/milkymist.c
+++ b/hw/lm32/milkymist.c
@@ -120,7 +120,8 @@ milkymist_init(MachineState *machine)
 
     memory_region_allocate_system_memory(phys_sdram, NULL, "milkymist.sdram",
                                          sdram_size);
-    memory_region_add_subregion(address_space_mem, sdram_base, phys_sdram);
+    memory_region_add_subregion(address_space_mem, sdram_base, phys_sdram,
+                                &error_abort);
 
     dinfo = drive_get(IF_PFLASH, 0, 0);
     /* Numonyx JS28F256J3F105 */
diff --git a/hw/m68k/an5206.c b/hw/m68k/an5206.c
index f63ab2b..cba086e 100644
--- a/hw/m68k/an5206.c
+++ b/hw/m68k/an5206.c
@@ -51,12 +51,13 @@ static void an5206_init(MachineState *machine)
 
     /* DRAM at address zero */
     memory_region_allocate_system_memory(ram, NULL, "an5206.ram", ram_size);
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, ram, &error_abort);
 
     /* Internal SRAM.  */
     memory_region_init_ram(sram, NULL, "an5206.sram", 512, &error_abort);
     vmstate_register_ram_global(sram);
-    memory_region_add_subregion(address_space_mem, AN5206_RAMBAR_ADDR, sram);
+    memory_region_add_subregion(address_space_mem, AN5206_RAMBAR_ADDR, sram,
+                                &error_abort);
 
     mcf5206_init(address_space_mem, AN5206_MBAR_ADDR, cpu);
 
diff --git a/hw/m68k/dummy_m68k.c b/hw/m68k/dummy_m68k.c
index 5b77d93..5561adf 100644
--- a/hw/m68k/dummy_m68k.c
+++ b/hw/m68k/dummy_m68k.c
@@ -44,7 +44,7 @@ static void dummy_m68k_init(MachineState *machine)
     /* RAM at address zero */
     memory_region_allocate_system_memory(ram, NULL, "dummy_m68k.ram",
                                          ram_size);
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, ram, &error_abort);
 
     /* Load kernel.  */
     if (kernel_filename) {
diff --git a/hw/m68k/mcf5206.c b/hw/m68k/mcf5206.c
index 1727a46..b0e15c6 100644
--- a/hw/m68k/mcf5206.c
+++ b/hw/m68k/mcf5206.c
@@ -534,7 +534,7 @@ qemu_irq *mcf5206_init(MemoryRegion *sysmem, uint32_t base, 
M68kCPU *cpu)
 
     memory_region_init_io(&s->iomem, NULL, &m5206_mbar_ops, s,
                           "mbar", 0x00001000);
-    memory_region_add_subregion(sysmem, base, &s->iomem);
+    memory_region_add_subregion(sysmem, base, &s->iomem, &error_abort);
 
     pic = qemu_allocate_irqs(m5206_mbar_set_irq, s, 14);
     s->timer[0] = m5206_timer_init(pic[9]);
diff --git a/hw/m68k/mcf5208.c b/hw/m68k/mcf5208.c
index 326a42d..e080ed6 100644
--- a/hw/m68k/mcf5208.c
+++ b/hw/m68k/mcf5208.c
@@ -174,7 +174,7 @@ static void mcf5208_sys_init(MemoryRegion *address_space, 
qemu_irq *pic)
 
     /* SDRAMC.  */
     memory_region_init_io(iomem, NULL, &m5208_sys_ops, NULL, "m5208-sys", 
0x00004000);
-    memory_region_add_subregion(address_space, 0xfc0a8000, iomem);
+    memory_region_add_subregion(address_space, 0xfc0a8000, iomem, 
&error_abort);
     /* Timers.  */
     for (i = 0; i < 2; i++) {
         s = (m5208_timer_state *)g_malloc0(sizeof(m5208_timer_state));
@@ -183,7 +183,7 @@ static void mcf5208_sys_init(MemoryRegion *address_space, 
qemu_irq *pic)
         memory_region_init_io(&s->iomem, NULL, &m5208_timer_ops, s,
                               "m5208-timer", 0x00004000);
         memory_region_add_subregion(address_space, 0xfc080000 + 0x4000 * i,
-                                    &s->iomem);
+                                    &s->iomem, &error_abort);
         s->irq = pic[4 + i];
     }
 }
@@ -219,12 +219,14 @@ static void mcf5208evb_init(MachineState *machine)
 
     /* DRAM at 0x40000000 */
     memory_region_allocate_system_memory(ram, NULL, "mcf5208.ram", ram_size);
-    memory_region_add_subregion(address_space_mem, 0x40000000, ram);
+    memory_region_add_subregion(address_space_mem, 0x40000000, ram,
+                                &error_abort);
 
     /* Internal SRAM.  */
     memory_region_init_ram(sram, NULL, "mcf5208.sram", 16384, &error_abort);
     vmstate_register_ram_global(sram);
-    memory_region_add_subregion(address_space_mem, 0x80000000, sram);
+    memory_region_add_subregion(address_space_mem, 0x80000000, sram,
+                                &error_abort);
 
     /* Internal peripherals.  */
     pic = mcf_intc_init(address_space_mem, 0xfc048000, cpu);
diff --git a/hw/m68k/mcf_intc.c b/hw/m68k/mcf_intc.c
index f13c7f3..3c6c5e5 100644
--- a/hw/m68k/mcf_intc.c
+++ b/hw/m68k/mcf_intc.c
@@ -162,7 +162,7 @@ qemu_irq *mcf_intc_init(MemoryRegion *sysmem,
     mcf_intc_reset(s);
 
     memory_region_init_io(&s->iomem, NULL, &mcf_intc_ops, s, "mcf", 0x100);
-    memory_region_add_subregion(sysmem, base, &s->iomem);
+    memory_region_add_subregion(sysmem, base, &s->iomem, &error_abort);
 
     return qemu_allocate_irqs(mcf_intc_set_irq, s, 64);
 }
diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
index bb04862..8cc9118 100644
--- a/hw/mem/pc-dimm.c
+++ b/hw/mem/pc-dimm.c
@@ -95,7 +95,7 @@ void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState 
*hpms,
         goto out;
     }
 
-    memory_region_add_subregion(&hpms->mr, addr - hpms->base, mr);
+    memory_region_add_subregion(&hpms->mr, addr - hpms->base, mr, 
&error_abort);
     vmstate_register_ram(mr, dev);
     numa_set_mem_node_id(addr, memory_region_size(mr), dimm->node);
 
diff --git a/hw/microblaze/petalogix_ml605_mmu.c 
b/hw/microblaze/petalogix_ml605_mmu.c
index ed84a37..19de681 100644
--- a/hw/microblaze/petalogix_ml605_mmu.c
+++ b/hw/microblaze/petalogix_ml605_mmu.c
@@ -94,12 +94,14 @@ petalogix_ml605_init(MachineState *machine)
     memory_region_init_ram(phys_lmb_bram, NULL, "petalogix_ml605.lmb_bram",
                            LMB_BRAM_SIZE, &error_abort);
     vmstate_register_ram_global(phys_lmb_bram);
-    memory_region_add_subregion(address_space_mem, 0x00000000, phys_lmb_bram);
+    memory_region_add_subregion(address_space_mem, 0x00000000, phys_lmb_bram,
+                                &error_abort);
 
     memory_region_init_ram(phys_ram, NULL, "petalogix_ml605.ram", ram_size,
                            &error_abort);
     vmstate_register_ram_global(phys_ram);
-    memory_region_add_subregion(address_space_mem, MEMORY_BASEADDR, phys_ram);
+    memory_region_add_subregion(address_space_mem, MEMORY_BASEADDR, phys_ram,
+                                &error_abort);
 
     dinfo = drive_get(IF_PFLASH, 0, 0);
     /* 5th parameter 2 means bank-width
diff --git a/hw/microblaze/petalogix_s3adsp1800_mmu.c 
b/hw/microblaze/petalogix_s3adsp1800_mmu.c
index 0c2140c..62e6563 100644
--- a/hw/microblaze/petalogix_s3adsp1800_mmu.c
+++ b/hw/microblaze/petalogix_s3adsp1800_mmu.c
@@ -73,12 +73,13 @@ petalogix_s3adsp1800_init(MachineState *machine)
                            "petalogix_s3adsp1800.lmb_bram", LMB_BRAM_SIZE,
                            &error_abort);
     vmstate_register_ram_global(phys_lmb_bram);
-    memory_region_add_subregion(sysmem, 0x00000000, phys_lmb_bram);
+    memory_region_add_subregion(sysmem, 0x00000000, phys_lmb_bram,
+                                &error_abort);
 
     memory_region_init_ram(phys_ram, NULL, "petalogix_s3adsp1800.ram",
                            ram_size, &error_abort);
     vmstate_register_ram_global(phys_ram);
-    memory_region_add_subregion(sysmem, ddr_base, phys_ram);
+    memory_region_add_subregion(sysmem, ddr_base, phys_ram, &error_abort);
 
     dinfo = drive_get(IF_PFLASH, 0, 0);
     pflash_cfi01_register(FLASH_BASEADDR,
diff --git a/hw/mips/gt64xxx_pci.c b/hw/mips/gt64xxx_pci.c
index 10fcca3..7c630bc 100644
--- a/hw/mips/gt64xxx_pci.c
+++ b/hw/mips/gt64xxx_pci.c
@@ -289,7 +289,8 @@ static void gt64120_isd_mapping(GT64120State *s)
         s->ISD_length, s->ISD_start, length, start);
     s->ISD_start = start;
     s->ISD_length = length;
-    memory_region_add_subregion(get_system_memory(), s->ISD_start, 
&s->ISD_mem);
+    memory_region_add_subregion(get_system_memory(), s->ISD_start, &s->ISD_mem,
+                                &error_abort);
 }
 
 static void gt64120_pci_mapping(GT64120State *s)
@@ -309,7 +310,7 @@ static void gt64120_pci_mapping(GT64120State *s)
             memory_region_init_alias(&s->PCI0IO_mem, OBJECT(s), "pci0-io",
                                      get_system_io(), 0, s->PCI0IO_length);
             memory_region_add_subregion(get_system_memory(), s->PCI0IO_start,
-                                        &s->PCI0IO_mem);
+                                        &s->PCI0IO_mem, &error_abort);
         }
     }
 
@@ -329,7 +330,7 @@ static void gt64120_pci_mapping(GT64120State *s)
                                      &s->pci0_mem, s->PCI0M0_start,
                                      s->PCI0M0_length);
             memory_region_add_subregion(get_system_memory(), s->PCI0M0_start,
-                                        &s->PCI0M0_mem);
+                                        &s->PCI0M0_mem, &error_abort);
         }
     }
 
@@ -349,7 +350,7 @@ static void gt64120_pci_mapping(GT64120State *s)
                                      &s->pci0_mem, s->PCI0M1_start,
                                      s->PCI0M1_length);
             memory_region_add_subregion(get_system_memory(), s->PCI0M1_start,
-                                        &s->PCI0M1_mem);
+                                        &s->PCI0M1_mem, &error_abort);
         }
     }
 }
diff --git a/hw/mips/mips_fulong2e.c b/hw/mips/mips_fulong2e.c
index dea941a..1ed8d1b 100644
--- a/hw/mips/mips_fulong2e.c
+++ b/hw/mips/mips_fulong2e.c
@@ -308,8 +308,9 @@ static void mips_fulong2e_init(MachineState *machine)
     vmstate_register_ram_global(bios);
     memory_region_set_readonly(bios, true);
 
-    memory_region_add_subregion(address_space_mem, 0, ram);
-    memory_region_add_subregion(address_space_mem, 0x1fc00000LL, bios);
+    memory_region_add_subregion(address_space_mem, 0, ram, &error_abort);
+    memory_region_add_subregion(address_space_mem, 0x1fc00000LL, bios,
+                                &error_abort);
 
     /* We do not support flash operation, just loading pmon.bin as raw BIOS.
      * Please use -L to set the BIOS path and -bios to set bios name. */
diff --git a/hw/mips/mips_jazz.c b/hw/mips/mips_jazz.c
index 9d60633..1c49704 100644
--- a/hw/mips/mips_jazz.c
+++ b/hw/mips/mips_jazz.c
@@ -181,7 +181,7 @@ static void mips_jazz_init(MachineState *machine,
     /* allocate RAM */
     memory_region_allocate_system_memory(ram, NULL, "mips_jazz.ram",
                                          machine->ram_size);
-    memory_region_add_subregion(address_space, 0, ram);
+    memory_region_add_subregion(address_space, 0, ram, &error_abort);
 
     memory_region_init_ram(bios, NULL, "mips_jazz.bios", MAGNUM_BIOS_SIZE,
                            &error_abort);
@@ -189,8 +189,10 @@ static void mips_jazz_init(MachineState *machine,
     memory_region_set_readonly(bios, true);
     memory_region_init_alias(bios2, NULL, "mips_jazz.bios", bios,
                              0, MAGNUM_BIOS_SIZE);
-    memory_region_add_subregion(address_space, 0x1fc00000LL, bios);
-    memory_region_add_subregion(address_space, 0xfff00000LL, bios2);
+    memory_region_add_subregion(address_space, 0x1fc00000LL, bios,
+                                &error_abort);
+    memory_region_add_subregion(address_space, 0xfff00000LL, bios2,
+                                &error_abort);
 
     /* load the BIOS image. */
     if (bios_name == NULL)
@@ -218,17 +220,22 @@ static void mips_jazz_init(MachineState *machine,
     sysbus_connect_irq(sysbus, 0, env->irq[6]);
     sysbus_connect_irq(sysbus, 1, env->irq[3]);
     memory_region_add_subregion(address_space, 0x80000000,
-                                sysbus_mmio_get_region(sysbus, 0));
+                                sysbus_mmio_get_region(sysbus, 0),
+                                &error_abort);
     memory_region_add_subregion(address_space, 0xf0000000,
-                                sysbus_mmio_get_region(sysbus, 1));
+                                sysbus_mmio_get_region(sysbus, 1),
+                                &error_abort);
     memory_region_init_io(dma_dummy, NULL, &dma_dummy_ops, NULL, "dummy_dma", 
0x1000);
-    memory_region_add_subregion(address_space, 0x8000d000, dma_dummy);
+    memory_region_add_subregion(address_space, 0x8000d000, dma_dummy,
+                                &error_abort);
 
     /* ISA bus: IO space at 0x90000000, mem space at 0x91000000 */
     memory_region_init(isa_io, NULL, "isa-io", 0x00010000);
     memory_region_init(isa_mem, NULL, "isa-mem", 0x01000000);
-    memory_region_add_subregion(address_space, 0x90000000, isa_io);
-    memory_region_add_subregion(address_space, 0x91000000, isa_mem);
+    memory_region_add_subregion(address_space, 0x90000000, isa_io,
+                                &error_abort);
+    memory_region_add_subregion(address_space, 0x91000000, isa_mem,
+                                &error_abort);
     isa_bus = isa_bus_new(NULL, isa_mem, isa_io);
 
     /* ISA devices */
@@ -256,7 +263,8 @@ static void mips_jazz_init(MachineState *machine,
             vmstate_register_ram_global(rom_mr);
             memory_region_set_readonly(rom_mr, true);
             uint8_t *rom = memory_region_get_ram_ptr(rom_mr);
-            memory_region_add_subregion(address_space, 0x60000000, rom_mr);
+            memory_region_add_subregion(address_space, 0x60000000, rom_mr,
+                                        &error_abort);
             rom[0] = 0x10; /* Mips G364 */
         }
         break;
@@ -312,12 +320,12 @@ static void mips_jazz_init(MachineState *machine,
     /* Real time clock */
     rtc_init(isa_bus, 1980, NULL);
     memory_region_init_io(rtc, NULL, &rtc_ops, NULL, "rtc", 0x1000);
-    memory_region_add_subregion(address_space, 0x80004000, rtc);
+    memory_region_add_subregion(address_space, 0x80004000, rtc, &error_abort);
 
     /* Keyboard (i8042) */
     i8042_mm_init(qdev_get_gpio_in(rc4030, 6), qdev_get_gpio_in(rc4030, 7),
                   i8042, 0x1000, 0x1);
-    memory_region_add_subregion(address_space, 0x80005000, i8042);
+    memory_region_add_subregion(address_space, 0x80005000, i8042, 
&error_abort);
 
     /* Serial ports */
     if (serial_hds[0]) {
diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c
index 3082e75..91863e6 100644
--- a/hw/mips/mips_malta.c
+++ b/hw/mips/mips_malta.c
@@ -552,8 +552,10 @@ static MaltaFPGAState *malta_fpga_init(MemoryRegion 
*address_space,
     memory_region_init_alias(&s->iomem_hi, NULL, "malta-fpga",
                              &s->iomem, 0xa00, 0x10000-0xa00);
 
-    memory_region_add_subregion(address_space, base, &s->iomem_lo);
-    memory_region_add_subregion(address_space, base + 0xa00, &s->iomem_hi);
+    memory_region_add_subregion(address_space, base, &s->iomem_lo,
+                                &error_abort);
+    memory_region_add_subregion(address_space, base + 0xa00, &s->iomem_hi,
+                                &error_abort);
 
     s->display = qemu_chr_new("fpga", "vc:320x200", malta_fpga_led_init);
 
@@ -1005,12 +1007,13 @@ void mips_malta_init(MachineState *machine)
     /* register RAM at high address where it is undisturbed by IO */
     memory_region_allocate_system_memory(ram_high, NULL, "mips_malta.ram",
                                          ram_size);
-    memory_region_add_subregion(system_memory, 0x80000000, ram_high);
+    memory_region_add_subregion(system_memory, 0x80000000, ram_high,
+                                &error_abort);
 
     /* alias for pre IO hole access */
     memory_region_init_alias(ram_low_preio, NULL, "mips_malta_low_preio.ram",
                              ram_high, 0, MIN(ram_size, (256 << 20)));
-    memory_region_add_subregion(system_memory, 0, ram_low_preio);
+    memory_region_add_subregion(system_memory, 0, ram_low_preio, &error_abort);
 
     /* alias for post IO hole access, if there is enough RAM */
     if (ram_size > (512 << 20)) {
@@ -1019,7 +1022,8 @@ void mips_malta_init(MachineState *machine)
                                  "mips_malta_low_postio.ram",
                                  ram_high, 512 << 20,
                                  ram_size - (512 << 20));
-        memory_region_add_subregion(system_memory, 512 << 20, ram_low_postio);
+        memory_region_add_subregion(system_memory, 512 << 20, ram_low_postio,
+                                    &error_abort);
     }
 
     /* generate SPD EEPROM data */
@@ -1137,7 +1141,8 @@ void mips_malta_init(MachineState *machine)
                memory_region_get_ram_ptr(bios), BIOS_SIZE);
     }
     memory_region_set_readonly(bios_copy, true);
-    memory_region_add_subregion(system_memory, RESET_ADDRESS, bios_copy);
+    memory_region_add_subregion(system_memory, RESET_ADDRESS, bios_copy,
+                                &error_abort);
 
     /* Board ID = 0x420 (Malta Board with CoreLV) */
     stl_p(memory_region_get_ram_ptr(bios_copy) + 0x10, 0x00000420);
diff --git a/hw/mips/mips_mipssim.c b/hw/mips/mips_mipssim.c
index 61f74a6..d11944f 100644
--- a/hw/mips/mips_mipssim.c
+++ b/hw/mips/mips_mipssim.c
@@ -129,7 +129,8 @@ static void mipsnet_init(int base, qemu_irq irq, NICInfo 
*nd)
     sysbus_connect_irq(s, 0, irq);
     memory_region_add_subregion(get_system_io(),
                                 base,
-                                sysbus_mmio_get_region(s, 0));
+                                sysbus_mmio_get_region(s, 0),
+                                &error_abort);
 }
 
 static void
@@ -178,10 +179,11 @@ mips_mipssim_init(MachineState *machine)
     vmstate_register_ram_global(bios);
     memory_region_set_readonly(bios, true);
 
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, ram, &error_abort);
 
     /* Map the BIOS / boot exception handler. */
-    memory_region_add_subregion(address_space_mem, 0x1fc00000LL, bios);
+    memory_region_add_subregion(address_space_mem, 0x1fc00000LL, bios,
+                                &error_abort);
     /* Load a BIOS / boot exception handler image. */
     if (bios_name == NULL)
         bios_name = BIOS_FILENAME;
@@ -218,7 +220,8 @@ mips_mipssim_init(MachineState *machine)
     /* Register 64 KB of ISA IO space at 0x1fd00000. */
     memory_region_init_alias(isa, NULL, "isa_mmio",
                              get_system_io(), 0, 0x00010000);
-    memory_region_add_subregion(get_system_memory(), 0x1fd00000, isa);
+    memory_region_add_subregion(get_system_memory(), 0x1fd00000, isa,
+                                &error_abort);
 
     /* A single 16450 sits at offset 0x3f8. It is attached to
        MIPS CPU INT2, which is interrupt 4. */
diff --git a/hw/mips/mips_r4k.c b/hw/mips/mips_r4k.c
index f4dcacd..cd52d83 100644
--- a/hw/mips/mips_r4k.c
+++ b/hw/mips/mips_r4k.c
@@ -208,10 +208,11 @@ void mips_r4k_init(MachineState *machine)
     }
     memory_region_allocate_system_memory(ram, NULL, "mips_r4k.ram", ram_size);
 
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, ram, &error_abort);
 
     memory_region_init_io(iomem, NULL, &mips_qemu_ops, NULL, "mips-qemu", 
0x10000);
-    memory_region_add_subregion(address_space_mem, 0x1fbf0000, iomem);
+    memory_region_add_subregion(address_space_mem, 0x1fbf0000, iomem,
+                                &error_abort);
 
     /* Try to load a BIOS image. If this fails, we continue regardless,
        but initialize the hardware ourselves. When a kernel gets
@@ -236,7 +237,8 @@ void mips_r4k_init(MachineState *machine)
                                &error_abort);
         vmstate_register_ram_global(bios);
         memory_region_set_readonly(bios, true);
-        memory_region_add_subregion(get_system_memory(), 0x1fc00000, bios);
+        memory_region_add_subregion(get_system_memory(), 0x1fc00000, bios,
+                                    &error_abort);
 
         load_image_targphys(filename, 0x1fc00000, BIOS_SIZE);
     } else if ((dinfo = drive_get(IF_PFLASH, 0, 0)) != NULL) {
@@ -272,8 +274,10 @@ void mips_r4k_init(MachineState *machine)
     memory_region_init_alias(isa_io, NULL, "isa-io",
                              get_system_io(), 0, 0x00010000);
     memory_region_init(isa_mem, NULL, "isa-mem", 0x01000000);
-    memory_region_add_subregion(get_system_memory(), 0x14000000, isa_io);
-    memory_region_add_subregion(get_system_memory(), 0x10000000, isa_mem);
+    memory_region_add_subregion(get_system_memory(), 0x14000000, isa_io,
+                                &error_abort);
+    memory_region_add_subregion(get_system_memory(), 0x10000000, isa_mem,
+                                &error_abort);
     isa_bus = isa_bus_new(NULL, isa_mem, get_system_io());
 
     /* The PIC is attached to the MIPS CPU INT0 pin */
diff --git a/hw/misc/debugexit.c b/hw/misc/debugexit.c
index 69a1b00..df7142c 100644
--- a/hw/misc/debugexit.c
+++ b/hw/misc/debugexit.c
@@ -43,7 +43,7 @@ static void debug_exit_realizefn(DeviceState *d, Error **errp)
     memory_region_init_io(&isa->io, OBJECT(dev), &debug_exit_ops, isa,
                           TYPE_ISA_DEBUG_EXIT_DEVICE, isa->iosize);
     memory_region_add_subregion(isa_address_space_io(dev),
-                                isa->iobase, &isa->io);
+                                isa->iobase, &isa->io, &error_abort);
 }
 
 static Property debug_exit_properties[] = {
diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
index cc76989..65178e6 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -356,7 +356,7 @@ static void create_shared_memory_BAR(IVShmemState *s, int 
fd) {
     memory_region_init_ram_ptr(&s->ivshmem, OBJECT(s), "ivshmem.bar2",
                                s->ivshmem_size, ptr);
     vmstate_register_ram(&s->ivshmem, DEVICE(s));
-    memory_region_add_subregion(&s->bar, 0, &s->ivshmem);
+    memory_region_add_subregion(&s->bar, 0, &s->ivshmem, &error_abort);
 
     /* region for shared memory */
     pci_register_bar(PCI_DEVICE(s), 2, s->ivshmem_attr, &s->bar);
@@ -535,7 +535,7 @@ static void ivshmem_read(void *opaque, const uint8_t *buf, 
int size)
         IVSHMEM_DPRINTF("guest h/w addr = %p, size = %" PRIu64 "\n",
                         map_ptr, s->ivshmem_size);
 
-        memory_region_add_subregion(&s->bar, 0, &s->ivshmem);
+        memory_region_add_subregion(&s->bar, 0, &s->ivshmem, &error_abort);
 
         /* only store the fd if it is successfully mapped */
         s->shm_fd = incoming_fd;
diff --git a/hw/misc/macio/macio.c b/hw/misc/macio/macio.c
index e9037b0..21229ed 100644
--- a/hw/misc/macio/macio.c
+++ b/hw/misc/macio/macio.c
@@ -110,10 +110,10 @@ static void macio_escc_legacy_setup(MacIOState 
*macio_state)
         MemoryRegion *port = g_new(MemoryRegion, 1);
         memory_region_init_alias(port, NULL, "escc-legacy-port",
                                  macio_state->escc_mem, maps[i+1], 0x2);
-        memory_region_add_subregion(escc_legacy, maps[i], port);
+        memory_region_add_subregion(escc_legacy, maps[i], port, &error_abort);
     }
 
-    memory_region_add_subregion(bar, 0x12000, escc_legacy);
+    memory_region_add_subregion(bar, 0x12000, escc_legacy, &error_abort);
 }
 
 static void macio_bar_setup(MacIOState *macio_state)
@@ -121,7 +121,8 @@ static void macio_bar_setup(MacIOState *macio_state)
     MemoryRegion *bar = &macio_state->bar;
 
     if (macio_state->escc_mem) {
-        memory_region_add_subregion(bar, 0x13000, macio_state->escc_mem);
+        memory_region_add_subregion(bar, 0x13000, macio_state->escc_mem,
+                                    &error_abort);
         macio_escc_legacy_setup(macio_state);
     }
 }
@@ -141,7 +142,8 @@ static void macio_common_realize(PCIDevice *d, Error **errp)
     }
     sysbus_dev = SYS_BUS_DEVICE(&s->cuda);
     memory_region_add_subregion(&s->bar, 0x16000,
-                                sysbus_mmio_get_region(sysbus_dev, 0));
+                                sysbus_mmio_get_region(sysbus_dev, 0),
+                                &error_abort);
 
     macio_bar_setup(s);
     pci_register_bar(d, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->bar);
@@ -185,12 +187,14 @@ static void macio_oldworld_realize(PCIDevice *d, Error 
**errp)
     }
     sysbus_dev = SYS_BUS_DEVICE(&os->nvram);
     memory_region_add_subregion(&s->bar, 0x60000,
-                                sysbus_mmio_get_region(sysbus_dev, 0));
+                                sysbus_mmio_get_region(sysbus_dev, 0),
+                                &error_abort);
     pmac_format_nvram_partition(&os->nvram, os->nvram.size);
 
     if (s->pic_mem) {
         /* Heathrow PIC */
-        memory_region_add_subregion(&s->bar, 0x00000, s->pic_mem);
+        memory_region_add_subregion(&s->bar, 0x00000, s->pic_mem,
+                                    &error_abort);
     }
 
     /* IDE buses */
@@ -214,7 +218,7 @@ static void macio_init_ide(MacIOState *s, MACIOIDEState 
*ide, size_t ide_size,
     object_initialize(ide, ide_size, TYPE_MACIO_IDE);
     qdev_set_parent_bus(DEVICE(ide), sysbus_get_default());
     memory_region_add_subregion(&s->bar, 0x1f000 + ((index + 1) * 0x1000),
-                                &ide->mem);
+                                &ide->mem, &error_abort);
     name = g_strdup_printf("ide[%i]", index);
     object_property_add_child(OBJECT(s), name, OBJECT(ide), NULL);
     g_free(name);
@@ -292,7 +296,7 @@ static void macio_newworld_realize(PCIDevice *d, Error 
**errp)
 
     if (s->pic_mem) {
         /* OpenPIC */
-        memory_region_add_subregion(&s->bar, 0x40000, s->pic_mem);
+        memory_region_add_subregion(&s->bar, 0x40000, s->pic_mem, 
&error_abort);
     }
 
     /* IDE buses */
@@ -311,7 +315,7 @@ static void macio_newworld_realize(PCIDevice *d, Error 
**errp)
     timer_memory = g_new(MemoryRegion, 1);
     memory_region_init_io(timer_memory, OBJECT(s), &timer_ops, NULL, "timer",
                           0x1000);
-    memory_region_add_subregion(&s->bar, 0x15000, timer_memory);
+    memory_region_add_subregion(&s->bar, 0x15000, timer_memory, &error_abort);
 }
 
 static void macio_newworld_init(Object *obj)
@@ -339,7 +343,7 @@ static void macio_instance_init(Object *obj)
     object_property_add_child(obj, "cuda", OBJECT(&s->cuda), NULL);
 
     s->dbdma = DBDMA_init(&dbdma_mem);
-    memory_region_add_subregion(&s->bar, 0x08000, dbdma_mem);
+    memory_region_add_subregion(&s->bar, 0x08000, dbdma_mem, &error_abort);
 }
 
 static const VMStateDescription vmstate_macio_oldworld = {
diff --git a/hw/misc/omap_gpmc.c b/hw/misc/omap_gpmc.c
index 74fc91c..dcf6a96 100644
--- a/hw/misc/omap_gpmc.c
+++ b/hw/misc/omap_gpmc.c
@@ -419,9 +419,9 @@ static void omap_gpmc_cs_map(struct omap_gpmc_s *s, int cs)
      * starting from <i>base</i>.  */
     memory_region_init(&f->container, NULL, "omap-gpmc-file", size);
     memory_region_add_subregion(&f->container, 0,
-                                omap_gpmc_cs_memregion(s, cs));
+                                omap_gpmc_cs_memregion(s, cs), &error_abort);
     memory_region_add_subregion(get_system_memory(), base,
-                                &f->container);
+                                &f->container, &error_abort);
 }
 
 static void omap_gpmc_cs_unmap(struct omap_gpmc_s *s, int cs)
@@ -830,7 +830,8 @@ struct omap_gpmc_s *omap_gpmc_init(struct omap_mpu_state_s 
*mpu,
             g_malloc0(sizeof(struct omap_gpmc_s));
 
     memory_region_init_io(&s->iomem, NULL, &omap_gpmc_ops, s, "omap-gpmc", 
0x1000);
-    memory_region_add_subregion(get_system_memory(), base, &s->iomem);
+    memory_region_add_subregion(get_system_memory(), base, &s->iomem,
+                                &error_abort);
 
     s->irq = irq;
     s->drq = drq;
diff --git a/hw/misc/omap_l4.c b/hw/misc/omap_l4.c
index 245ceac..3f7b333 100644
--- a/hw/misc/omap_l4.c
+++ b/hw/misc/omap_l4.c
@@ -156,7 +156,8 @@ hwaddr omap_l4_attach(struct omap_target_agent_s *ta,
 
     base = ta->bus->base + ta->start[region].offset;
     if (mr) {
-        memory_region_add_subregion(ta->bus->address_space, base, mr);
+        memory_region_add_subregion(ta->bus->address_space, base, mr,
+                                    &error_abort);
     }
 
     return base;
diff --git a/hw/misc/omap_sdrc.c b/hw/misc/omap_sdrc.c
index 3de0c0e..97dfab6 100644
--- a/hw/misc/omap_sdrc.c
+++ b/hw/misc/omap_sdrc.c
@@ -163,7 +163,7 @@ struct omap_sdrc_s *omap_sdrc_init(MemoryRegion *sysmem,
     omap_sdrc_reset(s);
 
     memory_region_init_io(&s->iomem, NULL, &omap_sdrc_ops, s, "omap.sdrc", 
0x1000);
-    memory_region_add_subregion(sysmem, base, &s->iomem);
+    memory_region_add_subregion(sysmem, base, &s->iomem, &error_abort);
 
     return s;
 }
diff --git a/hw/misc/pc-testdev.c b/hw/misc/pc-testdev.c
index 18e94e0..0c80244 100644
--- a/hw/misc/pc-testdev.c
+++ b/hw/misc/pc-testdev.c
@@ -177,11 +177,12 @@ static void testdev_realizefn(DeviceState *d, Error 
**errp)
     memory_region_init_io(&dev->iomem, OBJECT(dev), &test_iomem_ops, dev,
                           "pc-testdev-iomem", IOMEM_LEN);
 
-    memory_region_add_subregion(io,  0xe0,       &dev->ioport);
-    memory_region_add_subregion(io,  0xe4,       &dev->flush);
-    memory_region_add_subregion(io,  0xe8,       &dev->ioport_byte);
-    memory_region_add_subregion(io,  0x2000,     &dev->irq);
-    memory_region_add_subregion(mem, 0xff000000, &dev->iomem);
+    memory_region_add_subregion(io,  0xe0,       &dev->ioport, &error_abort);
+    memory_region_add_subregion(io,  0xe4,       &dev->flush, &error_abort);
+    memory_region_add_subregion(io,  0xe8,       &dev->ioport_byte,
+                                &error_abort);
+    memory_region_add_subregion(io,  0x2000,     &dev->irq, &error_abort);
+    memory_region_add_subregion(mem, 0xff000000, &dev->iomem, &error_abort);
 }
 
 static void testdev_class_init(ObjectClass *klass, void *data)
diff --git a/hw/moxie/moxiesim.c b/hw/moxie/moxiesim.c
index 80bcc5b..ca36d7d 100644
--- a/hw/moxie/moxiesim.c
+++ b/hw/moxie/moxiesim.c
@@ -125,11 +125,11 @@ static void moxiesim_init(MachineState *machine)
     /* Allocate RAM. */
     memory_region_init_ram(ram, NULL, "moxiesim.ram", ram_size, &error_abort);
     vmstate_register_ram_global(ram);
-    memory_region_add_subregion(address_space_mem, ram_base, ram);
+    memory_region_add_subregion(address_space_mem, ram_base, ram, 
&error_abort);
 
     memory_region_init_ram(rom, NULL, "moxie.rom", 128*0x1000, &error_abort);
     vmstate_register_ram_global(rom);
-    memory_region_add_subregion(get_system_memory(), 0x1000, rom);
+    memory_region_add_subregion(get_system_memory(), 0x1000, rom, 
&error_abort);
 
     if (kernel_filename) {
         loader_params.ram_size = ram_size;
diff --git a/hw/net/fsl_etsec/etsec.c b/hw/net/fsl_etsec/etsec.c
index c57365f..477ad01 100644
--- a/hw/net/fsl_etsec/etsec.c
+++ b/hw/net/fsl_etsec/etsec.c
@@ -450,7 +450,8 @@ DeviceState *etsec_create(hwaddr         base,
     sysbus_connect_irq(SYS_BUS_DEVICE(dev), 2, err_irq);
 
     memory_region_add_subregion(mr, base,
-                                SYS_BUS_DEVICE(dev)->mmio[0].memory);
+                                SYS_BUS_DEVICE(dev)->mmio[0].memory,
+                                &error_abort);
 
     return dev;
 }
diff --git a/hw/net/mcf_fec.c b/hw/net/mcf_fec.c
index 0255612..a15f004 100644
--- a/hw/net/mcf_fec.c
+++ b/hw/net/mcf_fec.c
@@ -458,7 +458,7 @@ void mcf_fec_init(MemoryRegion *sysmem, NICInfo *nd,
     s->irq = irq;
 
     memory_region_init_io(&s->iomem, NULL, &mcf_fec_ops, s, "fec", 0x400);
-    memory_region_add_subregion(sysmem, base, &s->iomem);
+    memory_region_add_subregion(sysmem, base, &s->iomem, &error_abort);
 
     s->conf.macaddr = nd->macaddr;
     s->conf.peers.ncs[0] = nd->netdev;
diff --git a/hw/openrisc/openrisc_sim.c b/hw/openrisc/openrisc_sim.c
index 1da0657..8d1a5fb 100644
--- a/hw/openrisc/openrisc_sim.c
+++ b/hw/openrisc/openrisc_sim.c
@@ -53,9 +53,9 @@ static void openrisc_sim_net_init(MemoryRegion *address_space,
     s = SYS_BUS_DEVICE(dev);
     sysbus_connect_irq(s, 0, irq);
     memory_region_add_subregion(address_space, base,
-                                sysbus_mmio_get_region(s, 0));
+                                sysbus_mmio_get_region(s, 0), &error_abort);
     memory_region_add_subregion(address_space, descriptors,
-                                sysbus_mmio_get_region(s, 1));
+                                sysbus_mmio_get_region(s, 1), &error_abort);
 }
 
 static void cpu_openrisc_load_kernel(ram_addr_t ram_size,
@@ -116,7 +116,7 @@ static void openrisc_sim_init(MachineState *machine)
     ram = g_malloc(sizeof(*ram));
     memory_region_init_ram(ram, NULL, "openrisc.ram", ram_size, &error_abort);
     vmstate_register_ram_global(ram);
-    memory_region_add_subregion(get_system_memory(), 0, ram);
+    memory_region_add_subregion(get_system_memory(), 0, ram, &error_abort);
 
     cpu_openrisc_pic_init(cpu);
     cpu_openrisc_clock_init(cpu);
diff --git a/hw/pci-host/apb.c b/hw/pci-host/apb.c
index 599768e..c472cc6 100644
--- a/hw/pci-host/apb.c
+++ b/hw/pci-host/apb.c
@@ -684,7 +684,8 @@ PCIBus *pci_apb_init(hwaddr special_base,
     d = APB_DEVICE(dev);
 
     memory_region_init(&d->pci_mmio, OBJECT(s), "pci-mmio", 0x100000000ULL);
-    memory_region_add_subregion(get_system_memory(), mem_base, &d->pci_mmio);
+    memory_region_add_subregion(get_system_memory(), mem_base, &d->pci_mmio,
+                                &error_abort);
 
     phb = PCI_HOST_BRIDGE(dev);
     phb->bus = pci_register_bus(DEVICE(phb), "pci",
diff --git a/hw/pci-host/grackle.c b/hw/pci-host/grackle.c
index bfe707a..e1ff06b 100644
--- a/hw/pci-host/grackle.c
+++ b/hw/pci-host/grackle.c
@@ -80,7 +80,7 @@ PCIBus *pci_grackle_init(uint32_t base, qemu_irq *pic,
     memory_region_init_alias(&d->pci_hole, OBJECT(s), "pci-hole", &d->pci_mmio,
                              0x80000000ULL, 0x7e000000ULL);
     memory_region_add_subregion(address_space_mem, 0x80000000ULL,
-                                &d->pci_hole);
+                                &d->pci_hole, &error_abort);
 
     phb->bus = pci_register_bus(dev, NULL,
                                 pci_grackle_set_irq,
diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c
index ad55f99..899ca92 100644
--- a/hw/pci-host/piix.c
+++ b/hw/pci-host/piix.c
@@ -355,7 +355,8 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state,
     memory_region_init_alias(&f->low_smram, OBJECT(d), "smram-low",
                              f->ram_memory, 0xa0000, 0x20000);
     memory_region_set_enabled(&f->low_smram, true);
-    memory_region_add_subregion(&f->smram, 0xa0000, &f->low_smram);
+    memory_region_add_subregion(&f->smram, 0xa0000, &f->low_smram,
+                                &error_abort);
     object_property_add_const_link(qdev_get_machine(), "smram",
                                    OBJECT(&f->smram), &error_abort);
 
diff --git a/hw/pci-host/ppce500.c b/hw/pci-host/ppce500.c
index 613ba73..3de30c8 100644
--- a/hw/pci-host/ppce500.c
+++ b/hw/pci-host/ppce500.c
@@ -251,7 +251,7 @@ static void e500_update_pow(PPCE500PCIState *pci, int idx)
     name = g_strdup_printf("PCI Outbound Window %d", idx);
     memory_region_init_alias(mem, OBJECT(pci), name, &pci->busmem, tar,
                              size);
-    memory_region_add_subregion(address_space_mem, wbar, mem);
+    memory_region_add_subregion(address_space_mem, wbar, mem, &error_abort);
     g_free(name);
 
     pci_debug("%s: Added window of size=%#lx from CPU=%#lx to PCI=%#lx\n",
@@ -471,7 +471,7 @@ static int e500_pcihost_initfn(SysBusDevice *dev)
 
     /* Set up PCI view of memory */
     memory_region_init(&s->bm, OBJECT(s), "bm-e500", UINT64_MAX);
-    memory_region_add_subregion(&s->bm, 0x0, &s->busmem);
+    memory_region_add_subregion(&s->bm, 0x0, &s->busmem, &error_abort);
     address_space_init(&s->bm_as, &s->bm, "pci-bm");
     pci_setup_iommu(b, e500_pcihost_set_iommu, s);
 
@@ -484,9 +484,12 @@ static int e500_pcihost_initfn(SysBusDevice *dev)
                           "pci-conf-data", 4);
     memory_region_init_io(&s->iomem, OBJECT(s), &e500_pci_reg_ops, s,
                           "pci.reg", PCIE500_REG_SIZE);
-    memory_region_add_subregion(&s->container, PCIE500_CFGADDR, &h->conf_mem);
-    memory_region_add_subregion(&s->container, PCIE500_CFGDATA, &h->data_mem);
-    memory_region_add_subregion(&s->container, PCIE500_REG_BASE, &s->iomem);
+    memory_region_add_subregion(&s->container, PCIE500_CFGADDR, &h->conf_mem,
+                                &error_abort);
+    memory_region_add_subregion(&s->container, PCIE500_CFGDATA, &h->data_mem,
+                                &error_abort);
+    memory_region_add_subregion(&s->container, PCIE500_REG_BASE, &s->iomem,
+                                &error_abort);
     sysbus_init_mmio(dev, &s->container);
     pci_bus_set_route_irq_fn(b, e500_route_intx_pin_to_irq);
 
diff --git a/hw/pci-host/prep.c b/hw/pci-host/prep.c
index c63f45d..a5213bc 100644
--- a/hw/pci-host/prep.c
+++ b/hw/pci-host/prep.c
@@ -230,19 +230,21 @@ static void raven_pcihost_realizefn(DeviceState *d, Error 
**errp)
 
     memory_region_init_io(&h->conf_mem, OBJECT(h), &pci_host_conf_le_ops, s,
                           "pci-conf-idx", 4);
-    memory_region_add_subregion(&s->pci_io, 0xcf8, &h->conf_mem);
+    memory_region_add_subregion(&s->pci_io, 0xcf8, &h->conf_mem, &error_abort);
 
     memory_region_init_io(&h->data_mem, OBJECT(h), &pci_host_data_le_ops, s,
                           "pci-conf-data", 4);
-    memory_region_add_subregion(&s->pci_io, 0xcfc, &h->data_mem);
+    memory_region_add_subregion(&s->pci_io, 0xcfc, &h->data_mem, &error_abort);
 
     memory_region_init_io(&h->mmcfg, OBJECT(s), &raven_pci_io_ops, s,
                           "pciio", 0x00400000);
-    memory_region_add_subregion(address_space_mem, 0x80800000, &h->mmcfg);
+    memory_region_add_subregion(address_space_mem, 0x80800000, &h->mmcfg,
+                                &error_abort);
 
     memory_region_init_io(&s->pci_intack, OBJECT(s), &raven_intack_ops, s,
                           "pci-intack", 1);
-    memory_region_add_subregion(address_space_mem, 0xbffffff0, &s->pci_intack);
+    memory_region_add_subregion(address_space_mem, 0xbffffff0, &s->pci_intack,
+                                &error_abort);
 
     /* TODO Remove once realize propagates to child devices. */
     object_property_set_bool(OBJECT(&s->pci_dev), true, "realized", errp);
@@ -262,10 +264,12 @@ static void raven_pcihost_initfn(Object *obj)
     address_space_init(&s->pci_io_as, &s->pci_io, "raven-io");
 
     /* CPU address space */
-    memory_region_add_subregion(address_space_mem, 0x80000000, &s->pci_io);
+    memory_region_add_subregion(address_space_mem, 0x80000000, &s->pci_io,
+                                &error_abort);
     memory_region_add_subregion_overlap(address_space_mem, 0x80000000,
                                         &s->pci_io_non_contiguous, 1);
-    memory_region_add_subregion(address_space_mem, 0xc0000000, &s->pci_memory);
+    memory_region_add_subregion(address_space_mem, 0xc0000000, &s->pci_memory,
+                                &error_abort);
     pci_bus_new_inplace(&s->pci_bus, sizeof(s->pci_bus), DEVICE(obj), NULL,
                         &s->pci_memory, &s->pci_io, 0, TYPE_PCI_BUS);
 
@@ -276,8 +280,10 @@ static void raven_pcihost_initfn(Object *obj)
                              memory_region_size(&s->pci_memory));
     memory_region_init_alias(&s->bm_ram_alias, obj, "bm-system",
                              get_system_memory(), 0, 0x80000000);
-    memory_region_add_subregion(&s->bm, 0         , &s->bm_pci_memory_alias);
-    memory_region_add_subregion(&s->bm, 0x80000000, &s->bm_ram_alias);
+    memory_region_add_subregion(&s->bm, 0         , &s->bm_pci_memory_alias,
+                                &error_abort);
+    memory_region_add_subregion(&s->bm, 0x80000000, &s->bm_ram_alias,
+                                &error_abort);
     address_space_init(&s->bm_as, &s->bm, "raven-bm");
     pci_setup_iommu(&s->pci_bus, raven_pcihost_set_iommu, s);
 
@@ -305,7 +311,7 @@ static void raven_realize(PCIDevice *d, Error **errp)
                            &error_abort);
     memory_region_set_readonly(&s->bios, true);
     memory_region_add_subregion(get_system_memory(), (uint32_t)(-BIOS_SIZE),
-                                &s->bios);
+                                &s->bios, &error_abort);
     vmstate_register_ram_global(&s->bios);
     if (s->bios_name) {
         filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, s->bios_name);
diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
index bd74094..d9f8d56 100644
--- a/hw/pci-host/q35.c
+++ b/hw/pci-host/q35.c
@@ -494,11 +494,13 @@ static void mch_realize(PCIDevice *d, Error **errp)
     memory_region_init_alias(&mch->low_smram, OBJECT(mch), "smram-low",
                              mch->ram_memory, 0xa0000, 0x20000);
     memory_region_set_enabled(&mch->low_smram, true);
-    memory_region_add_subregion(&mch->smram, 0xa0000, &mch->low_smram);
+    memory_region_add_subregion(&mch->smram, 0xa0000, &mch->low_smram,
+                                &error_abort);
     memory_region_init_alias(&mch->high_smram, OBJECT(mch), "smram-high",
                              mch->ram_memory, 0xa0000, 0x20000);
     memory_region_set_enabled(&mch->high_smram, true);
-    memory_region_add_subregion(&mch->smram, 0xfeda0000, &mch->high_smram);
+    memory_region_add_subregion(&mch->smram, 0xfeda0000, &mch->high_smram,
+                                &error_abort);
 
     memory_region_init_io(&mch->tseg_blackhole, OBJECT(mch),
                           &tseg_blackhole_ops, NULL,
@@ -512,7 +514,7 @@ static void mch_realize(PCIDevice *d, Error **errp)
                              mch->ram_memory, mch->below_4g_mem_size, 0);
     memory_region_set_enabled(&mch->tseg_window, false);
     memory_region_add_subregion(&mch->smram, mch->below_4g_mem_size,
-                                &mch->tseg_window);
+                                &mch->tseg_window, &error_abort);
     object_property_add_const_link(qdev_get_machine(), "smram",
                                    OBJECT(&mch->smram), &error_abort);
 
diff --git a/hw/pci-host/uninorth.c b/hw/pci-host/uninorth.c
index f0144eb..8604565 100644
--- a/hw/pci-host/uninorth.c
+++ b/hw/pci-host/uninorth.c
@@ -235,7 +235,7 @@ PCIBus *pci_pmac_init(qemu_irq *pic,
     memory_region_init_alias(&d->pci_hole, OBJECT(d), "pci-hole", &d->pci_mmio,
                              0x80000000ULL, 0x10000000ULL);
     memory_region_add_subregion(address_space_mem, 0x80000000ULL,
-                                &d->pci_hole);
+                                &d->pci_hole, &error_abort);
 
     h->bus = pci_register_bus(dev, NULL,
                               pci_unin_set_irq, pci_unin_map_irq,
@@ -301,7 +301,7 @@ PCIBus *pci_pmac_u3_init(qemu_irq *pic,
     memory_region_init_alias(&d->pci_hole, OBJECT(d), "pci-hole", &d->pci_mmio,
                              0x80000000ULL, 0x70000000ULL);
     memory_region_add_subregion(address_space_mem, 0x80000000ULL,
-                                &d->pci_hole);
+                                &d->pci_hole, &error_abort);
 
     h->bus = pci_register_bus(dev, NULL,
                               pci_unin_set_irq, pci_unin_map_irq,
diff --git a/hw/pci/msix.c b/hw/pci/msix.c
index 7716bf3..10faae6 100644
--- a/hw/pci/msix.c
+++ b/hw/pci/msix.c
@@ -282,10 +282,12 @@ int msix_init(struct PCIDevice *dev, unsigned short 
nentries,
 
     memory_region_init_io(&dev->msix_table_mmio, OBJECT(dev), 
&msix_table_mmio_ops, dev,
                           "msix-table", table_size);
-    memory_region_add_subregion(table_bar, table_offset, 
&dev->msix_table_mmio);
+    memory_region_add_subregion(table_bar, table_offset, &dev->msix_table_mmio,
+                                &error_abort);
     memory_region_init_io(&dev->msix_pba_mmio, OBJECT(dev), 
&msix_pba_mmio_ops, dev,
                           "msix-pba", pba_size);
-    memory_region_add_subregion(pba_bar, pba_offset, &dev->msix_pba_mmio);
+    memory_region_add_subregion(pba_bar, pba_offset, &dev->msix_pba_mmio,
+                                &error_abort);
 
     return 0;
 }
diff --git a/hw/pci/pcie_host.c b/hw/pci/pcie_host.c
index d8afba8..432088e 100644
--- a/hw/pci/pcie_host.c
+++ b/hw/pci/pcie_host.c
@@ -114,7 +114,8 @@ void pcie_host_mmcfg_map(PCIExpressHost *e, hwaddr addr,
 {
     pcie_host_mmcfg_init(e, size);
     e->base_addr = addr;
-    memory_region_add_subregion(get_system_memory(), e->base_addr, &e->mmio);
+    memory_region_add_subregion(get_system_memory(), e->base_addr, &e->mmio,
+                                &error_abort);
 }
 
 void pcie_host_mmcfg_update(PCIExpressHost *e,
diff --git a/hw/pci/shpc.c b/hw/pci/shpc.c
index bfb4d31..fae1542 100644
--- a/hw/pci/shpc.c
+++ b/hw/pci/shpc.c
@@ -644,7 +644,7 @@ int shpc_init(PCIDevice *d, PCIBus *sec_bus, MemoryRegion 
*bar, unsigned offset)
     memory_region_init_io(&shpc->mmio, OBJECT(d), &shpc_mmio_ops,
                           d, "shpc-mmio", SHPC_SIZEOF(d));
     shpc_cap_update_dword(d);
-    memory_region_add_subregion(bar, offset, &shpc->mmio);
+    memory_region_add_subregion(bar, offset, &shpc->mmio, &error_abort);
 
     qbus_set_hotplug_handler(BUS(sec_bus), DEVICE(d), NULL);
 
diff --git a/hw/pcmcia/pxa2xx.c b/hw/pcmcia/pxa2xx.c
index a7e1877..3728c72 100644
--- a/hw/pcmcia/pxa2xx.c
+++ b/hw/pcmcia/pxa2xx.c
@@ -166,7 +166,7 @@ static void pxa2xx_pcmcia_initfn(Object *obj)
     memory_region_init_io(&s->iomem, NULL, &pxa2xx_pcmcia_io_ops, s,
                           "pxa2xx-pcmcia-io", 0x04000000);
     memory_region_add_subregion(&s->container_mem, 0x00000000,
-                                &s->iomem);
+                                &s->iomem, &error_abort);
 
     /* Then next 64 MB is reserved */
 
@@ -174,13 +174,13 @@ static void pxa2xx_pcmcia_initfn(Object *obj)
     memory_region_init_io(&s->attr_iomem, NULL, &pxa2xx_pcmcia_attr_ops, s,
                           "pxa2xx-pcmcia-attribute", 0x04000000);
     memory_region_add_subregion(&s->container_mem, 0x08000000,
-                                &s->attr_iomem);
+                                &s->attr_iomem, &error_abort);
 
     /* Socket Common Memory Space */
     memory_region_init_io(&s->common_iomem, NULL, &pxa2xx_pcmcia_common_ops, s,
                           "pxa2xx-pcmcia-common", 0x04000000);
     memory_region_add_subregion(&s->container_mem, 0x0c000000,
-                                &s->common_iomem);
+                                &s->common_iomem, &error_abort);
 
     s->slot.irq = qemu_allocate_irq(pxa2xx_pcmcia_set_irq, s, 0);
 
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index d300846..8aeebc1 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -767,7 +767,7 @@ static qemu_irq *ppce500_init_mpic(MachineState *machine, 
PPCE500Params *params,
 
     s = SYS_BUS_DEVICE(dev);
     memory_region_add_subregion(ccsr, MPC8544_MPIC_REGS_OFFSET,
-                                s->mmio[0].memory);
+                                s->mmio[0].memory, &error_abort);
 
     return mpic;
 }
@@ -863,7 +863,7 @@ void ppce500_init(MachineState *machine, PPCE500Params 
*params)
 
     /* Register Memory */
     memory_region_allocate_system_memory(ram, NULL, "mpc8544ds.ram", ram_size);
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, ram, &error_abort);
 
     dev = qdev_create(NULL, "e500-ccsr");
     object_property_add_child(qdev_get_machine(), "e500-ccsr",
@@ -872,7 +872,7 @@ void ppce500_init(MachineState *machine, PPCE500Params 
*params)
     ccsr = CCSR(dev);
     ccsr_addr_space = &ccsr->ccsr_space;
     memory_region_add_subregion(address_space_mem, params->ccsrbar_base,
-                                ccsr_addr_space);
+                                ccsr_addr_space, &error_abort);
 
     mpic = ppce500_init_mpic(machine, params, ccsr_addr_space, irqs);
 
@@ -894,7 +894,7 @@ void ppce500_init(MachineState *machine, PPCE500Params 
*params)
     qdev_init_nofail(dev);
     s = SYS_BUS_DEVICE(dev);
     memory_region_add_subregion(ccsr_addr_space, MPC8544_UTIL_OFFSET,
-                                sysbus_mmio_get_region(s, 0));
+                                sysbus_mmio_get_region(s, 0), &error_abort);
 
     /* PCI */
     dev = qdev_create(NULL, "e500-pcihost");
@@ -907,7 +907,7 @@ void ppce500_init(MachineState *machine, PPCE500Params 
*params)
     }
 
     memory_region_add_subregion(ccsr_addr_space, MPC8544_PCI_REGS_OFFSET,
-                                sysbus_mmio_get_region(s, 0));
+                                sysbus_mmio_get_region(s, 0), &error_abort);
 
     pci_bus = (PCIBus *)qdev_get_child_bus(dev, "pci.0");
     if (!pci_bus)
@@ -936,7 +936,7 @@ void ppce500_init(MachineState *machine, PPCE500Params 
*params)
         qdev_init_nofail(dev);
         sysbus_connect_irq(s, 0, mpic[MPC8XXX_GPIO_IRQ]);
         memory_region_add_subregion(ccsr_addr_space, MPC8XXX_GPIO_OFFSET,
-                                    sysbus_mmio_get_region(s, 0));
+                                    sysbus_mmio_get_region(s, 0), 
&error_abort);
 
         /* Power Off GPIO at Pin 0 */
         poweroff_irq = qemu_allocate_irq(ppce500_power_off, NULL, 0);
@@ -959,7 +959,7 @@ void ppce500_init(MachineState *machine, PPCE500Params 
*params)
 
         memory_region_add_subregion(address_space_mem,
                                     params->platform_bus_base,
-                                    sysbus_mmio_get_region(s, 0));
+                                    sysbus_mmio_get_region(s, 0), 
&error_abort);
     }
 
     /* Load kernel. */
diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index 0f3e341..a854926 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -203,7 +203,7 @@ static void ppc_core99_init(MachineState *machine)
 
     /* allocate RAM */
     memory_region_allocate_system_memory(ram, NULL, "ppc_core99.ram", 
ram_size);
-    memory_region_add_subregion(get_system_memory(), 0, ram);
+    memory_region_add_subregion(get_system_memory(), 0, ram, &error_abort);
 
     /* allocate and load BIOS */
     memory_region_init_ram(bios, NULL, "ppc_core99.bios", BIOS_SIZE,
@@ -214,7 +214,8 @@ static void ppc_core99_init(MachineState *machine)
         bios_name = PROM_FILENAME;
     filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
     memory_region_set_readonly(bios, true);
-    memory_region_add_subregion(get_system_memory(), PROM_ADDR, bios);
+    memory_region_add_subregion(get_system_memory(), PROM_ADDR, bios,
+                                &error_abort);
 
     /* Load OpenBIOS (ELF) */
     if (filename) {
@@ -296,14 +297,17 @@ static void ppc_core99_init(MachineState *machine)
     /* Register 8 MB of ISA IO space */
     memory_region_init_alias(isa, NULL, "isa_mmio",
                              get_system_io(), 0, 0x00800000);
-    memory_region_add_subregion(get_system_memory(), 0xf2000000, isa);
+    memory_region_add_subregion(get_system_memory(), 0xf2000000, isa,
+                                &error_abort);
 
     /* UniN init: XXX should be a real device */
     memory_region_init_io(unin_memory, NULL, &unin_ops, token, "unin", 0x1000);
-    memory_region_add_subregion(get_system_memory(), 0xf8000000, unin_memory);
+    memory_region_add_subregion(get_system_memory(), 0xf8000000, unin_memory,
+                                &error_abort);
 
     memory_region_init_io(unin2_memory, NULL, &unin_ops, token, "unin", 
0x1000);
-    memory_region_add_subregion(get_system_memory(), 0xf3000000, unin2_memory);
+    memory_region_add_subregion(get_system_memory(), 0xf3000000, unin2_memory,
+                                &error_abort);
 
     openpic_irqs = g_malloc0(smp_cpus * sizeof(qemu_irq *));
     openpic_irqs[0] =
diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index 99879dd..5118202 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -132,7 +132,7 @@ static void ppc_heathrow_init(MachineState *machine)
 
     memory_region_allocate_system_memory(ram, NULL, "ppc_heathrow.ram",
                                          ram_size);
-    memory_region_add_subregion(sysmem, 0, ram);
+    memory_region_add_subregion(sysmem, 0, ram, &error_abort);
 
     /* allocate and load BIOS */
     memory_region_init_ram(bios, NULL, "ppc_heathrow.bios", BIOS_SIZE,
@@ -143,7 +143,7 @@ static void ppc_heathrow_init(MachineState *machine)
         bios_name = PROM_FILENAME;
     filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
     memory_region_set_readonly(bios, true);
-    memory_region_add_subregion(sysmem, PROM_ADDR, bios);
+    memory_region_add_subregion(sysmem, PROM_ADDR, bios, &error_abort);
 
     /* Load OpenBIOS (ELF) */
     if (filename) {
@@ -232,7 +232,7 @@ static void ppc_heathrow_init(MachineState *machine)
     /* Register 2 MB of ISA IO space */
     memory_region_init_alias(isa, NULL, "isa_mmio",
                              get_system_io(), 0, 0x00200000);
-    memory_region_add_subregion(sysmem, 0xfe000000, isa);
+    memory_region_add_subregion(sysmem, 0xfe000000, isa, &error_abort);
 
     /* XXX: we register only 1 output pin for heathrow PIC */
     heathrow_irqs = g_malloc0(smp_cpus * sizeof(qemu_irq *));
diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
index ec6c4cb..80144e0 100644
--- a/hw/ppc/ppc405_boards.c
+++ b/hw/ppc/ppc405_boards.c
@@ -169,7 +169,7 @@ static void ref405ep_fpga_init(MemoryRegion *sysmem, 
uint32_t base)
     fpga = g_malloc0(sizeof(ref405ep_fpga_t));
     memory_region_init_io(fpga_memory, NULL, &ref405ep_fpga_ops, fpga,
                           "fpga", 0x00000100);
-    memory_region_add_subregion(sysmem, base, fpga_memory);
+    memory_region_add_subregion(sysmem, base, fpga_memory, &error_abort);
     qemu_register_reset(&ref405ep_fpga_reset, fpga);
 }
 
@@ -217,7 +217,7 @@ static void ref405ep_init(MachineState *machine)
     sram_size = 512 * 1024;
     memory_region_init_ram(sram, NULL, "ef405ep.sram", sram_size, 
&error_abort);
     vmstate_register_ram_global(sram);
-    memory_region_add_subregion(sysmem, 0xFFF00000, sram);
+    memory_region_add_subregion(sysmem, 0xFFF00000, sram, &error_abort);
     /* allocate and load BIOS */
 #ifdef DEBUG_BOARD_INIT
     printf("%s: register BIOS\n", __func__);
@@ -264,7 +264,8 @@ static void ref405ep_init(MachineState *machine)
                 exit(1);
             }
             bios_size = (bios_size + 0xfff) & ~0xfff;
-            memory_region_add_subregion(sysmem, (uint32_t)(-bios_size), bios);
+            memory_region_add_subregion(sysmem, (uint32_t)(-bios_size), bios,
+                                        &error_abort);
         } else if (!qtest_enabled() || kernel_filename != NULL) {
             error_report("Could not load PowerPC BIOS '%s'", bios_name);
             exit(1);
@@ -500,7 +501,7 @@ static void taihu_cpld_init(MemoryRegion *sysmem, uint32_t 
base)
 
     cpld = g_malloc0(sizeof(taihu_cpld_t));
     memory_region_init_io(cpld_memory, NULL, &taihu_cpld_ops, cpld, "cpld", 
0x100);
-    memory_region_add_subregion(sysmem, base, cpld_memory);
+    memory_region_add_subregion(sysmem, base, cpld_memory, &error_abort);
     qemu_register_reset(&taihu_cpld_reset, cpld);
 }
 
@@ -590,7 +591,8 @@ static void taihu_405ep_init(MachineState *machine)
                 exit(1);
             }
             bios_size = (bios_size + 0xfff) & ~0xfff;
-            memory_region_add_subregion(sysmem, (uint32_t)(-bios_size), bios);
+            memory_region_add_subregion(sysmem, (uint32_t)(-bios_size), bios,
+                                        &error_abort);
         } else if (!qtest_enabled()) {
             error_report("Could not load PowerPC BIOS '%s'", bios_name);
             exit(1);
diff --git a/hw/ppc/ppc405_uc.c b/hw/ppc/ppc405_uc.c
index c77434a..d33a2f6 100644
--- a/hw/ppc/ppc405_uc.c
+++ b/hw/ppc/ppc405_uc.c
@@ -393,7 +393,8 @@ static void ppc4xx_opba_init(hwaddr base)
     printf("%s: offset " TARGET_FMT_plx "\n", __func__, base);
 #endif
     memory_region_init_io(&opba->io, NULL, &opba_ops, opba, "opba", 0x002);
-    memory_region_add_subregion(get_system_memory(), base, &opba->io);
+    memory_region_add_subregion(get_system_memory(), base, &opba->io,
+                                &error_abort);
     qemu_register_reset(ppc4xx_opba_reset, opba);
 }
 
@@ -815,7 +816,8 @@ static void ppc405_gpio_init(hwaddr base)
     printf("%s: offset " TARGET_FMT_plx "\n", __func__, base);
 #endif
     memory_region_init_io(&gpio->io, NULL, &ppc405_gpio_ops, gpio, "pgio", 
0x038);
-    memory_region_add_subregion(get_system_memory(), base, &gpio->io);
+    memory_region_add_subregion(get_system_memory(), base, &gpio->io,
+                                &error_abort);
     qemu_register_reset(&ppc405_gpio_reset, gpio);
 }
 
@@ -863,7 +865,7 @@ static void ocm_update_mappings (ppc405_ocm_t *ocm,
             printf("OCM map ISA %08" PRIx32 "\n", isarc);
 #endif
             memory_region_add_subregion(get_system_memory(), isarc,
-                                        &ocm->isarc_ram);
+                                        &ocm->isarc_ram, &error_abort);
         }
     }
     if (ocm->dsarc != dsarc ||
@@ -887,7 +889,7 @@ static void ocm_update_mappings (ppc405_ocm_t *ocm,
                 printf("OCM map DSA %08" PRIx32 "\n", dsarc);
 #endif
                 memory_region_add_subregion(get_system_memory(), dsarc,
-                                            &ocm->dsarc_ram);
+                                            &ocm->dsarc_ram, &error_abort);
             }
         }
     }
@@ -1226,7 +1228,8 @@ static void ppc405_i2c_init(hwaddr base, qemu_irq irq)
     printf("%s: offset " TARGET_FMT_plx "\n", __func__, base);
 #endif
     memory_region_init_io(&i2c->iomem, NULL, &i2c_ops, i2c, "i2c", 0x011);
-    memory_region_add_subregion(get_system_memory(), base, &i2c->iomem);
+    memory_region_add_subregion(get_system_memory(), base, &i2c->iomem,
+                                &error_abort);
     qemu_register_reset(ppc4xx_i2c_reset, i2c);
 }
 
@@ -1505,7 +1508,8 @@ static void ppc4xx_gpt_init(hwaddr base, qemu_irq irqs[5])
     printf("%s: offset " TARGET_FMT_plx "\n", __func__, base);
 #endif
     memory_region_init_io(&gpt->iomem, NULL, &gpt_ops, gpt, "gpt", 0x0d4);
-    memory_region_add_subregion(get_system_memory(), base, &gpt->iomem);
+    memory_region_add_subregion(get_system_memory(), base, &gpt->iomem,
+                                &error_abort);
     qemu_register_reset(ppc4xx_gpt_reset, gpt);
 }
 
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index 778970a..bc37d8a 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -229,7 +229,8 @@ static void bamboo_init(MachineState *machine)
 
     memory_region_init_alias(isa, NULL, "isa_mmio",
                              get_system_io(), 0, PPC440EP_PCI_IOLEN);
-    memory_region_add_subregion(get_system_memory(), PPC440EP_PCI_IO, isa);
+    memory_region_add_subregion(get_system_memory(), PPC440EP_PCI_IO, isa,
+                                &error_abort);
 
     if (serial_hds[0] != NULL) {
         serial_mm_init(address_space_mem, 0xef600300, 0, pic[0],
diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
index 2f38ff7..efd88e0 100644
--- a/hw/ppc/ppc4xx_devs.c
+++ b/hw/ppc/ppc4xx_devs.c
@@ -433,10 +433,10 @@ static void sdram_set_bcr(ppc4xx_sdram_t *sdram,
         memory_region_init(&sdram->containers[n], NULL, "sdram-containers",
                            sdram_size(bcr));
         memory_region_add_subregion(&sdram->containers[n], 0,
-                                    &sdram->ram_memories[n]);
+                                    &sdram->ram_memories[n], &error_abort);
         memory_region_add_subregion(get_system_memory(),
                                     sdram_base(bcr),
-                                    &sdram->containers[n]);
+                                    &sdram->containers[n], &error_abort);
     }
 }
 
diff --git a/hw/ppc/ppc4xx_pci.c b/hw/ppc/ppc4xx_pci.c
index 0bb3cdb..ddd6845 100644
--- a/hw/ppc/ppc4xx_pci.c
+++ b/hw/ppc/ppc4xx_pci.c
@@ -335,9 +335,12 @@ static int ppc4xx_pcihost_initfn(SysBusDevice *dev)
                           "pci-conf-data", 4);
     memory_region_init_io(&s->iomem, OBJECT(s), &pci_reg_ops, s,
                           "pci.reg", PCI_REG_SIZE);
-    memory_region_add_subregion(&s->container, PCIC0_CFGADDR, &h->conf_mem);
-    memory_region_add_subregion(&s->container, PCIC0_CFGDATA, &h->data_mem);
-    memory_region_add_subregion(&s->container, PCI_REG_BASE, &s->iomem);
+    memory_region_add_subregion(&s->container, PCIC0_CFGADDR, &h->conf_mem,
+                                &error_abort);
+    memory_region_add_subregion(&s->container, PCIC0_CFGDATA, &h->data_mem,
+                                &error_abort);
+    memory_region_add_subregion(&s->container, PCI_REG_BASE, &s->iomem,
+                                &error_abort);
     sysbus_init_mmio(dev, &s->container);
     qemu_register_reset(ppc4xx_pci_reset, s);
 
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index 998ee2d..1e9758b 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -558,7 +558,7 @@ static void ppc_prep_init(MachineState *machine)
 
     /* allocate RAM */
     memory_region_allocate_system_memory(ram, NULL, "ppc_prep.ram", ram_size);
-    memory_region_add_subregion(sysmem, 0, ram);
+    memory_region_add_subregion(sysmem, 0, ram, &error_abort);
 
     if (linux_boot) {
         kernel_base = KERNEL_LOAD_ADDR;
@@ -676,7 +676,7 @@ static void ppc_prep_init(MachineState *machine)
     /* PowerPC control and status register group */
 #if 0
     memory_region_init_io(xcsr, NULL, &PPC_XCSR_ops, NULL, "ppc-xcsr", 0x1000);
-    memory_region_add_subregion(sysmem, 0xFEFF0000, xcsr);
+    memory_region_add_subregion(sysmem, 0xFEFF0000, xcsr, &error_abort);
 #endif
 
     if (usb_enabled()) {
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index f174e5a..de237fc 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1515,14 +1515,14 @@ static void ppc_spapr_init(MachineState *machine)
     spapr->ram_limit = ram_size;
     memory_region_allocate_system_memory(ram, NULL, "ppc_spapr.ram",
                                          spapr->ram_limit);
-    memory_region_add_subregion(sysmem, 0, ram);
+    memory_region_add_subregion(sysmem, 0, ram, &error_abort);
 
     if (rma_alloc_size && rma) {
         rma_region = g_new(MemoryRegion, 1);
         memory_region_init_ram_ptr(rma_region, NULL, "ppc_spapr.rma",
                                    rma_alloc_size, rma);
         vmstate_register_ram_global(rma_region);
-        memory_region_add_subregion(sysmem, 0, rma_region);
+        memory_region_add_subregion(sysmem, 0, rma_region, &error_abort);
     }
 
     filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, "spapr-rtas.bin");
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index d4a6150..03fb6c1 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -1183,7 +1183,7 @@ static void spapr_phb_realize(DeviceState *dev, Error 
**errp)
                              namebuf, &sphb->memspace,
                              SPAPR_PCI_MEM_WIN_BUS_OFFSET, sphb->mem_win_size);
     memory_region_add_subregion(get_system_memory(), sphb->mem_win_addr,
-                                &sphb->memwindow);
+                                &sphb->memwindow, &error_abort);
 
     /* Initialize IO regions */
     sprintf(namebuf, "%s.io", sphb->dtbusname);
@@ -1194,7 +1194,7 @@ static void spapr_phb_realize(DeviceState *dev, Error 
**errp)
     memory_region_init_alias(&sphb->iowindow, OBJECT(sphb), namebuf,
                              &sphb->iospace, 0, SPAPR_PCI_IO_WIN_SIZE);
     memory_region_add_subregion(get_system_memory(), sphb->io_win_addr,
-                                &sphb->iowindow);
+                                &sphb->iowindow, &error_abort);
 
     bus = pci_register_bus(dev, NULL,
                            pci_spapr_set_irq, pci_spapr_map_irq, sphb,
@@ -1237,7 +1237,7 @@ static void spapr_phb_realize(DeviceState *dev, Error 
**errp)
     memory_region_init_io(&sphb->msiwindow, NULL, &spapr_msi_ops, spapr,
                           "msi", msi_window_size);
     memory_region_add_subregion(&sphb->iommu_root, SPAPR_PCI_MSI_WINDOW,
-                                &sphb->msiwindow);
+                                &sphb->msiwindow, &error_abort);
 
     pci_setup_iommu(bus, spapr_pci_dma_iommu, sphb);
 
@@ -1293,7 +1293,7 @@ static void spapr_phb_finish_realize(sPAPRPHBState *sphb, 
Error **errp)
 
     /* Register default 32bit DMA window */
     memory_region_add_subregion(&sphb->iommu_root, 0,
-                                spapr_tce_get_iommu(tcet));
+                                spapr_tce_get_iommu(tcet), &error_abort);
 }
 
 static int spapr_phb_children_reset(Object *child, void *opaque)
diff --git a/hw/ppc/spapr_pci_vfio.c b/hw/ppc/spapr_pci_vfio.c
index 99a1be5..6b9e2af 100644
--- a/hw/ppc/spapr_pci_vfio.c
+++ b/hw/ppc/spapr_pci_vfio.c
@@ -68,7 +68,7 @@ static void spapr_phb_vfio_finish_realize(sPAPRPHBState 
*sphb, Error **errp)
 
     /* Register default 32bit DMA window */
     memory_region_add_subregion(&sphb->iommu_root, tcet->bus_offset,
-                                spapr_tce_get_iommu(tcet));
+                                spapr_tce_get_iommu(tcet), &error_abort);
 }
 
 static void spapr_phb_vfio_reset(DeviceState *qdev)
diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
index 439732f..1db90d5 100644
--- a/hw/ppc/virtex_ml507.c
+++ b/hw/ppc/virtex_ml507.c
@@ -223,7 +223,8 @@ static void virtex_init(MachineState *machine)
     qemu_register_reset(main_cpu_reset, cpu);
 
     memory_region_allocate_system_memory(phys_ram, NULL, "ram", ram_size);
-    memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
+    memory_region_add_subregion(address_space_mem, ram_base, phys_ram,
+                                &error_abort);
 
     dinfo = drive_get(IF_PFLASH, 0, 0);
     pflash_cfi01_register(PFLASH_BASEADDR, NULL, "virtex.flash", FLASH_SIZE,
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 3d20d6a..1ee08c3 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -162,7 +162,7 @@ static void ccw_init(MachineState *machine)
     /* allocate RAM for core */
     memory_region_init_ram(ram, NULL, "s390.ram", my_ram_size, &error_abort);
     vmstate_register_ram_global(ram);
-    memory_region_add_subregion(sysmem, 0, ram);
+    memory_region_add_subregion(sysmem, 0, ram, &error_abort);
 
     /* If the size of ram is not on a MEM_SECTION_SIZE boundary,
        calculate the pad size necessary to force this boundary. */
diff --git a/hw/s390x/s390-virtio.c b/hw/s390x/s390-virtio.c
index 1284e77..7d61bfb 100644
--- a/hw/s390x/s390-virtio.c
+++ b/hw/s390x/s390-virtio.c
@@ -295,7 +295,7 @@ static void s390_init(MachineState *machine)
     /* allocate RAM */
     memory_region_init_ram(ram, NULL, "s390.ram", my_ram_size, &error_abort);
     vmstate_register_ram_global(ram);
-    memory_region_add_subregion(sysmem, 0, ram);
+    memory_region_add_subregion(sysmem, 0, ram, &error_abort);
 
     /* clear virtio region */
     virtio_region_len = my_ram_size - ram_size;
diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
index b3a6c5e..db461b8 100644
--- a/hw/s390x/sclp.c
+++ b/hw/s390x/sclp.c
@@ -243,7 +243,8 @@ static void assign_storage(SCCB *sccb)
 
             memory_region_init_ram(standby_ram, NULL, id, this_subregion_size, 
&error_abort);
             vmstate_register_ram_global(standby_ram);
-            memory_region_add_subregion(sysmem, offset, standby_ram);
+            memory_region_add_subregion(sysmem, offset, standby_ram,
+                                        &error_abort);
         }
         /* The specified subregion is no longer in standby */
         mhd->standby_state_map[(assign_addr - mhd->padded_ram_size)
diff --git a/hw/sd/omap_mmc.c b/hw/sd/omap_mmc.c
index d072dec..63b6b7d 100644
--- a/hw/sd/omap_mmc.c
+++ b/hw/sd/omap_mmc.c
@@ -590,7 +590,7 @@ struct omap_mmc_s *omap_mmc_init(hwaddr base,
     omap_mmc_reset(s);
 
     memory_region_init_io(&s->iomem, NULL, &omap_mmc_ops, s, "omap.mmc", 
0x800);
-    memory_region_add_subregion(sysmem, base, &s->iomem);
+    memory_region_add_subregion(sysmem, base, &s->iomem, &error_abort);
 
     /* Instantiate the storage */
     s->card = sd_init(blk, false);
diff --git a/hw/sd/pxa2xx_mmci.c b/hw/sd/pxa2xx_mmci.c
index d1fe6d5..fcad7df 100644
--- a/hw/sd/pxa2xx_mmci.c
+++ b/hw/sd/pxa2xx_mmci.c
@@ -483,7 +483,7 @@ PXA2xxMMCIState *pxa2xx_mmci_init(MemoryRegion *sysmem,
 
     memory_region_init_io(&s->iomem, NULL, &pxa2xx_mmci_ops, s,
                           "pxa2xx-mmci", 0x00100000);
-    memory_region_add_subregion(sysmem, base, &s->iomem);
+    memory_region_add_subregion(sysmem, base, &s->iomem, &error_abort);
 
     /* Instantiate the actual storage */
     s->card = sd_init(blk, false);
diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
index 5e22ed7..96124fe 100644
--- a/hw/sh4/r2d.c
+++ b/hw/sh4/r2d.c
@@ -187,7 +187,7 @@ static qemu_irq *r2d_fpga_init(MemoryRegion *sysmem,
     s->irl = irl;
 
     memory_region_init_io(&s->iomem, NULL, &r2d_fpga_ops, s, "r2d-fpga", 0x40);
-    memory_region_add_subregion(sysmem, base, &s->iomem);
+    memory_region_add_subregion(sysmem, base, &s->iomem, &error_abort);
     return qemu_allocate_irqs(r2d_fpga_irq_set, s, NR_IRQS);
 }
 
@@ -257,7 +257,8 @@ static void r2d_init(MachineState *machine)
     /* Allocate memory space */
     memory_region_init_ram(sdram, NULL, "r2d.sdram", SDRAM_SIZE, &error_abort);
     vmstate_register_ram_global(sdram);
-    memory_region_add_subregion(address_space_mem, SDRAM_BASE, sdram);
+    memory_region_add_subregion(address_space_mem, SDRAM_BASE, sdram,
+                                &error_abort);
     /* Register peripherals */
     s = sh7750_init(cpu, address_space_mem);
     irq = r2d_fpga_init(address_space_mem, 0x04000000, sh7750_irl(s));
diff --git a/hw/sh4/sh7750.c b/hw/sh4/sh7750.c
index 5dda5de..e0a283f 100644
--- a/hw/sh4/sh7750.c
+++ b/hw/sh4/sh7750.c
@@ -735,31 +735,38 @@ SH7750State *sh7750_init(SuperHCPU *cpu, MemoryRegion 
*sysmem)
 
     memory_region_init_alias(&s->iomem_1f0, NULL, "memory-1f0",
                              &s->iomem, 0x1f000000, 0x1000);
-    memory_region_add_subregion(sysmem, 0x1f000000, &s->iomem_1f0);
+    memory_region_add_subregion(sysmem, 0x1f000000, &s->iomem_1f0,
+                                &error_abort);
 
     memory_region_init_alias(&s->iomem_ff0, NULL, "memory-ff0",
                              &s->iomem, 0x1f000000, 0x1000);
-    memory_region_add_subregion(sysmem, 0xff000000, &s->iomem_ff0);
+    memory_region_add_subregion(sysmem, 0xff000000, &s->iomem_ff0,
+                                &error_abort);
 
     memory_region_init_alias(&s->iomem_1f8, NULL, "memory-1f8",
                              &s->iomem, 0x1f800000, 0x1000);
-    memory_region_add_subregion(sysmem, 0x1f800000, &s->iomem_1f8);
+    memory_region_add_subregion(sysmem, 0x1f800000, &s->iomem_1f8,
+                                &error_abort);
 
     memory_region_init_alias(&s->iomem_ff8, NULL, "memory-ff8",
                              &s->iomem, 0x1f800000, 0x1000);
-    memory_region_add_subregion(sysmem, 0xff800000, &s->iomem_ff8);
+    memory_region_add_subregion(sysmem, 0xff800000, &s->iomem_ff8,
+                                &error_abort);
 
     memory_region_init_alias(&s->iomem_1fc, NULL, "memory-1fc",
                              &s->iomem, 0x1fc00000, 0x1000);
-    memory_region_add_subregion(sysmem, 0x1fc00000, &s->iomem_1fc);
+    memory_region_add_subregion(sysmem, 0x1fc00000, &s->iomem_1fc,
+                                &error_abort);
 
     memory_region_init_alias(&s->iomem_ffc, NULL, "memory-ffc",
                              &s->iomem, 0x1fc00000, 0x1000);
-    memory_region_add_subregion(sysmem, 0xffc00000, &s->iomem_ffc);
+    memory_region_add_subregion(sysmem, 0xffc00000, &s->iomem_ffc,
+                                &error_abort);
 
     memory_region_init_io(&s->mmct_iomem, NULL, &sh7750_mmct_ops, s,
                           "cache-and-tlb", 0x08000000);
-    memory_region_add_subregion(sysmem, 0xf0000000, &s->mmct_iomem);
+    memory_region_add_subregion(sysmem, 0xf0000000, &s->mmct_iomem,
+                                &error_abort);
 
     sh_intc_init(sysmem, &s->intc, NR_SOURCES,
                 _INTC_ARRAY(mask_registers),
diff --git a/hw/sh4/sh_pci.c b/hw/sh4/sh_pci.c
index a2f6d9e..68b989e 100644
--- a/hw/sh4/sh_pci.c
+++ b/hw/sh4/sh_pci.c
@@ -67,7 +67,8 @@ static void sh_pci_reg_write (void *p, hwaddr addr, uint64_t 
val,
             memory_region_del_subregion(get_system_memory(), &pcic->isa);
             pcic->iobr = val & 0xfffc0001;
             memory_region_add_subregion(get_system_memory(),
-                                        pcic->iobr & 0xfffc0000, &pcic->isa);
+                                        pcic->iobr & 0xfffc0000, &pcic->isa,
+                                        &error_abort);
         }
         break;
     case 0x220:
@@ -145,7 +146,8 @@ static int sh_pci_device_init(SysBusDevice *dev)
     sysbus_init_mmio(dev, &s->memconfig_p4);
     sysbus_init_mmio(dev, &s->memconfig_a7);
     s->iobr = 0xfe240000;
-    memory_region_add_subregion(get_system_memory(), s->iobr, &s->isa);
+    memory_region_add_subregion(get_system_memory(), s->iobr, &s->isa,
+                                &error_abort);
 
     s->dev = pci_create_simple(phb->bus, PCI_DEVFN(0, 0), "sh_pci_host");
     return 0;
diff --git a/hw/sh4/shix.c b/hw/sh4/shix.c
index f93f98e..b6f7af3 100644
--- a/hw/sh4/shix.c
+++ b/hw/sh4/shix.c
@@ -62,15 +62,15 @@ static void shix_init(MachineState *machine)
     memory_region_init_ram(rom, NULL, "shix.rom", 0x4000, &error_abort);
     vmstate_register_ram_global(rom);
     memory_region_set_readonly(rom, true);
-    memory_region_add_subregion(sysmem, 0x00000000, rom);
+    memory_region_add_subregion(sysmem, 0x00000000, rom, &error_abort);
     memory_region_init_ram(&sdram[0], NULL, "shix.sdram1", 0x01000000,
                            &error_abort);
     vmstate_register_ram_global(&sdram[0]);
-    memory_region_add_subregion(sysmem, 0x08000000, &sdram[0]);
+    memory_region_add_subregion(sysmem, 0x08000000, &sdram[0], &error_abort);
     memory_region_init_ram(&sdram[1], NULL, "shix.sdram2", 0x01000000,
                            &error_abort);
     vmstate_register_ram_global(&sdram[1]);
-    memory_region_add_subregion(sysmem, 0x0c000000, &sdram[1]);
+    memory_region_add_subregion(sysmem, 0x0c000000, &sdram[1], &error_abort);
 
     /* Load BIOS in 0 (and access it through P2, 0xA0000000) */
     if (bios_name == NULL)
diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
index 7f5dcd6..2103bd7 100644
--- a/hw/sparc/leon3.c
+++ b/hw/sparc/leon3.c
@@ -152,14 +152,16 @@ static void leon3_generic_hw_init(MachineState *machine)
     }
 
     memory_region_allocate_system_memory(ram, NULL, "leon3.ram", ram_size);
-    memory_region_add_subregion(address_space_mem, 0x40000000, ram);
+    memory_region_add_subregion(address_space_mem, 0x40000000, ram,
+                                &error_abort);
 
     /* Allocate BIOS */
     prom_size = 8 * 1024 * 1024; /* 8Mb */
     memory_region_init_ram(prom, NULL, "Leon3.bios", prom_size, &error_abort);
     vmstate_register_ram_global(prom);
     memory_region_set_readonly(prom, true);
-    memory_region_add_subregion(address_space_mem, 0x00000000, prom);
+    memory_region_add_subregion(address_space_mem, 0x00000000, prom,
+                                &error_abort);
 
     /* Load boot prom */
     if (bios_name == NULL) {
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index 30cfa0e..7252c83 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -874,7 +874,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
     nvram = m48t59_init(NULL, 0, 0, NVRAM_SIZE, 1968, 59);
     s = SYS_BUS_DEVICE(nvram);
     memory_region_add_subregion(get_system_io(), 0x2000,
-                                sysbus_mmio_get_region(s, 0));
+                                sysbus_mmio_get_region(s, 0), &error_abort);
  
     initrd_size = 0;
     initrd_addr = 0;
diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c
index 8ab683d..89bb5a6 100644
--- a/hw/timer/m48t59.c
+++ b/hw/timer/m48t59.c
@@ -698,7 +698,8 @@ Nvram *m48t59_init(qemu_irq IRQ, hwaddr mem_base,
         sysbus_connect_irq(s, 0, IRQ);
         if (io_base != 0) {
             memory_region_add_subregion(get_system_io(), io_base,
-                                        sysbus_mmio_get_region(s, 1));
+                                        sysbus_mmio_get_region(s, 1),
+                                        &error_abort);
         }
         if (mem_base != 0) {
             sysbus_mmio_map(s, 0, mem_base);
diff --git a/hw/timer/sh_timer.c b/hw/timer/sh_timer.c
index 07f0670..40ed41c 100644
--- a/hw/timer/sh_timer.c
+++ b/hw/timer/sh_timer.c
@@ -325,10 +325,12 @@ void tmu012_init(MemoryRegion *sysmem, hwaddr base,
 
     memory_region_init_alias(&s->iomem_p4, NULL, "timer-p4",
                              &s->iomem, 0, 0x1000);
-    memory_region_add_subregion(sysmem, P4ADDR(base), &s->iomem_p4);
+    memory_region_add_subregion(sysmem, P4ADDR(base), &s->iomem_p4,
+                                &error_abort);
 
     memory_region_init_alias(&s->iomem_a7, NULL, "timer-a7",
                              &s->iomem, 0, 0x1000);
-    memory_region_add_subregion(sysmem, A7ADDR(base), &s->iomem_a7);
+    memory_region_add_subregion(sysmem, A7ADDR(base), &s->iomem_a7,
+                                &error_abort);
     /* ??? Save/restore.  */
 }
diff --git a/hw/tpm/tpm_tis.c b/hw/tpm/tpm_tis.c
index 0806b5f..3312bce 100644
--- a/hw/tpm/tpm_tis.c
+++ b/hw/tpm/tpm_tis.c
@@ -1060,7 +1060,7 @@ static void tpm_tis_realizefn(DeviceState *dev, Error 
**errp)
     isa_init_irq(&s->busdev, &tis->irq, tis->irq_num);
 
     memory_region_add_subregion(isa_address_space(ISA_DEVICE(dev)),
-                                TPM_TIS_ADDR_BASE, &s->mmio);
+                                TPM_TIS_ADDR_BASE, &s->mmio, &error_abort);
 }
 
 static void tpm_tis_initfn(Object *obj)
diff --git a/hw/tricore/tricore_testboard.c b/hw/tricore/tricore_testboard.c
index a059a20..14290af 100644
--- a/hw/tricore/tricore_testboard.c
+++ b/hw/tricore/tricore_testboard.c
@@ -89,12 +89,12 @@ static void tricore_testboard_init(MachineState *machine, 
int board_id)
     memory_region_init_ram(pcp_text, NULL, "powerlink_pcp_text.ram", 32*1024, 
&error_abort);
     vmstate_register_ram_global(pcp_text);
 
-    memory_region_add_subregion(sysmem, 0x80000000, ext_cram);
-    memory_region_add_subregion(sysmem, 0xa1000000, ext_dram);
-    memory_region_add_subregion(sysmem, 0xd4000000, int_cram);
-    memory_region_add_subregion(sysmem, 0xd0000000, int_dram);
-    memory_region_add_subregion(sysmem, 0xf0050000, pcp_data);
-    memory_region_add_subregion(sysmem, 0xf0060000, pcp_text);
+    memory_region_add_subregion(sysmem, 0x80000000, ext_cram, &error_abort);
+    memory_region_add_subregion(sysmem, 0xa1000000, ext_dram, &error_abort);
+    memory_region_add_subregion(sysmem, 0xd4000000, int_cram, &error_abort);
+    memory_region_add_subregion(sysmem, 0xd0000000, int_dram, &error_abort);
+    memory_region_add_subregion(sysmem, 0xf0050000, pcp_data, &error_abort);
+    memory_region_add_subregion(sysmem, 0xf0060000, pcp_text, &error_abort);
 
     tricoretb_binfo.ram_size = machine->ram_size;
     tricoretb_binfo.kernel_filename = machine->kernel_filename;
diff --git a/hw/unicore32/puv3.c b/hw/unicore32/puv3.c
index 703e29d..23ffc39 100644
--- a/hw/unicore32/puv3.c
+++ b/hw/unicore32/puv3.c
@@ -66,7 +66,8 @@ static void puv3_soc_init(CPUUniCore32State *env)
 
     /* Keyboard (i8042), mouse disabled for nographic */
     i8042_mm_init(irqs[PUV3_IRQS_PS2_KBD], NULL, i8042, PUV3_REGS_OFFSET, 4);
-    memory_region_add_subregion(get_system_memory(), PUV3_PS2_BASE, i8042);
+    memory_region_add_subregion(get_system_memory(), PUV3_PS2_BASE, i8042,
+                                &error_abort);
 }
 
 static void puv3_board_init(CPUUniCore32State *env, ram_addr_t ram_size)
@@ -77,7 +78,8 @@ static void puv3_board_init(CPUUniCore32State *env, 
ram_addr_t ram_size)
     memory_region_init_ram(ram_memory, NULL, "puv3.ram", ram_size,
                            &error_abort);
     vmstate_register_ram_global(ram_memory);
-    memory_region_add_subregion(get_system_memory(), 0, ram_memory);
+    memory_region_add_subregion(get_system_memory(), 0, ram_memory,
+                                &error_abort);
 }
 
 static const GraphicHwOps no_ops;
diff --git a/hw/usb/hcd-ehci-sysbus.c b/hw/usb/hcd-ehci-sysbus.c
index cd1cc14..c487cec 100644
--- a/hw/usb/hcd-ehci-sysbus.c
+++ b/hw/usb/hcd-ehci-sysbus.c
@@ -194,7 +194,7 @@ static void fusbh200_ehci_init(Object *obj)
                           "fusbh200", 0x4c);
     memory_region_add_subregion(&s->mem,
                                 s->opregbase + s->portscbase + 4 * s->portnr,
-                                &f->mem_vendor);
+                                &f->mem_vendor, &error_abort);
 }
 
 static void fusbh200_ehci_class_init(ObjectClass *oc, void *data)
diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c
index d7cd40b..2f3f960 100644
--- a/hw/usb/hcd-ehci.c
+++ b/hw/usb/hcd-ehci.c
@@ -2522,10 +2522,12 @@ void usb_ehci_init(EHCIState *s, DeviceState *dev)
     memory_region_init_io(&s->mem_ports, OBJECT(dev), &ehci_mmio_port_ops, s,
                           "ports", 4 * s->portnr);
 
-    memory_region_add_subregion(&s->mem, s->capsbase, &s->mem_caps);
-    memory_region_add_subregion(&s->mem, s->opregbase, &s->mem_opreg);
+    memory_region_add_subregion(&s->mem, s->capsbase, &s->mem_caps,
+                                &error_abort);
+    memory_region_add_subregion(&s->mem, s->opregbase, &s->mem_opreg,
+                                &error_abort);
     memory_region_add_subregion(&s->mem, s->opregbase + s->portscbase,
-                                &s->mem_ports);
+                                &s->mem_ports, &error_abort);
 }
 
 /*
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
index 90a5fbf..efe29ca 100644
--- a/hw/usb/hcd-xhci.c
+++ b/hw/usb/hcd-xhci.c
@@ -3622,10 +3622,14 @@ static void usb_xhci_realize(struct PCIDevice *dev, 
Error **errp)
     memory_region_init_io(&xhci->mem_doorbell, OBJECT(xhci), 
&xhci_doorbell_ops, xhci,
                           "doorbell", LEN_DOORBELL);
 
-    memory_region_add_subregion(&xhci->mem, 0,            &xhci->mem_cap);
-    memory_region_add_subregion(&xhci->mem, OFF_OPER,     &xhci->mem_oper);
-    memory_region_add_subregion(&xhci->mem, OFF_RUNTIME,  &xhci->mem_runtime);
-    memory_region_add_subregion(&xhci->mem, OFF_DOORBELL, &xhci->mem_doorbell);
+    memory_region_add_subregion(&xhci->mem, 0,            &xhci->mem_cap,
+                                &error_abort);
+    memory_region_add_subregion(&xhci->mem, OFF_OPER,     &xhci->mem_oper,
+                                &error_abort);
+    memory_region_add_subregion(&xhci->mem, OFF_RUNTIME,  &xhci->mem_runtime,
+                                &error_abort);
+    memory_region_add_subregion(&xhci->mem, OFF_DOORBELL, &xhci->mem_doorbell,
+                                &error_abort);
 
     for (i = 0; i < xhci->numports; i++) {
         XHCIPort *port = &xhci->ports[i];
@@ -3633,7 +3637,8 @@ static void usb_xhci_realize(struct PCIDevice *dev, Error 
**errp)
         port->xhci = xhci;
         memory_region_init_io(&port->mem, OBJECT(xhci), &xhci_port_ops, port,
                               port->name, 0x10);
-        memory_region_add_subregion(&xhci->mem, offset, &port->mem);
+        memory_region_add_subregion(&xhci->mem, offset, &port->mem,
+                                    &error_abort);
     }
 
     pci_register_bar(dev, 0,
diff --git a/hw/vfio/common.c b/hw/vfio/common.c
index 85ee9b0..51aea6d 100644
--- a/hw/vfio/common.c
+++ b/hw/vfio/common.c
@@ -525,7 +525,7 @@ empty_region:
         memory_region_init(submem, obj, name, 0);
     }
 
-    memory_region_add_subregion(mem, offset, submem);
+    memory_region_add_subregion(mem, offset, submem, &error_abort);
 
     return ret;
 }
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index 2ed877f..f266567 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -1430,7 +1430,8 @@ static void vfio_vga_probe_ati_3c3_quirk(VFIOPCIDevice 
*vdev)
     memory_region_init_io(&quirk->mem, OBJECT(vdev), &vfio_ati_3c3_quirk, 
quirk,
                           "vfio-ati-3c3-quirk", 1);
     memory_region_add_subregion(&vdev->vga.region[QEMU_PCI_VGA_IO_HI].mem,
-                                3 /* offset 3 bytes from 0x3c0 */, 
&quirk->mem);
+                                3 /* offset 3 bytes from 0x3c0 */, &quirk->mem,
+                                &error_abort);
 
     QLIST_INSERT_HEAD(&vdev->vga.region[QEMU_PCI_VGA_IO_HI].quirks,
                       quirk, next);
@@ -1785,7 +1786,8 @@ static void vfio_vga_probe_nvidia_3d0_quirk(VFIOPCIDevice 
*vdev)
     memory_region_init_io(&quirk->mem, OBJECT(vdev), &vfio_nvidia_3d0_quirk,
                           quirk, "vfio-nvidia-3d0-quirk", 6);
     memory_region_add_subregion(&vdev->vga.region[QEMU_PCI_VGA_IO_HI].mem,
-                                quirk->data.base_offset, &quirk->mem);
+                                quirk->data.base_offset, &quirk->mem,
+                                &error_abort);
 
     QLIST_INSERT_HEAD(&vdev->vga.region[QEMU_PCI_VGA_IO_HI].quirks,
                       quirk, next);
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 7a89081..9c95c74 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1279,7 +1279,8 @@ static void virtio_pci_modern_region_map(VirtIOPCIProxy 
*proxy,
 {
     memory_region_add_subregion(&proxy->modern_bar,
                                 region->offset,
-                                &region->mr);
+                                &region->mr,
+                                &error_abort);
 
     cap->cfg_type = region->type;
     cap->bar = proxy->modern_mem_bar;
diff --git a/hw/xtensa/sim.c b/hw/xtensa/sim.c
index 328d209..3da7ca4 100644
--- a/hw/xtensa/sim.c
+++ b/hw/xtensa/sim.c
@@ -81,12 +81,13 @@ static void xtensa_sim_init(MachineState *machine)
     ram = g_malloc(sizeof(*ram));
     memory_region_init_ram(ram, NULL, "xtensa.sram", ram_size, &error_abort);
     vmstate_register_ram_global(ram);
-    memory_region_add_subregion(get_system_memory(), 0, ram);
+    memory_region_add_subregion(get_system_memory(), 0, ram, &error_abort);
 
     rom = g_malloc(sizeof(*rom));
     memory_region_init_ram(rom, NULL, "xtensa.rom", 0x1000, &error_abort);
     vmstate_register_ram_global(rom);
-    memory_region_add_subregion(get_system_memory(), 0xfe000000, rom);
+    memory_region_add_subregion(get_system_memory(), 0xfe000000, rom,
+                                &error_abort);
 
     if (kernel_filename) {
         uint64_t elf_entry;
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index ab4d0e4..40bfb81 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -115,7 +115,7 @@ static Lx60FpgaState *lx60_fpga_init(MemoryRegion 
*address_space,
 
     memory_region_init_io(&s->iomem, NULL, &lx60_fpga_ops, s,
             "lx60.fpga", 0x10000);
-    memory_region_add_subregion(address_space, base, &s->iomem);
+    memory_region_add_subregion(address_space, base, &s->iomem, &error_abort);
     lx60_fpga_reset(s);
     qemu_register_reset(lx60_fpga_reset, s);
     return s;
@@ -138,14 +138,14 @@ static void lx60_net_init(MemoryRegion *address_space,
     s = SYS_BUS_DEVICE(dev);
     sysbus_connect_irq(s, 0, irq);
     memory_region_add_subregion(address_space, base,
-            sysbus_mmio_get_region(s, 0));
+            sysbus_mmio_get_region(s, 0), &error_abort);
     memory_region_add_subregion(address_space, descriptors,
-            sysbus_mmio_get_region(s, 1));
+            sysbus_mmio_get_region(s, 1), &error_abort);
 
     ram = g_malloc(sizeof(*ram));
     memory_region_init_ram(ram, OBJECT(s), "open_eth.ram", 16384, 
&error_abort);
     vmstate_register_ram_global(ram);
-    memory_region_add_subregion(address_space, buffers, ram);
+    memory_region_add_subregion(address_space, buffers, ram, &error_abort);
 }
 
 static uint64_t translate_phys_addr(void *opaque, uint64_t addr)
@@ -225,12 +225,13 @@ static void lx_init(const LxBoardDesc *board, 
MachineState *machine)
     memory_region_init_ram(ram, NULL, "lx60.dram", machine->ram_size,
                            &error_abort);
     vmstate_register_ram_global(ram);
-    memory_region_add_subregion(system_memory, 0, ram);
+    memory_region_add_subregion(system_memory, 0, ram, &error_abort);
 
     system_io = g_malloc(sizeof(*system_io));
     memory_region_init_io(system_io, NULL, &lx60_io_ops, NULL, "lx60.io",
                           224 * 1024 * 1024);
-    memory_region_add_subregion(system_memory, 0xf0000000, system_io);
+    memory_region_add_subregion(system_memory, 0xf0000000, system_io,
+                                &error_abort);
     lx60_fpga_init(system_io, 0x0d020000);
     if (nd_table[0].used) {
         lx60_net_init(system_io, 0x0d030000, 0x0d030400, 0x0d800000,
@@ -277,7 +278,8 @@ static void lx_init(const LxBoardDesc *board, MachineState 
*machine)
         memory_region_init_ram(rom, NULL, "lx60.sram", board->sram_size,
                                &error_abort);
         vmstate_register_ram_global(rom);
-        memory_region_add_subregion(system_memory, 0xfe000000, rom);
+        memory_region_add_subregion(system_memory, 0xfe000000, rom,
+                                    &error_abort);
 
         if (kernel_cmdline) {
             bp_size += get_tag_size(strlen(kernel_cmdline) + 1);
@@ -377,7 +379,7 @@ static void lx_init(const LxBoardDesc *board, MachineState 
*machine)
                     board->flash_size - board->flash_boot_base < 0x02000000 ?
                     board->flash_size - board->flash_boot_base : 0x02000000);
             memory_region_add_subregion(system_memory, 0xfe000000,
-                    flash_io);
+                    flash_io, &error_abort);
         }
     }
 }
diff --git a/include/exec/memory.h b/include/exec/memory.h
index b9e6112..ce0320a 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -928,7 +928,8 @@ void memory_region_del_eventfd(MemoryRegion *mr,
  */
 void memory_region_add_subregion(MemoryRegion *mr,
                                  hwaddr offset,
-                                 MemoryRegion *subregion);
+                                 MemoryRegion *subregion,
+                                 Error **errp);
 /**
  * memory_region_add_subregion_overlap: Add a subregion to a container
  *                                      with overlap.
diff --git a/ioport.c b/ioport.c
index e39093e..8943e16 100644
--- a/ioport.c
+++ b/ioport.c
@@ -257,7 +257,7 @@ static void portio_list_add_1(PortioList *piolist,
         memory_region_set_flush_coalesced(&mrpio->mr);
     }
     memory_region_add_subregion(piolist->address_space,
-                                start + off_low, &mrpio->mr);
+                                start + off_low, &mrpio->mr, &error_abort);
     piolist->regions[piolist->nr] = &mrpio->mr;
     ++piolist->nr;
 }
diff --git a/memory.c b/memory.c
index 4558d85..360a5b8 100644
--- a/memory.c
+++ b/memory.c
@@ -1763,7 +1763,8 @@ done:
 
 static void memory_region_add_subregion_common(MemoryRegion *mr,
                                                hwaddr offset,
-                                               MemoryRegion *subregion)
+                                               MemoryRegion *subregion,
+                                               Error **errp)
 {
     assert(!subregion->container);
     subregion->container = mr;
@@ -1781,11 +1782,11 @@ static void 
memory_region_add_subregion_common(MemoryRegion *mr,
 
 void memory_region_add_subregion(MemoryRegion *mr,
                                  hwaddr offset,
-                                 MemoryRegion *subregion)
+                                 MemoryRegion *subregion, Error **errp)
 {
     subregion->may_overlap = false;
     subregion->priority = 0;
-    memory_region_add_subregion_common(mr, offset, subregion);
+    memory_region_add_subregion_common(mr, offset, subregion, errp);
 }
 
 void memory_region_add_subregion_overlap(MemoryRegion *mr,
@@ -1795,7 +1796,7 @@ void memory_region_add_subregion_overlap(MemoryRegion *mr,
 {
     subregion->may_overlap = true;
     subregion->priority = priority;
-    memory_region_add_subregion_common(mr, offset, subregion);
+    memory_region_add_subregion_common(mr, offset, subregion, &error_abort);
 }
 
 void memory_region_del_subregion(MemoryRegion *mr,
diff --git a/numa.c b/numa.c
index 3c80059..0ec9e58 100644
--- a/numa.c
+++ b/numa.c
@@ -469,7 +469,7 @@ void memory_region_allocate_system_memory(MemoryRegion *mr, 
Object *owner,
             exit(1);
         }
 
-        memory_region_add_subregion(mr, addr, seg);
+        memory_region_add_subregion(mr, addr, seg, &error_abort);
         vmstate_register_ram_global(seg);
         addr += size;
     }
-- 
1.8.3.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]