diff mbox

[RFC,v3,7/8] memory: extend memory_region_add_subregion() to support error reporting

Message ID 1436348808-223033-8-git-send-email-imammedo@redhat.com
State New
Headers show

Commit Message

Igor Mammedov July 8, 2015, 9:46 a.m. UTC
extends memory_region_add_subregion() by adding Error**
argument to allow t fail and return a error from it.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 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(-)

Comments

Michael S. Tsirkin July 8, 2015, 11:03 a.m. UTC | #1
On Wed, Jul 08, 2015 at 11:46:47AM +0200, Igor Mammedov wrote:
> extends memory_region_add_subregion() by adding Error**
> argument to allow t fail and return a error from it.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

_overlap needs same treatment too for completeness.
Can be a separate patch.

> ---
>  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
Peter Maydell July 8, 2015, 11:09 a.m. UTC | #2
On 8 July 2015 at 10:46, Igor Mammedov <imammedo@redhat.com> wrote:
> extends memory_region_add_subregion() by adding Error**
> argument to allow t fail and return a error from it.
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>  156 files changed, 619 insertions(+), 420 deletions(-)

This is a seriously invasive API change and I don't
really like it -- reconfiguring the memory region
hierarchy should not be an operation which can fail
(especially not just adding a subregion!)

-- PMM
Igor Mammedov July 8, 2015, 2:58 p.m. UTC | #3
On Wed, 8 Jul 2015 12:09:10 +0100
Peter Maydell <peter.maydell@linaro.org> wrote:

> On 8 July 2015 at 10:46, Igor Mammedov <imammedo@redhat.com> wrote:
> > extends memory_region_add_subregion() by adding Error**
> > argument to allow t fail and return a error from it.
> >
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >  156 files changed, 619 insertions(+), 420 deletions(-)
> 
> This is a seriously invasive API change and I don't
> really like it -- reconfiguring the memory region
> hierarchy should not be an operation which can fail
> (especially not just adding a subregion!)
> 
> -- PMM
> 

I'll drop this patch in favor of dedicated
memory_region_add_subregion_to_hva() API that can fail and return error.
Michael S. Tsirkin July 8, 2015, 5:30 p.m. UTC | #4
On Wed, Jul 08, 2015 at 04:58:37PM +0200, Igor Mammedov wrote:
> On Wed, 8 Jul 2015 12:09:10 +0100
> Peter Maydell <peter.maydell@linaro.org> wrote:
> 
> > On 8 July 2015 at 10:46, Igor Mammedov <imammedo@redhat.com> wrote:
> > > extends memory_region_add_subregion() by adding Error**
> > > argument to allow t fail and return a error from it.
> > >
> > > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > >  156 files changed, 619 insertions(+), 420 deletions(-)
> > 
> > This is a seriously invasive API change and I don't
> > really like it -- reconfiguring the memory region
> > hierarchy should not be an operation which can fail
> > (especially not just adding a subregion!)
> > 
> > -- PMM
> > 
> 
> I'll drop this patch in favor of dedicated
> memory_region_add_subregion_to_hva() API that can fail and return error.

Personally, I think it would be better to have an API that gets
a hva and a callback to invoke before releasing MR.

It's just a question of taste though.
Paolo Bonzini July 8, 2015, 5:42 p.m. UTC | #5
On 08/07/2015 16:58, Igor Mammedov wrote:
> I'll drop this patch in favor of dedicated
> memory_region_add_subregion_to_hva() API that can fail and return error.

Isn't the deletion of subregion that is done too early for your work?

You don't want the hot-unplug to complete until all the
address_space_unmaps have completed, if I understand correctly.

Paolo
Igor Mammedov July 8, 2015, 6:41 p.m. UTC | #6
On Wed, 8 Jul 2015 20:30:42 +0300
"Michael S. Tsirkin" <mst@redhat.com> wrote:

> On Wed, Jul 08, 2015 at 04:58:37PM +0200, Igor Mammedov wrote:
> > On Wed, 8 Jul 2015 12:09:10 +0100
> > Peter Maydell <peter.maydell@linaro.org> wrote:
> > 
> > > On 8 July 2015 at 10:46, Igor Mammedov <imammedo@redhat.com>
> > > wrote:
> > > > extends memory_region_add_subregion() by adding Error**
> > > > argument to allow t fail and return a error from it.
> > > >
> > > > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > > >  156 files changed, 619 insertions(+), 420 deletions(-)
> > > 
> > > This is a seriously invasive API change and I don't
> > > really like it -- reconfiguring the memory region
> > > hierarchy should not be an operation which can fail
> > > (especially not just adding a subregion!)
> > > 
> > > -- PMM
> > > 
> > 
> > I'll drop this patch in favor of dedicated
> > memory_region_add_subregion_to_hva() API that can fail and return
> > error.
> 
> Personally, I think it would be better to have an API that gets
> a hva and a callback to invoke before releasing MR.
> 
> It's just a question of taste though.
> 

that won't handle check at subregion_add time if region is available
and error out if it's.
Igor Mammedov July 8, 2015, 6:58 p.m. UTC | #7
On Wed, 8 Jul 2015 19:42:21 +0200
Paolo Bonzini <pbonzini@redhat.com> wrote:

> 
> 
> On 08/07/2015 16:58, Igor Mammedov wrote:
> > I'll drop this patch in favor of dedicated
> > memory_region_add_subregion_to_hva() API that can fail and return
> > error.
> 
> Isn't the deletion of subregion that is done too early for your work?
> 
> You don't want the hot-unplug to complete until all the
> address_space_unmaps have completed, if I understand correctly.
yep, region deletion + unmapping from HVA is delayed
until MemoryRegion.destructor is called see 8/8
   memory_region_add_subregion_common() {
       subregion->destructor = memory_region_destructor_hva_ram; 
   }
where default ram destructor is overridden by HVA specific one.

so though delete_subregion() deleted region from current view
that region is still hanging in HVA and old views until ALL
references to it are gone including backend.

When the last reference is gone MemoryRegion.destructor is called and
it unmaps region from HVA range and removes region from hva_mapped_head
list which allows memory_region_add_subregion_to_hva() to check if
range is free to use or error out if it still occupied by old region.

> 
> Paolo
Michael S. Tsirkin July 9, 2015, 6:58 a.m. UTC | #8
On Wed, Jul 08, 2015 at 08:41:43PM +0200, Igor Mammedov wrote:
> On Wed, 8 Jul 2015 20:30:42 +0300
> "Michael S. Tsirkin" <mst@redhat.com> wrote:
> 
> > On Wed, Jul 08, 2015 at 04:58:37PM +0200, Igor Mammedov wrote:
> > > On Wed, 8 Jul 2015 12:09:10 +0100
> > > Peter Maydell <peter.maydell@linaro.org> wrote:
> > > 
> > > > On 8 July 2015 at 10:46, Igor Mammedov <imammedo@redhat.com>
> > > > wrote:
> > > > > extends memory_region_add_subregion() by adding Error**
> > > > > argument to allow t fail and return a error from it.
> > > > >
> > > > > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > > > >  156 files changed, 619 insertions(+), 420 deletions(-)
> > > > 
> > > > This is a seriously invasive API change and I don't
> > > > really like it -- reconfiguring the memory region
> > > > hierarchy should not be an operation which can fail
> > > > (especially not just adding a subregion!)
> > > > 
> > > > -- PMM
> > > > 
> > > 
> > > I'll drop this patch in favor of dedicated
> > > memory_region_add_subregion_to_hva() API that can fail and return
> > > error.
> > 
> > Personally, I think it would be better to have an API that gets
> > a hva and a callback to invoke before releasing MR.
> > 
> > It's just a question of taste though.
> > 
> 
> that won't handle check at subregion_add time if region is available
> and error out if it's.

The point is that you request a hva range *before* adding regions.
Then pass it in.
diff mbox

Patch

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;
     }