All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v5 0/6] memory API improvements and bug fixes for memory
@ 2014-08-06  5:36 Hu Tao
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 1/6] exec: add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr Hu Tao
                   ` (5 more replies)
  0 siblings, 6 replies; 16+ messages in thread
From: Hu Tao @ 2014-08-06  5:36 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Crosthwaite, Michael S. Tsirkin, Yasuaki Isimatu,
	Paolo Bonzini, Yasunori Goto

This series includes two parts:

  1. part 1 includes patches 1-4, which improves error handling of
     memory_region_init_ram, memory_region_init_ram_ptr and
     memory_region_init_rom_device

  2. part 2 includes patches 5-6, each fixes a bug of memory backend.

changes to v4:

  - don't introduce _may_fail and _nofail versions of memory API
  - the patches order of bug fix and memory API change is exchanged, first
    comes the API change, then bug fix.

Hu Tao (6):
  exec: add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr
  memory: add parameter errp to memory_region_init_ram
  memory: add parameter errp to memory_region_init_ram_ptr
  memory: add parameter errp to memory_region_init_rom_device
  hostmem-ram: don't exit qemu if size of memory-backend-ram is way too
    big
  exec: improve error handling and reporting in file_ram_alloc() and
    gethugepagesize()

 backends/hostmem-ram.c                   |  2 +-
 exec.c                                   | 53 +++++++++++++++++++++-----------
 hw/alpha/typhoon.c                       |  3 +-
 hw/arm/armv7m.c                          |  7 +++--
 hw/arm/cubieboard.c                      |  2 +-
 hw/arm/digic_boards.c                    |  2 +-
 hw/arm/exynos4210.c                      |  9 +++---
 hw/arm/highbank.c                        |  5 +--
 hw/arm/integratorcp.c                    |  5 +--
 hw/arm/kzm.c                             |  4 +--
 hw/arm/mainstone.c                       |  3 +-
 hw/arm/musicpal.c                        |  6 ++--
 hw/arm/omap1.c                           |  6 ++--
 hw/arm/omap2.c                           |  6 ++--
 hw/arm/omap_sx1.c                        |  6 ++--
 hw/arm/palm.c                            |  3 +-
 hw/arm/pxa2xx.c                          | 11 ++++---
 hw/arm/realview.c                        |  9 ++++--
 hw/arm/spitz.c                           |  2 +-
 hw/arm/strongarm.c                       |  3 +-
 hw/arm/tosa.c                            |  2 +-
 hw/arm/versatilepb.c                     |  3 +-
 hw/arm/vexpress.c                        | 15 ++++++---
 hw/arm/virt.c                            |  3 +-
 hw/arm/xilinx_zynq.c                     |  6 ++--
 hw/block/onenand.c                       |  2 +-
 hw/block/pflash_cfi01.c                  |  2 +-
 hw/block/pflash_cfi02.c                  |  2 +-
 hw/core/loader.c                         |  2 +-
 hw/cris/axis_dev88.c                     |  6 ++--
 hw/display/cg3.c                         |  6 ++--
 hw/display/g364fb.c                      |  2 +-
 hw/display/qxl.c                         |  6 ++--
 hw/display/sm501.c                       |  2 +-
 hw/display/tc6393xb.c                    |  3 +-
 hw/display/tcx.c                         |  5 +--
 hw/display/vga.c                         |  3 +-
 hw/display/vmware_vga.c                  |  3 +-
 hw/i386/kvm/pci-assign.c                 |  6 ++--
 hw/i386/pc.c                             |  3 +-
 hw/i386/pc_sysfw.c                       |  5 +--
 hw/input/milkymist-softusb.c             |  4 +--
 hw/lm32/lm32_boards.c                    |  6 ++--
 hw/lm32/milkymist.c                      |  3 +-
 hw/m68k/an5206.c                         |  4 +--
 hw/m68k/dummy_m68k.c                     |  2 +-
 hw/m68k/mcf5208.c                        |  4 +--
 hw/microblaze/petalogix_ml605_mmu.c      |  5 +--
 hw/microblaze/petalogix_s3adsp1800_mmu.c |  6 ++--
 hw/mips/mips_fulong2e.c                  |  5 +--
 hw/mips/mips_jazz.c                      |  8 +++--
 hw/mips/mips_malta.c                     |  6 ++--
 hw/mips/mips_mipssim.c                   |  6 ++--
 hw/mips/mips_r4k.c                       |  5 +--
 hw/misc/ivshmem.c                        |  5 +--
 hw/misc/vfio.c                           |  3 +-
 hw/moxie/moxiesim.c                      |  4 +--
 hw/net/milkymist-minimac2.c              |  2 +-
 hw/openrisc/openrisc_sim.c               |  2 +-
 hw/pci-host/prep.c                       |  3 +-
 hw/pci/pci.c                             |  2 +-
 hw/ppc/mac_newworld.c                    |  3 +-
 hw/ppc/mac_oldworld.c                    |  3 +-
 hw/ppc/ppc405_boards.c                   |  8 +++--
 hw/ppc/ppc405_uc.c                       |  3 +-
 hw/ppc/spapr.c                           |  2 +-
 hw/s390x/s390-virtio-ccw.c               |  2 +-
 hw/s390x/s390-virtio.c                   |  2 +-
 hw/sh4/r2d.c                             |  2 +-
 hw/sh4/shix.c                            |  8 +++--
 hw/sparc/leon3.c                         |  4 +--
 hw/sparc/sun4m.c                         | 10 +++---
 hw/sparc64/sun4u.c                       |  6 ++--
 hw/unicore32/puv3.c                      |  3 +-
 hw/xtensa/sim.c                          |  4 +--
 hw/xtensa/xtfpga.c                       |  8 +++--
 include/exec/memory.h                    | 12 ++++++--
 include/exec/ram_addr.h                  |  4 +--
 memory.c                                 | 15 +++++----
 numa.c                                   |  4 +--
 xen-hvm.c                                |  3 +-
 81 files changed, 263 insertions(+), 162 deletions(-)

-- 
1.9.3

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH v5 1/6] exec: add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr
  2014-08-06  5:36 [Qemu-devel] [PATCH v5 0/6] memory API improvements and bug fixes for memory Hu Tao
@ 2014-08-06  5:36 ` Hu Tao
  2014-08-06 12:15   ` Peter Crosthwaite
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 2/6] memory: add parameter errp to memory_region_init_ram Hu Tao
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 16+ messages in thread
From: Hu Tao @ 2014-08-06  5:36 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Crosthwaite, Michael S. Tsirkin, Yasuaki Isimatu,
	Paolo Bonzini, Yasunori Goto

Add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr so that
we can handler errors.

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 exec.c                  | 32 +++++++++++++++++++++++---------
 include/exec/ram_addr.h |  4 ++--
 memory.c                |  6 +++---
 3 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/exec.c b/exec.c
index 765bd94..7e60a44 100644
--- a/exec.c
+++ b/exec.c
@@ -1224,7 +1224,7 @@ static int memory_try_enable_merging(void *addr, size_t len)
     return qemu_madvise(addr, len, QEMU_MADV_MERGEABLE);
 }
 
-static ram_addr_t ram_block_add(RAMBlock *new_block)
+static ram_addr_t ram_block_add(RAMBlock *new_block, Error **errp)
 {
     RAMBlock *block;
     ram_addr_t old_ram_size, new_ram_size;
@@ -1241,9 +1241,11 @@ static ram_addr_t ram_block_add(RAMBlock *new_block)
         } else {
             new_block->host = phys_mem_alloc(new_block->length);
             if (!new_block->host) {
-                fprintf(stderr, "Cannot set up guest memory '%s': %s\n",
-                        new_block->mr->name, strerror(errno));
-                exit(1);
+                error_setg_errno(errp, errno,
+                                 "cannot set up guest memory '%s'",
+                                 new_block->mr->name);
+                qemu_mutex_unlock_ramlist();
+                return -1;
             }
             memory_try_enable_merging(new_block->host, new_block->length);
         }
@@ -1294,6 +1296,7 @@ ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
                                     Error **errp)
 {
     RAMBlock *new_block;
+    ram_addr_t addr;
 
     if (xen_enabled()) {
         error_setg(errp, "-mem-path not supported with Xen");
@@ -1323,14 +1326,20 @@ ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
         return -1;
     }
 
-    return ram_block_add(new_block);
+    addr = ram_block_add(new_block, errp);
+    if (errp && *errp) {
+        g_free(new_block);
+        return -1;
+    }
+    return addr;
 }
 #endif
 
 ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
-                                   MemoryRegion *mr)
+                                   MemoryRegion *mr, Error **errp)
 {
     RAMBlock *new_block;
+    ram_addr_t addr;
 
     size = TARGET_PAGE_ALIGN(size);
     new_block = g_malloc0(sizeof(*new_block));
@@ -1341,12 +1350,17 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
     if (host) {
         new_block->flags |= RAM_PREALLOC;
     }
-    return ram_block_add(new_block);
+    addr = ram_block_add(new_block, errp);
+    if (errp && *errp) {
+        g_free(new_block);
+        return -1;
+    }
+    return addr;
 }
 
-ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr)
+ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr, Error **errp)
 {
-    return qemu_ram_alloc_from_ptr(size, NULL, mr);
+    return qemu_ram_alloc_from_ptr(size, NULL, mr, errp);
 }
 
 void qemu_ram_free_from_ptr(ram_addr_t addr)
diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h
index 6593be1..cf1d4c7 100644
--- a/include/exec/ram_addr.h
+++ b/include/exec/ram_addr.h
@@ -26,8 +26,8 @@ ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
                                     bool share, const char *mem_path,
                                     Error **errp);
 ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
-                                   MemoryRegion *mr);
-ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr);
+                                   MemoryRegion *mr, Error **errp);
+ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr, Error **errp);
 int qemu_get_ram_fd(ram_addr_t addr);
 void *qemu_get_ram_block_host_ptr(ram_addr_t addr);
 void *qemu_get_ram_ptr(ram_addr_t addr);
diff --git a/memory.c b/memory.c
index 64d7176..59d9935 100644
--- a/memory.c
+++ b/memory.c
@@ -1169,7 +1169,7 @@ void memory_region_init_ram(MemoryRegion *mr,
     mr->ram = true;
     mr->terminates = true;
     mr->destructor = memory_region_destructor_ram;
-    mr->ram_addr = qemu_ram_alloc(size, mr);
+    mr->ram_addr = qemu_ram_alloc(size, mr, &error_abort);
 }
 
 #ifdef __linux__
@@ -1199,7 +1199,7 @@ void memory_region_init_ram_ptr(MemoryRegion *mr,
     mr->ram = true;
     mr->terminates = true;
     mr->destructor = memory_region_destructor_ram_from_ptr;
-    mr->ram_addr = qemu_ram_alloc_from_ptr(size, ptr, mr);
+    mr->ram_addr = qemu_ram_alloc_from_ptr(size, ptr, mr, &error_abort);
 }
 
 void memory_region_init_alias(MemoryRegion *mr,
@@ -1229,7 +1229,7 @@ void memory_region_init_rom_device(MemoryRegion *mr,
     mr->terminates = true;
     mr->rom_device = true;
     mr->destructor = memory_region_destructor_rom_device;
-    mr->ram_addr = qemu_ram_alloc(size, mr);
+    mr->ram_addr = qemu_ram_alloc(size, mr, &error_abort);
 }
 
 void memory_region_init_iommu(MemoryRegion *mr,
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH v5 2/6] memory: add parameter errp to memory_region_init_ram
  2014-08-06  5:36 [Qemu-devel] [PATCH v5 0/6] memory API improvements and bug fixes for memory Hu Tao
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 1/6] exec: add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr Hu Tao
@ 2014-08-06  5:36 ` Hu Tao
  2014-08-06 12:27   ` Peter Crosthwaite
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 3/6] memory: add parameter errp to memory_region_init_ram_ptr Hu Tao
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 16+ messages in thread
From: Hu Tao @ 2014-08-06  5:36 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Crosthwaite, Michael S. Tsirkin, Yasuaki Isimatu,
	Paolo Bonzini, Yasunori Goto

Add parameter errp to memory_region_init_ram and update all call sites
to pass in &error_abort.

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 backends/hostmem-ram.c                   |  2 +-
 hw/alpha/typhoon.c                       |  3 ++-
 hw/arm/armv7m.c                          |  7 ++++---
 hw/arm/cubieboard.c                      |  2 +-
 hw/arm/digic_boards.c                    |  2 +-
 hw/arm/exynos4210.c                      |  9 +++++----
 hw/arm/highbank.c                        |  5 +++--
 hw/arm/integratorcp.c                    |  5 +++--
 hw/arm/kzm.c                             |  4 ++--
 hw/arm/mainstone.c                       |  3 ++-
 hw/arm/musicpal.c                        |  6 ++++--
 hw/arm/omap1.c                           |  6 ++++--
 hw/arm/omap2.c                           |  6 ++++--
 hw/arm/omap_sx1.c                        |  6 ++++--
 hw/arm/palm.c                            |  3 ++-
 hw/arm/pxa2xx.c                          | 11 +++++++----
 hw/arm/realview.c                        |  9 ++++++---
 hw/arm/spitz.c                           |  2 +-
 hw/arm/strongarm.c                       |  3 ++-
 hw/arm/tosa.c                            |  2 +-
 hw/arm/versatilepb.c                     |  3 ++-
 hw/arm/vexpress.c                        | 15 ++++++++++-----
 hw/arm/virt.c                            |  3 ++-
 hw/arm/xilinx_zynq.c                     |  6 ++++--
 hw/block/onenand.c                       |  2 +-
 hw/core/loader.c                         |  2 +-
 hw/cris/axis_dev88.c                     |  6 ++++--
 hw/display/cg3.c                         |  6 ++++--
 hw/display/qxl.c                         |  6 +++---
 hw/display/sm501.c                       |  2 +-
 hw/display/tc6393xb.c                    |  3 ++-
 hw/display/tcx.c                         |  5 +++--
 hw/display/vga.c                         |  3 ++-
 hw/display/vmware_vga.c                  |  3 ++-
 hw/i386/kvm/pci-assign.c                 |  3 ++-
 hw/i386/pc.c                             |  3 ++-
 hw/i386/pc_sysfw.c                       |  5 +++--
 hw/input/milkymist-softusb.c             |  4 ++--
 hw/lm32/lm32_boards.c                    |  6 ++++--
 hw/lm32/milkymist.c                      |  3 ++-
 hw/m68k/an5206.c                         |  4 ++--
 hw/m68k/dummy_m68k.c                     |  2 +-
 hw/m68k/mcf5208.c                        |  4 ++--
 hw/microblaze/petalogix_ml605_mmu.c      |  5 +++--
 hw/microblaze/petalogix_s3adsp1800_mmu.c |  6 ++++--
 hw/mips/mips_fulong2e.c                  |  5 +++--
 hw/mips/mips_jazz.c                      |  8 +++++---
 hw/mips/mips_malta.c                     |  6 ++++--
 hw/mips/mips_mipssim.c                   |  6 ++++--
 hw/mips/mips_r4k.c                       |  5 +++--
 hw/moxie/moxiesim.c                      |  4 ++--
 hw/net/milkymist-minimac2.c              |  2 +-
 hw/openrisc/openrisc_sim.c               |  2 +-
 hw/pci-host/prep.c                       |  3 ++-
 hw/pci/pci.c                             |  2 +-
 hw/ppc/mac_newworld.c                    |  3 ++-
 hw/ppc/mac_oldworld.c                    |  3 ++-
 hw/ppc/ppc405_boards.c                   |  8 +++++---
 hw/ppc/ppc405_uc.c                       |  3 ++-
 hw/s390x/s390-virtio-ccw.c               |  2 +-
 hw/s390x/s390-virtio.c                   |  2 +-
 hw/sh4/r2d.c                             |  2 +-
 hw/sh4/shix.c                            |  8 +++++---
 hw/sparc/leon3.c                         |  4 ++--
 hw/sparc/sun4m.c                         | 10 ++++++----
 hw/sparc64/sun4u.c                       |  6 ++++--
 hw/unicore32/puv3.c                      |  3 ++-
 hw/xtensa/sim.c                          |  4 ++--
 hw/xtensa/xtfpga.c                       |  8 +++++---
 include/exec/memory.h                    |  4 +++-
 memory.c                                 |  5 +++--
 numa.c                                   |  4 ++--
 xen-hvm.c                                |  3 ++-
 73 files changed, 203 insertions(+), 128 deletions(-)

diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c
index d9a8290..e55d066 100644
--- a/backends/hostmem-ram.c
+++ b/backends/hostmem-ram.c
@@ -27,7 +27,7 @@ ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
 
     path = object_get_canonical_path_component(OBJECT(backend));
     memory_region_init_ram(&backend->mr, OBJECT(backend), path,
-                           backend->size);
+                           backend->size, &error_abort);
     g_free(path);
 }
 
diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c
index 67a1070..058b723 100644
--- a/hw/alpha/typhoon.c
+++ b/hw/alpha/typhoon.c
@@ -843,7 +843,8 @@ PCIBus *typhoon_init(ram_addr_t ram_size, ISABus **isa_bus,
 
     /* Main memory region, 0x00.0000.0000.  Real hardware supports 32GB,
        but the address space hole reserved at this point is 8TB.  */
-    memory_region_init_ram(&s->ram_region, OBJECT(s), "ram", ram_size);
+    memory_region_init_ram(&s->ram_region, OBJECT(s), "ram", ram_size,
+                           &error_abort);
     vmstate_register_ram_global(&s->ram_region);
     memory_region_add_subregion(addr_space, 0, &s->ram_region);
 
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
index 397e8df..32b4be6 100644
--- a/hw/arm/armv7m.c
+++ b/hw/arm/armv7m.c
@@ -210,11 +210,12 @@ qemu_irq *armv7m_init(MemoryRegion *address_space_mem,
 #endif
 
     /* Flash programming is done via the SCU, so pretend it is ROM.  */
-    memory_region_init_ram(flash, NULL, "armv7m.flash", flash_size);
+    memory_region_init_ram(flash, NULL, "armv7m.flash", flash_size,
+                           &error_abort);
     vmstate_register_ram_global(flash);
     memory_region_set_readonly(flash, true);
     memory_region_add_subregion(address_space_mem, 0, flash);
-    memory_region_init_ram(sram, NULL, "armv7m.sram", sram_size);
+    memory_region_init_ram(sram, NULL, "armv7m.sram", sram_size, &error_abort);
     vmstate_register_ram_global(sram);
     memory_region_add_subregion(address_space_mem, 0x20000000, sram);
     armv7m_bitband_init();
@@ -255,7 +256,7 @@ qemu_irq *armv7m_init(MemoryRegion *address_space_mem,
     /* Hack to map an additional page of ram at the top of the address
        space.  This stops qemu complaining about executing code outside RAM
        when returning from an exception.  */
-    memory_region_init_ram(hack, NULL, "armv7m.hack", 0x1000);
+    memory_region_init_ram(hack, NULL, "armv7m.hack", 0x1000, &error_abort);
     vmstate_register_ram_global(hack);
     memory_region_add_subregion(address_space_mem, 0xfffff000, hack);
 
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
index e2260e3..d1e53be 100644
--- a/hw/arm/cubieboard.c
+++ b/hw/arm/cubieboard.c
@@ -64,7 +64,7 @@ static void cubieboard_init(MachineState *machine)
     }
 
     memory_region_init_ram(&s->sdram, NULL, "cubieboard.ram",
-                           machine->ram_size);
+                           machine->ram_size, &error_abort);
     vmstate_register_ram_global(&s->sdram);
     memory_region_add_subregion(get_system_memory(), AW_A10_SDRAM_BASE,
                                 &s->sdram);
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
index d1424ee..2a4b872 100644
--- a/hw/arm/digic_boards.c
+++ b/hw/arm/digic_boards.c
@@ -51,7 +51,7 @@ typedef struct DigicBoard {
 
 static void digic4_board_setup_ram(DigicBoardState *s, hwaddr ram_size)
 {
-    memory_region_init_ram(&s->ram, NULL, "ram", ram_size);
+    memory_region_init_ram(&s->ram, NULL, "ram", ram_size, &error_abort);
     memory_region_add_subregion(get_system_memory(), 0, &s->ram);
     vmstate_register_ram_global(&s->ram);
 }
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
index 6426d16..582794c 100644
--- a/hw/arm/exynos4210.c
+++ b/hw/arm/exynos4210.c
@@ -248,7 +248,7 @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem,
 
     /* Internal ROM */
     memory_region_init_ram(&s->irom_mem, NULL, "exynos4210.irom",
-                           EXYNOS4210_IROM_SIZE);
+                           EXYNOS4210_IROM_SIZE, &error_abort);
     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,
@@ -264,7 +264,7 @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem,
 
     /* Internal RAM */
     memory_region_init_ram(&s->iram_mem, NULL, "exynos4210.iram",
-                           EXYNOS4210_IRAM_SIZE);
+                           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);
@@ -273,13 +273,14 @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem,
     mem_size = ram_size;
     if (mem_size > EXYNOS4210_DRAM_MAX_SIZE) {
         memory_region_init_ram(&s->dram1_mem, NULL, "exynos4210.dram1",
-                mem_size - EXYNOS4210_DRAM_MAX_SIZE);
+                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);
         mem_size = EXYNOS4210_DRAM_MAX_SIZE;
     }
-    memory_region_init_ram(&s->dram0_mem, NULL, "exynos4210.dram0", mem_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);
diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
index 8340434..fa61e5f 100644
--- a/hw/arm/highbank.c
+++ b/hw/arm/highbank.c
@@ -255,12 +255,13 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
 
     sysmem = get_system_memory();
     dram = g_new(MemoryRegion, 1);
-    memory_region_init_ram(dram, NULL, "highbank.dram", ram_size);
+    memory_region_init_ram(dram, NULL, "highbank.dram", ram_size, &error_abort);
     /* SDRAM at address zero.  */
     memory_region_add_subregion(sysmem, 0, dram);
 
     sysram = g_new(MemoryRegion, 1);
-    memory_region_init_ram(sysram, NULL, "highbank.sysram", 0x8000);
+    memory_region_init_ram(sysram, NULL, "highbank.sysram", 0x8000,
+                           &error_abort);
     memory_region_add_subregion(sysmem, 0xfff88000, sysram);
     if (bios_name != NULL) {
         sysboot_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index 0e476c3..266ec18 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -264,7 +264,8 @@ static int integratorcm_init(SysBusDevice *dev)
     s->cm_init = 0x00000112;
     s->cm_refcnt_offset = muldiv64(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), 24,
                                    1000);
-    memory_region_init_ram(&s->flash, OBJECT(s), "integrator.flash", 0x100000);
+    memory_region_init_ram(&s->flash, OBJECT(s), "integrator.flash", 0x100000,
+                           &error_abort);
     vmstate_register_ram_global(&s->flash);
 
     memory_region_init_io(&s->iomem, OBJECT(s), &integratorcm_ops, s,
@@ -485,7 +486,7 @@ static void integratorcp_init(MachineState *machine)
         exit(1);
     }
 
-    memory_region_init_ram(ram, NULL, "integrator.ram", ram_size);
+    memory_region_init_ram(ram, NULL, "integrator.ram", ram_size, &error_abort);
     vmstate_register_ram_global(ram);
     /* ??? On a real system the first 1Mb is mapped as SSRAM or boot flash.  */
     /* ??? RAM should repeat to fill physical memory space.  */
diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
index 0555d12..94ceab6 100644
--- a/hw/arm/kzm.c
+++ b/hw/arm/kzm.c
@@ -97,14 +97,14 @@ static void kzm_init(MachineState *machine)
 
     /* On a real system, the first 16k is a `secure boot rom' */
 
-    memory_region_init_ram(ram, NULL, "kzm.ram", ram_size);
+    memory_region_init_ram(ram, NULL, "kzm.ram", ram_size, &error_abort);
     vmstate_register_ram_global(ram);
     memory_region_add_subregion(address_space_mem, KZM_RAMADDRESS, ram);
 
     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_init_ram(sram, NULL, "kzm.sram", 0x4000);
+    memory_region_init_ram(sram, NULL, "kzm.sram", 0x4000, &error_abort);
     memory_region_add_subregion(address_space_mem, 0x1FFFC000, sram);
 
     dev = sysbus_create_varargs("imx_avic", 0x68000000,
diff --git a/hw/arm/mainstone.c b/hw/arm/mainstone.c
index 44f1873..2f1d618 100644
--- a/hw/arm/mainstone.c
+++ b/hw/arm/mainstone.c
@@ -123,7 +123,8 @@ static void mainstone_common_init(MemoryRegion *address_space_mem,
 
     /* Setup CPU & memory */
     mpu = pxa270_init(address_space_mem, mainstone_binfo.ram_size, cpu_model);
-    memory_region_init_ram(rom, NULL, "mainstone.rom", MAINSTONE_ROM);
+    memory_region_init_ram(rom, NULL, "mainstone.rom", MAINSTONE_ROM,
+                           &error_abort);
     vmstate_register_ram_global(rom);
     memory_region_set_readonly(rom, true);
     memory_region_add_subregion(address_space_mem, 0, rom);
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index 6a134f2..c541455 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -1601,11 +1601,13 @@ static void musicpal_init(MachineState *machine)
     }
 
     /* For now we use a fixed - the original - RAM size */
-    memory_region_init_ram(ram, NULL, "musicpal.ram", MP_RAM_DEFAULT_SIZE);
+    memory_region_init_ram(ram, NULL, "musicpal.ram", MP_RAM_DEFAULT_SIZE,
+                           &error_abort);
     vmstate_register_ram_global(ram);
     memory_region_add_subregion(address_space_mem, 0, ram);
 
-    memory_region_init_ram(sram, NULL, "musicpal.sram", MP_SRAM_SIZE);
+    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);
 
diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
index e7cc5d7..306cf17 100644
--- a/hw/arm/omap1.c
+++ b/hw/arm/omap1.c
@@ -3854,10 +3854,12 @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *system_memory,
     omap_clk_init(s);
 
     /* Memory-mapped stuff */
-    memory_region_init_ram(&s->emiff_ram, NULL, "omap1.dram", s->sdram_size);
+    memory_region_init_ram(&s->emiff_ram, NULL, "omap1.dram", s->sdram_size,
+                           &error_abort);
     vmstate_register_ram_global(&s->emiff_ram);
     memory_region_add_subregion(system_memory, OMAP_EMIFF_BASE, &s->emiff_ram);
-    memory_region_init_ram(&s->imif_ram, NULL, "omap1.sram", s->sram_size);
+    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);
 
diff --git a/hw/arm/omap2.c b/hw/arm/omap2.c
index dc53a7a..d6e19ae 100644
--- a/hw/arm/omap2.c
+++ b/hw/arm/omap2.c
@@ -2266,10 +2266,12 @@ struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sysmem,
     omap_clk_init(s);
 
     /* Memory-mapped stuff */
-    memory_region_init_ram(&s->sdram, NULL, "omap2.dram", s->sdram_size);
+    memory_region_init_ram(&s->sdram, NULL, "omap2.dram", s->sdram_size,
+                           &error_abort);
     vmstate_register_ram_global(&s->sdram);
     memory_region_add_subregion(sysmem, OMAP2_Q2_BASE, &s->sdram);
-    memory_region_init_ram(&s->sram, NULL, "omap2.sram", s->sram_size);
+    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);
 
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
index b4f6da6..320b39c 100644
--- a/hw/arm/omap_sx1.c
+++ b/hw/arm/omap_sx1.c
@@ -122,7 +122,8 @@ static void sx1_init(MachineState *machine, const int version)
                            machine->cpu_model);
 
     /* External Flash (EMIFS) */
-    memory_region_init_ram(flash, NULL, "omap_sx1.flash0-0", flash_size);
+    memory_region_init_ram(flash, NULL, "omap_sx1.flash0-0", flash_size,
+                           &error_abort);
     vmstate_register_ram_global(flash);
     memory_region_set_readonly(flash, true);
     memory_region_add_subregion(address_space, OMAP_CS0_BASE, flash);
@@ -164,7 +165,8 @@ static void sx1_init(MachineState *machine, const int version)
 
     if ((version == 1) &&
             (dinfo = drive_get(IF_PFLASH, 0, fl_idx)) != NULL) {
-        memory_region_init_ram(flash_1, NULL, "omap_sx1.flash1-0", flash1_size);
+        memory_region_init_ram(flash_1, NULL, "omap_sx1.flash1-0", flash1_size,
+                               &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);
diff --git a/hw/arm/palm.c b/hw/arm/palm.c
index e61995f..7f1cfb8 100644
--- a/hw/arm/palm.c
+++ b/hw/arm/palm.c
@@ -212,7 +212,8 @@ static void palmte_init(MachineState *machine)
     mpu = omap310_mpu_init(address_space_mem, sdram_size, cpu_model);
 
     /* External Flash (EMIFS) */
-    memory_region_init_ram(flash, NULL, "palmte.flash", flash_size);
+    memory_region_init_ram(flash, NULL, "palmte.flash", flash_size,
+                           &error_abort);
     vmstate_register_ram_global(flash);
     memory_region_set_readonly(flash, true);
     memory_region_add_subregion(address_space_mem, OMAP_CS0_BASE, flash);
diff --git a/hw/arm/pxa2xx.c b/hw/arm/pxa2xx.c
index 557e0f1..7d306fb 100644
--- a/hw/arm/pxa2xx.c
+++ b/hw/arm/pxa2xx.c
@@ -2055,10 +2055,12 @@ PXA2xxState *pxa270_init(MemoryRegion *address_space,
     s->reset = qemu_allocate_irq(pxa2xx_reset, s, 0);
 
     /* SDRAM & Internal Memory Storage */
-    memory_region_init_ram(&s->sdram, NULL, "pxa270.sdram", sdram_size);
+    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_init_ram(&s->internal, NULL, "pxa270.internal", 0x40000);
+    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);
@@ -2186,11 +2188,12 @@ PXA2xxState *pxa255_init(MemoryRegion *address_space, unsigned int sdram_size)
     s->reset = qemu_allocate_irq(pxa2xx_reset, s, 0);
 
     /* SDRAM & Internal Memory Storage */
-    memory_region_init_ram(&s->sdram, NULL, "pxa255.sdram", 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_init_ram(&s->internal, NULL, "pxa255.internal",
-                           PXA2XX_INTERNAL_SIZE);
+                           PXA2XX_INTERNAL_SIZE, &error_abort);
     vmstate_register_ram_global(&s->internal);
     memory_region_add_subregion(address_space, PXA2XX_INTERNAL_BASE,
                                 &s->internal);
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index 64b9251..8bd3ff6 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -137,12 +137,14 @@ static void realview_init(MachineState *machine,
         /* Core tile RAM.  */
         low_ram_size = ram_size - 0x20000000;
         ram_size = 0x20000000;
-        memory_region_init_ram(ram_lo, NULL, "realview.lowmem", low_ram_size);
+        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_init_ram(ram_hi, NULL, "realview.highmem", ram_size);
+    memory_region_init_ram(ram_hi, NULL, "realview.highmem", ram_size,
+                           &error_abort);
     vmstate_register_ram_global(ram_hi);
     low_ram_size = ram_size;
     if (low_ram_size > 0x10000000)
@@ -337,7 +339,8 @@ static void realview_init(MachineState *machine,
        startup code.  I guess this works on real hardware because the
        BootROM happens to be in ROM/flash or in memory that isn't clobbered
        until after Linux boots the secondary CPUs.  */
-    memory_region_init_ram(ram_hack, NULL, "realview.hack", 0x1000);
+    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);
 
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
index 03cc6ce..9260896 100644
--- a/hw/arm/spitz.c
+++ b/hw/arm/spitz.c
@@ -912,7 +912,7 @@ static void spitz_common_init(MachineState *machine,
 
     sl_flash_register(mpu, (model == spitz) ? FLASH_128M : FLASH_1024M);
 
-    memory_region_init_ram(rom, NULL, "spitz.rom", SPITZ_ROM);
+    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);
diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c
index 9e2a0d4..3206345 100644
--- a/hw/arm/strongarm.c
+++ b/hw/arm/strongarm.c
@@ -1604,7 +1604,8 @@ StrongARMState *sa1110_init(MemoryRegion *sysmem,
         exit(1);
     }
 
-    memory_region_init_ram(&s->sdram, NULL, "strongarm.sdram", sdram_size);
+    memory_region_init_ram(&s->sdram, NULL, "strongarm.sdram", sdram_size,
+                           &error_abort);
     vmstate_register_ram_global(&s->sdram);
     memory_region_add_subregion(sysmem, SA_SDCS0, &s->sdram);
 
diff --git a/hw/arm/tosa.c b/hw/arm/tosa.c
index abc0f2a..6c574bc 100644
--- a/hw/arm/tosa.c
+++ b/hw/arm/tosa.c
@@ -228,7 +228,7 @@ static void tosa_init(MachineState *machine)
 
     mpu = pxa255_init(address_space_mem, tosa_binfo.ram_size);
 
-    memory_region_init_ram(rom, NULL, "tosa.rom", TOSA_ROM);
+    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);
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index dea5fc7..7696be1 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -198,7 +198,8 @@ static void versatile_init(MachineState *machine, int board_id)
         fprintf(stderr, "Unable to find CPU definition\n");
         exit(1);
     }
-    memory_region_init_ram(ram, NULL, "versatile.ram", machine->ram_size);
+    memory_region_init_ram(ram, NULL, "versatile.ram", machine->ram_size,
+                           &error_abort);
     vmstate_register_ram_global(ram);
     /* ??? RAM should repeat to fill physical memory space.  */
     /* SDRAM at address zero.  */
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index a88732c..aed218f 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -252,7 +252,8 @@ static void a9_daughterboard_init(const VEDBoardInfo *daughterboard,
         exit(1);
     }
 
-    memory_region_init_ram(ram, NULL, "vexpress.highmem", ram_size);
+    memory_region_init_ram(ram, NULL, "vexpress.highmem", ram_size,
+                           &error_abort);
     vmstate_register_ram_global(ram);
     low_ram_size = ram_size;
     if (low_ram_size > 0x4000000) {
@@ -346,7 +347,8 @@ static void a15_daughterboard_init(const VEDBoardInfo *daughterboard,
         }
     }
 
-    memory_region_init_ram(ram, NULL, "vexpress.highmem", ram_size);
+    memory_region_init_ram(ram, NULL, "vexpress.highmem", ram_size,
+                           &error_abort);
     vmstate_register_ram_global(ram);
     /* RAM is from 0x80000000 upwards; there is no low-memory alias for it. */
     memory_region_add_subregion(sysmem, 0x80000000, ram);
@@ -364,7 +366,8 @@ static void a15_daughterboard_init(const VEDBoardInfo *daughterboard,
     /* 0x2b060000: SP805 watchdog: not modelled */
     /* 0x2b0a0000: PL341 dynamic memory controller: not modelled */
     /* 0x2e000000: system SRAM */
-    memory_region_init_ram(sram, NULL, "vexpress.a15sram", 0x10000);
+    memory_region_init_ram(sram, NULL, "vexpress.a15sram", 0x10000,
+                           &error_abort);
     vmstate_register_ram_global(sram);
     memory_region_add_subregion(sysmem, 0x2e000000, sram);
 
@@ -634,12 +637,14 @@ static void vexpress_common_init(VEDBoardInfo *daughterboard,
     }
 
     sram_size = 0x2000000;
-    memory_region_init_ram(sram, NULL, "vexpress.sram", sram_size);
+    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);
 
     vram_size = 0x800000;
-    memory_region_init_ram(vram, NULL, "vexpress.vram", vram_size);
+    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);
 
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index ba94298..fa435e7 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -489,7 +489,8 @@ static void machvirt_init(MachineState *machine)
     fdt_add_cpu_nodes(vbi);
     fdt_add_psci_node(vbi);
 
-    memory_region_init_ram(ram, NULL, "mach-virt.ram", machine->ram_size);
+    memory_region_init_ram(ram, NULL, "mach-virt.ram", machine->ram_size,
+                           &error_abort);
     vmstate_register_ram_global(ram);
     memory_region_add_subregion(sysmem, vbi->memmap[VIRT_MEM].base, ram);
 
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index ba5aa82..ad85c7a 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -149,12 +149,14 @@ static void zynq_init(MachineState *machine)
     }
 
     /* DDR remapped to address zero.  */
-    memory_region_init_ram(ext_ram, NULL, "zynq.ext_ram", ram_size);
+    memory_region_init_ram(ext_ram, NULL, "zynq.ext_ram", ram_size,
+                           &error_abort);
     vmstate_register_ram_global(ext_ram);
     memory_region_add_subregion(address_space_mem, 0, ext_ram);
 
     /* 256K of on-chip memory */
-    memory_region_init_ram(ocm_ram, NULL, "zynq.ocm_ram", 256 << 10);
+    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);
 
diff --git a/hw/block/onenand.c b/hw/block/onenand.c
index 5388122..e48e585 100644
--- a/hw/block/onenand.c
+++ b/hw/block/onenand.c
@@ -789,7 +789,7 @@ static int onenand_initfn(SysBusDevice *sbd)
     s->otp = memset(g_malloc((64 + 2) << PAGE_SHIFT),
                     0xff, (64 + 2) << PAGE_SHIFT);
     memory_region_init_ram(&s->ram, OBJECT(s), "onenand.ram",
-                           0xc000 << s->shift);
+                           0xc000 << s->shift, &error_abort);
     vmstate_register_ram_global(&s->ram);
     ram = memory_region_get_ram_ptr(&s->ram);
     s->boot[0] = ram + (0x0000 << s->shift);
diff --git a/hw/core/loader.c b/hw/core/loader.c
index 2bf6b8f..7eb8277 100644
--- a/hw/core/loader.c
+++ b/hw/core/loader.c
@@ -632,7 +632,7 @@ static void *rom_set_mr(Rom *rom, Object *owner, const char *name)
     void *data;
 
     rom->mr = g_malloc(sizeof(*rom->mr));
-    memory_region_init_ram(rom->mr, owner, name, rom->datasize);
+    memory_region_init_ram(rom->mr, owner, name, rom->datasize, &error_abort);
     memory_region_set_readonly(rom->mr, true);
     vmstate_register_ram_global(rom->mr);
 
diff --git a/hw/cris/axis_dev88.c b/hw/cris/axis_dev88.c
index 1849338..2fb3aa8 100644
--- a/hw/cris/axis_dev88.c
+++ b/hw/cris/axis_dev88.c
@@ -270,13 +270,15 @@ void axisdev88_init(MachineState *machine)
     env = &cpu->env;
 
     /* allocate RAM */
-    memory_region_init_ram(phys_ram, NULL, "axisdev88.ram", ram_size);
+    memory_region_init_ram(phys_ram, NULL, "axisdev88.ram", ram_size,
+                           &error_abort);
     vmstate_register_ram_global(phys_ram);
     memory_region_add_subregion(address_space_mem, 0x40000000, phys_ram);
 
     /* 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);
+    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);
 
diff --git a/hw/display/cg3.c b/hw/display/cg3.c
index 65ef7a7..1e6ff2b 100644
--- a/hw/display/cg3.c
+++ b/hw/display/cg3.c
@@ -279,7 +279,8 @@ static void cg3_initfn(Object *obj)
     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
     CG3State *s = CG3(obj);
 
-    memory_region_init_ram(&s->rom, NULL, "cg3.prom", FCODE_MAX_ROM_SIZE);
+    memory_region_init_ram(&s->rom, NULL, "cg3.prom", FCODE_MAX_ROM_SIZE,
+                           &error_abort);
     memory_region_set_readonly(&s->rom, true);
     sysbus_init_mmio(sbd, &s->rom);
 
@@ -306,7 +307,8 @@ static void cg3_realizefn(DeviceState *dev, Error **errp)
         }
     }
 
-    memory_region_init_ram(&s->vram_mem, NULL, "cg3.vram", s->vram_size);
+    memory_region_init_ram(&s->vram_mem, NULL, "cg3.vram", s->vram_size,
+                           &error_abort);
     vmstate_register_ram_global(&s->vram_mem);
     sysbus_init_mmio(sbd, &s->vram_mem);
 
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
index d43aa49..3a721b1 100644
--- a/hw/display/qxl.c
+++ b/hw/display/qxl.c
@@ -1979,14 +1979,14 @@ static int qxl_init_common(PCIQXLDevice *qxl)
 
     qxl->rom_size = qxl_rom_size();
     memory_region_init_ram(&qxl->rom_bar, OBJECT(qxl), "qxl.vrom",
-                           qxl->rom_size);
+                           qxl->rom_size, &error_abort);
     vmstate_register_ram(&qxl->rom_bar, &qxl->pci.qdev);
     init_qxl_rom(qxl);
     init_qxl_ram(qxl);
 
     qxl->guest_surfaces.cmds = g_new0(QXLPHYSICAL, qxl->ssd.num_surfaces);
     memory_region_init_ram(&qxl->vram_bar, OBJECT(qxl), "qxl.vram",
-                           qxl->vram_size);
+                           qxl->vram_size, &error_abort);
     vmstate_register_ram(&qxl->vram_bar, &qxl->pci.qdev);
     memory_region_init_alias(&qxl->vram32_bar, OBJECT(qxl), "qxl.vram32",
                              &qxl->vram_bar, 0, qxl->vram32_size);
@@ -2094,7 +2094,7 @@ static int qxl_init_secondary(PCIDevice *dev)
     qxl->id = device_id++;
     qxl_init_ramsize(qxl);
     memory_region_init_ram(&qxl->vga.vram, OBJECT(dev), "qxl.vgavram",
-                           qxl->vga.vram_size);
+                           qxl->vga.vram_size, &error_abort);
     vmstate_register_ram(&qxl->vga.vram, &qxl->pci.qdev);
     qxl->vga.vram_ptr = memory_region_get_ram_ptr(&qxl->vga.vram);
     qxl->vga.con = graphic_console_init(DEVICE(dev), 0, &qxl_ops, qxl);
diff --git a/hw/display/sm501.c b/hw/display/sm501.c
index eedf2d4..c72154b 100644
--- a/hw/display/sm501.c
+++ b/hw/display/sm501.c
@@ -1410,7 +1410,7 @@ void sm501_init(MemoryRegion *address_space_mem, uint32_t base,
 
     /* allocate local memory */
     memory_region_init_ram(&s->local_mem_region, NULL, "sm501.local",
-                           local_mem_bytes);
+                           local_mem_bytes, &error_abort);
     vmstate_register_ram_global(&s->local_mem_region);
     s->local_mem = memory_region_get_ram_ptr(&s->local_mem_region);
     memory_region_add_subregion(address_space_mem, base, &s->local_mem_region);
diff --git a/hw/display/tc6393xb.c b/hw/display/tc6393xb.c
index f4011d2..c19c055 100644
--- a/hw/display/tc6393xb.c
+++ b/hw/display/tc6393xb.c
@@ -581,7 +581,8 @@ TC6393xbState *tc6393xb_init(MemoryRegion *sysmem, uint32_t base, qemu_irq irq)
     memory_region_init_io(&s->iomem, NULL, &tc6393xb_ops, s, "tc6393xb", 0x10000);
     memory_region_add_subregion(sysmem, base, &s->iomem);
 
-    memory_region_init_ram(&s->vram, NULL, "tc6393xb.vram", 0x100000);
+    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);
diff --git a/hw/display/tcx.c b/hw/display/tcx.c
index 28c742c..b1cd2a9 100644
--- a/hw/display/tcx.c
+++ b/hw/display/tcx.c
@@ -535,7 +535,8 @@ static void tcx_initfn(Object *obj)
     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
     TCXState *s = TCX(obj);
 
-    memory_region_init_ram(&s->rom, NULL, "tcx.prom", FCODE_MAX_ROM_SIZE);
+    memory_region_init_ram(&s->rom, NULL, "tcx.prom", FCODE_MAX_ROM_SIZE,
+                           &error_abort);
     memory_region_set_readonly(&s->rom, true);
     sysbus_init_mmio(sbd, &s->rom);
 
@@ -567,7 +568,7 @@ static void tcx_realizefn(DeviceState *dev, Error **errp)
     char *fcode_filename;
 
     memory_region_init_ram(&s->vram_mem, OBJECT(s), "tcx.vram",
-                           s->vram_size * (1 + 4 + 4));
+                           s->vram_size * (1 + 4 + 4), &error_abort);
     vmstate_register_ram_global(&s->vram_mem);
     vram_base = memory_region_get_ram_ptr(&s->vram_mem);
 
diff --git a/hw/display/vga.c b/hw/display/vga.c
index 4b089a3..8edcbb2 100644
--- a/hw/display/vga.c
+++ b/hw/display/vga.c
@@ -2291,7 +2291,8 @@ void vga_common_init(VGACommonState *s, Object *obj, bool global_vmstate)
     s->vram_size_mb = s->vram_size >> 20;
 
     s->is_vbe_vmstate = 1;
-    memory_region_init_ram(&s->vram, obj, "vga.vram", s->vram_size);
+    memory_region_init_ram(&s->vram, obj, "vga.vram", s->vram_size,
+                           &error_abort);
     vmstate_register_ram(&s->vram, global_vmstate ? NULL : DEVICE(obj));
     xen_register_framebuffer(&s->vram);
     s->vram_ptr = memory_region_get_ram_ptr(&s->vram);
diff --git a/hw/display/vmware_vga.c b/hw/display/vmware_vga.c
index 591b645..32026e4 100644
--- a/hw/display/vmware_vga.c
+++ b/hw/display/vmware_vga.c
@@ -1201,7 +1201,8 @@ static void vmsvga_init(DeviceState *dev, struct vmsvga_state_s *s,
     s->vga.con = graphic_console_init(dev, 0, &vmsvga_ops, s);
 
     s->fifo_size = SVGA_FIFO_SIZE;
-    memory_region_init_ram(&s->fifo_ram, NULL, "vmsvga.fifo", s->fifo_size);
+    memory_region_init_ram(&s->fifo_ram, NULL, "vmsvga.fifo", s->fifo_size,
+                           &error_abort);
     vmstate_register_ram_global(&s->fifo_ram);
     s->fifo_ptr = memory_region_get_ram_ptr(&s->fifo_ram);
 
diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c
index de33657..5dcd2d5 100644
--- a/hw/i386/kvm/pci-assign.c
+++ b/hw/i386/kvm/pci-assign.c
@@ -1943,7 +1943,8 @@ static void assigned_dev_load_option_rom(AssignedDevice *dev)
 
     snprintf(name, sizeof(name), "%s.rom",
             object_get_typename(OBJECT(dev)));
-    memory_region_init_ram(&dev->dev.rom, OBJECT(dev), name, st.st_size);
+    memory_region_init_ram(&dev->dev.rom, OBJECT(dev), name, st.st_size,
+                           &error_abort);
     vmstate_register_ram(&dev->dev.rom, &dev->dev.qdev);
     ptr = memory_region_get_ram_ptr(&dev->dev.rom);
     memset(ptr, 0xff, st.st_size);
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 9e58982..d90f161 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1297,7 +1297,8 @@ FWCfgState *pc_memory_init(MachineState *machine,
     pc_system_firmware_init(rom_memory, guest_info->isapc_ram_fw);
 
     option_rom_mr = g_malloc(sizeof(*option_rom_mr));
-    memory_region_init_ram(option_rom_mr, NULL, "pc.rom", PC_ROM_SIZE);
+    memory_region_init_ram(option_rom_mr, NULL, "pc.rom", PC_ROM_SIZE,
+                           &error_abort);
     vmstate_register_ram_global(option_rom_mr);
     memory_region_add_subregion_overlap(rom_memory,
                                         PC_ROM_MIN_VGA,
diff --git a/hw/i386/pc_sysfw.c b/hw/i386/pc_sysfw.c
index 75a7ebb..bbe367a 100644
--- a/hw/i386/pc_sysfw.c
+++ b/hw/i386/pc_sysfw.c
@@ -55,7 +55,8 @@ static void pc_isa_bios_init(MemoryRegion *rom_memory,
     /* map the last 128KB of the BIOS in ISA space */
     isa_bios_size = MIN(flash_size, 128 * 1024);
     isa_bios = g_malloc(sizeof(*isa_bios));
-    memory_region_init_ram(isa_bios, NULL, "isa-bios", isa_bios_size);
+    memory_region_init_ram(isa_bios, NULL, "isa-bios", isa_bios_size,
+                           &error_abort);
     vmstate_register_ram_global(isa_bios);
     memory_region_add_subregion_overlap(rom_memory,
                                         0x100000 - isa_bios_size,
@@ -192,7 +193,7 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory, bool isapc_ram_fw)
         goto bios_error;
     }
     bios = g_malloc(sizeof(*bios));
-    memory_region_init_ram(bios, NULL, "pc.bios", bios_size);
+    memory_region_init_ram(bios, NULL, "pc.bios", bios_size, &error_abort);
     vmstate_register_ram_global(bios);
     if (!isapc_ram_fw) {
         memory_region_set_readonly(bios, true);
diff --git a/hw/input/milkymist-softusb.c b/hw/input/milkymist-softusb.c
index 1b4b8d4..5a427f0 100644
--- a/hw/input/milkymist-softusb.c
+++ b/hw/input/milkymist-softusb.c
@@ -250,12 +250,12 @@ static int milkymist_softusb_init(SysBusDevice *dev)
 
     /* register pmem and dmem */
     memory_region_init_ram(&s->pmem, OBJECT(s), "milkymist-softusb.pmem",
-                           s->pmem_size);
+                           s->pmem_size, &error_abort);
     vmstate_register_ram_global(&s->pmem);
     s->pmem_ptr = memory_region_get_ram_ptr(&s->pmem);
     sysbus_init_mmio(dev, &s->pmem);
     memory_region_init_ram(&s->dmem, OBJECT(s), "milkymist-softusb.dmem",
-                           s->dmem_size);
+                           s->dmem_size, &error_abort);
     vmstate_register_ram_global(&s->dmem);
     s->dmem_ptr = memory_region_get_ram_ptr(&s->dmem);
     sysbus_init_mmio(dev, &s->dmem);
diff --git a/hw/lm32/lm32_boards.c b/hw/lm32/lm32_boards.c
index 0e01340..5ae6cad 100644
--- a/hw/lm32/lm32_boards.c
+++ b/hw/lm32/lm32_boards.c
@@ -111,7 +111,8 @@ static void lm32_evr_init(MachineState *machine)
 
     reset_info->flash_base = flash_base;
 
-    memory_region_init_ram(phys_ram, NULL, "lm32_evr.sdram", ram_size);
+    memory_region_init_ram(phys_ram, NULL, "lm32_evr.sdram", ram_size,
+                           &error_abort);
     vmstate_register_ram_global(phys_ram);
     memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
 
@@ -213,7 +214,8 @@ static void lm32_uclinux_init(MachineState *machine)
 
     reset_info->flash_base = flash_base;
 
-    memory_region_init_ram(phys_ram, NULL, "lm32_uclinux.sdram", ram_size);
+    memory_region_init_ram(phys_ram, NULL, "lm32_uclinux.sdram", ram_size,
+                           &error_abort);
     vmstate_register_ram_global(phys_ram);
     memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
 
diff --git a/hw/lm32/milkymist.c b/hw/lm32/milkymist.c
index 81c3933..c8832f0 100644
--- a/hw/lm32/milkymist.c
+++ b/hw/lm32/milkymist.c
@@ -118,7 +118,8 @@ milkymist_init(MachineState *machine)
 
     cpu_lm32_set_phys_msb_ignore(env, 1);
 
-    memory_region_init_ram(phys_sdram, NULL, "milkymist.sdram", sdram_size);
+    memory_region_init_ram(phys_sdram, NULL, "milkymist.sdram", sdram_size,
+                           &error_abort);
     vmstate_register_ram_global(phys_sdram);
     memory_region_add_subregion(address_space_mem, sdram_base, phys_sdram);
 
diff --git a/hw/m68k/an5206.c b/hw/m68k/an5206.c
index 684496a..a9ac270 100644
--- a/hw/m68k/an5206.c
+++ b/hw/m68k/an5206.c
@@ -50,12 +50,12 @@ static void an5206_init(MachineState *machine)
     env->rambar0 = AN5206_RAMBAR_ADDR | 1;
 
     /* DRAM at address zero */
-    memory_region_init_ram(ram, NULL, "an5206.ram", ram_size);
+    memory_region_init_ram(ram, NULL, "an5206.ram", ram_size, &error_abort);
     vmstate_register_ram_global(ram);
     memory_region_add_subregion(address_space_mem, 0, ram);
 
     /* Internal SRAM.  */
-    memory_region_init_ram(sram, NULL, "an5206.sram", 512);
+    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);
 
diff --git a/hw/m68k/dummy_m68k.c b/hw/m68k/dummy_m68k.c
index 6db1b71..957ef82 100644
--- a/hw/m68k/dummy_m68k.c
+++ b/hw/m68k/dummy_m68k.c
@@ -40,7 +40,7 @@ static void dummy_m68k_init(MachineState *machine)
     env->vbr = 0;
 
     /* RAM at address zero */
-    memory_region_init_ram(ram, NULL, "dummy_m68k.ram", ram_size);
+    memory_region_init_ram(ram, NULL, "dummy_m68k.ram", ram_size, &error_abort);
     vmstate_register_ram_global(ram);
     memory_region_add_subregion(address_space_mem, 0, ram);
 
diff --git a/hw/m68k/mcf5208.c b/hw/m68k/mcf5208.c
index 2ef617f..188230f 100644
--- a/hw/m68k/mcf5208.c
+++ b/hw/m68k/mcf5208.c
@@ -218,12 +218,12 @@ static void mcf5208evb_init(MachineState *machine)
     /* TODO: Configure BARs.  */
 
     /* DRAM at 0x40000000 */
-    memory_region_init_ram(ram, NULL, "mcf5208.ram", ram_size);
+    memory_region_init_ram(ram, NULL, "mcf5208.ram", ram_size, &error_abort);
     vmstate_register_ram_global(ram);
     memory_region_add_subregion(address_space_mem, 0x40000000, ram);
 
     /* Internal SRAM.  */
-    memory_region_init_ram(sram, NULL, "mcf5208.sram", 16384);
+    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);
 
diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
index aea9c5b..60c79c7 100644
--- a/hw/microblaze/petalogix_ml605_mmu.c
+++ b/hw/microblaze/petalogix_ml605_mmu.c
@@ -100,11 +100,12 @@ petalogix_ml605_init(MachineState *machine)
 
     /* Attach emulated BRAM through the LMB.  */
     memory_region_init_ram(phys_lmb_bram, NULL, "petalogix_ml605.lmb_bram",
-                           LMB_BRAM_SIZE);
+                           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_init_ram(phys_ram, NULL, "petalogix_ml605.ram", ram_size);
+    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, ddr_base, phys_ram);
 
diff --git a/hw/microblaze/petalogix_s3adsp1800_mmu.c b/hw/microblaze/petalogix_s3adsp1800_mmu.c
index 49dc6d1..8e0fca9 100644
--- a/hw/microblaze/petalogix_s3adsp1800_mmu.c
+++ b/hw/microblaze/petalogix_s3adsp1800_mmu.c
@@ -81,11 +81,13 @@ petalogix_s3adsp1800_init(MachineState *machine)
 
     /* Attach emulated BRAM through the LMB.  */
     memory_region_init_ram(phys_lmb_bram, NULL,
-                           "petalogix_s3adsp1800.lmb_bram", LMB_BRAM_SIZE);
+                           "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_init_ram(phys_ram, NULL, "petalogix_s3adsp1800.ram", ram_size);
+    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);
 
diff --git a/hw/mips/mips_fulong2e.c b/hw/mips/mips_fulong2e.c
index f7533ed..be286da 100644
--- a/hw/mips/mips_fulong2e.c
+++ b/hw/mips/mips_fulong2e.c
@@ -302,9 +302,10 @@ static void mips_fulong2e_init(MachineState *machine)
     bios_size = 1024 * 1024;
 
     /* allocate RAM */
-    memory_region_init_ram(ram, NULL, "fulong2e.ram", ram_size);
+    memory_region_init_ram(ram, NULL, "fulong2e.ram", ram_size, &error_abort);
     vmstate_register_ram_global(ram);
-    memory_region_init_ram(bios, NULL, "fulong2e.bios", bios_size);
+    memory_region_init_ram(bios, NULL, "fulong2e.bios", bios_size,
+                           &error_abort);
     vmstate_register_ram_global(bios);
     memory_region_set_readonly(bios, true);
 
diff --git a/hw/mips/mips_jazz.c b/hw/mips/mips_jazz.c
index c113a80..6c31cb8 100644
--- a/hw/mips/mips_jazz.c
+++ b/hw/mips/mips_jazz.c
@@ -179,11 +179,12 @@ static void mips_jazz_init(MemoryRegion *address_space,
     cc->do_unassigned_access = mips_jazz_do_unassigned_access;
 
     /* allocate RAM */
-    memory_region_init_ram(ram, NULL, "mips_jazz.ram", ram_size);
+    memory_region_init_ram(ram, NULL, "mips_jazz.ram", ram_size, &error_abort);
     vmstate_register_ram_global(ram);
     memory_region_add_subregion(address_space, 0, ram);
 
-    memory_region_init_ram(bios, NULL, "mips_jazz.bios", MAGNUM_BIOS_SIZE);
+    memory_region_init_ram(bios, NULL, "mips_jazz.bios", MAGNUM_BIOS_SIZE,
+                           &error_abort);
     vmstate_register_ram_global(bios);
     memory_region_set_readonly(bios, true);
     memory_region_init_alias(bios2, NULL, "mips_jazz.bios", bios,
@@ -244,7 +245,8 @@ static void mips_jazz_init(MemoryRegion *address_space,
         {
             /* Simple ROM, so user doesn't have to provide one */
             MemoryRegion *rom_mr = g_new(MemoryRegion, 1);
-            memory_region_init_ram(rom_mr, NULL, "g364fb.rom", 0x80000);
+            memory_region_init_ram(rom_mr, NULL, "g364fb.rom", 0x80000,
+                                   &error_abort);
             vmstate_register_ram_global(rom_mr);
             memory_region_set_readonly(rom_mr, true);
             uint8_t *rom = memory_region_get_ram_ptr(rom_mr);
diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c
index cfb60af..2d87de9 100644
--- a/hw/mips/mips_malta.c
+++ b/hw/mips/mips_malta.c
@@ -992,7 +992,8 @@ void mips_malta_init(MachineState *machine)
     }
 
     /* register RAM at high address where it is undisturbed by IO */
-    memory_region_init_ram(ram_high, NULL, "mips_malta.ram", ram_size);
+    memory_region_init_ram(ram_high, NULL, "mips_malta.ram", ram_size,
+                           &error_abort);
     vmstate_register_ram_global(ram_high);
     memory_region_add_subregion(system_memory, 0x80000000, ram_high);
 
@@ -1116,7 +1117,8 @@ void mips_malta_init(MachineState *machine)
      * handled by an overlapping region as the resulting ROM code subpage
      * regions are not executable.
      */
-    memory_region_init_ram(bios_copy, NULL, "bios.1fc", BIOS_SIZE);
+    memory_region_init_ram(bios_copy, NULL, "bios.1fc", BIOS_SIZE,
+                           &error_abort);
     if (!rom_copy(memory_region_get_ram_ptr(bios_copy),
                   FLASH_ADDRESS, BIOS_SIZE)) {
         memcpy(memory_region_get_ram_ptr(bios_copy),
diff --git a/hw/mips/mips_mipssim.c b/hw/mips/mips_mipssim.c
index 413e64d..7ea0b9a 100644
--- a/hw/mips/mips_mipssim.c
+++ b/hw/mips/mips_mipssim.c
@@ -171,9 +171,11 @@ mips_mipssim_init(MachineState *machine)
     qemu_register_reset(main_cpu_reset, reset_info);
 
     /* Allocate RAM. */
-    memory_region_init_ram(ram, NULL, "mips_mipssim.ram", ram_size);
+    memory_region_init_ram(ram, NULL, "mips_mipssim.ram", ram_size,
+                           &error_abort);
     vmstate_register_ram_global(ram);
-    memory_region_init_ram(bios, NULL, "mips_mipssim.bios", BIOS_SIZE);
+    memory_region_init_ram(bios, NULL, "mips_mipssim.bios", BIOS_SIZE,
+                           &error_abort);
     vmstate_register_ram_global(bios);
     memory_region_set_readonly(bios, true);
 
diff --git a/hw/mips/mips_r4k.c b/hw/mips/mips_r4k.c
index 7120293..e219766 100644
--- a/hw/mips/mips_r4k.c
+++ b/hw/mips/mips_r4k.c
@@ -204,7 +204,7 @@ void mips_r4k_init(MachineState *machine)
                 ((unsigned int)ram_size / (1 << 20)));
         exit(1);
     }
-    memory_region_init_ram(ram, NULL, "mips_r4k.ram", ram_size);
+    memory_region_init_ram(ram, NULL, "mips_r4k.ram", ram_size, &error_abort);
     vmstate_register_ram_global(ram);
 
     memory_region_add_subregion(address_space_mem, 0, ram);
@@ -231,7 +231,8 @@ void mips_r4k_init(MachineState *machine)
 #endif
     if ((bios_size > 0) && (bios_size <= BIOS_SIZE)) {
         bios = g_new(MemoryRegion, 1);
-        memory_region_init_ram(bios, NULL, "mips_r4k.bios", BIOS_SIZE);
+        memory_region_init_ram(bios, NULL, "mips_r4k.bios", BIOS_SIZE,
+                               &error_abort);
         vmstate_register_ram_global(bios);
         memory_region_set_readonly(bios, true);
         memory_region_add_subregion(get_system_memory(), 0x1fc00000, bios);
diff --git a/hw/moxie/moxiesim.c b/hw/moxie/moxiesim.c
index 430f841..80bcc5b 100644
--- a/hw/moxie/moxiesim.c
+++ b/hw/moxie/moxiesim.c
@@ -123,11 +123,11 @@ static void moxiesim_init(MachineState *machine)
     qemu_register_reset(main_cpu_reset, cpu);
 
     /* Allocate RAM. */
-    memory_region_init_ram(ram, NULL, "moxiesim.ram", ram_size);
+    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_init_ram(rom, NULL, "moxie.rom", 128*0x1000);
+    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);
 
diff --git a/hw/net/milkymist-minimac2.c b/hw/net/milkymist-minimac2.c
index c023351..c632672 100644
--- a/hw/net/milkymist-minimac2.c
+++ b/hw/net/milkymist-minimac2.c
@@ -472,7 +472,7 @@ static int milkymist_minimac2_init(SysBusDevice *sbd)
 
     /* register buffers memory */
     memory_region_init_ram(&s->buffers, OBJECT(dev), "milkymist-minimac2.buffers",
-                           buffers_size);
+                           buffers_size, &error_abort);
     vmstate_register_ram_global(&s->buffers);
     s->rx0_buf = memory_region_get_ram_ptr(&s->buffers);
     s->rx1_buf = s->rx0_buf + MINIMAC2_BUFFER_SIZE;
diff --git a/hw/openrisc/openrisc_sim.c b/hw/openrisc/openrisc_sim.c
index b2b4f9b..c110033 100644
--- a/hw/openrisc/openrisc_sim.c
+++ b/hw/openrisc/openrisc_sim.c
@@ -114,7 +114,7 @@ static void openrisc_sim_init(MachineState *machine)
     }
 
     ram = g_malloc(sizeof(*ram));
-    memory_region_init_ram(ram, NULL, "openrisc.ram", ram_size);
+    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);
 
diff --git a/hw/pci-host/prep.c b/hw/pci-host/prep.c
index ec6f186..1de3681 100644
--- a/hw/pci-host/prep.c
+++ b/hw/pci-host/prep.c
@@ -299,7 +299,8 @@ static int raven_init(PCIDevice *d)
     d->config[0x0D] = 0x10; // latency_timer
     d->config[0x34] = 0x00; // capabilities_pointer
 
-    memory_region_init_ram(&s->bios, OBJECT(s), "bios", BIOS_SIZE);
+    memory_region_init_ram(&s->bios, OBJECT(s), "bios", BIOS_SIZE,
+                           &error_abort);
     memory_region_set_readonly(&s->bios, true);
     memory_region_add_subregion(get_system_memory(), (uint32_t)(-BIOS_SIZE),
                                 &s->bios);
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 351d320..3b11d59 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -1974,7 +1974,7 @@ static int pci_add_option_rom(PCIDevice *pdev, bool is_default_rom)
         snprintf(name, sizeof(name), "%s.rom", object_get_typename(OBJECT(pdev)));
     }
     pdev->has_rom = true;
-    memory_region_init_ram(&pdev->rom, OBJECT(pdev), name, size);
+    memory_region_init_ram(&pdev->rom, OBJECT(pdev), name, size, &error_abort);
     vmstate_register_ram(&pdev->rom, &pdev->qdev);
     ptr = memory_region_get_ram_ptr(&pdev->rom);
     load_image(path, ptr);
diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index f5bccd2..6b5392e 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -204,7 +204,8 @@ static void ppc_core99_init(MachineState *machine)
     memory_region_add_subregion(get_system_memory(), 0, ram);
 
     /* allocate and load BIOS */
-    memory_region_init_ram(bios, NULL, "ppc_core99.bios", BIOS_SIZE);
+    memory_region_init_ram(bios, NULL, "ppc_core99.bios", BIOS_SIZE,
+                           &error_abort);
     vmstate_register_ram_global(bios);
 
     if (bios_name == NULL)
diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index cd9bdbc..1c5d9f4 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -135,7 +135,8 @@ static void ppc_heathrow_init(MachineState *machine)
     memory_region_add_subregion(sysmem, 0, ram);
 
     /* allocate and load BIOS */
-    memory_region_init_ram(bios, NULL, "ppc_heathrow.bios", BIOS_SIZE);
+    memory_region_init_ram(bios, NULL, "ppc_heathrow.bios", BIOS_SIZE,
+                           &error_abort);
     vmstate_register_ram_global(bios);
 
     if (bios_name == NULL)
diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
index 11d3379..18a4ec5 100644
--- a/hw/ppc/ppc405_boards.c
+++ b/hw/ppc/ppc405_boards.c
@@ -214,7 +214,7 @@ static void ref405ep_init(MachineState *machine)
                         33333333, &pic, kernel_filename == NULL ? 0 : 1);
     /* allocate SRAM */
     sram_size = 512 * 1024;
-    memory_region_init_ram(sram, NULL, "ef405ep.sram", sram_size);
+    memory_region_init_ram(sram, NULL, "ef405ep.sram", sram_size, &error_abort);
     vmstate_register_ram_global(sram);
     memory_region_add_subregion(sysmem, 0xFFF00000, sram);
     /* allocate and load BIOS */
@@ -246,7 +246,8 @@ static void ref405ep_init(MachineState *machine)
         printf("Load BIOS from file\n");
 #endif
         bios = g_new(MemoryRegion, 1);
-        memory_region_init_ram(bios, NULL, "ef405ep.bios", BIOS_SIZE);
+        memory_region_init_ram(bios, NULL, "ef405ep.bios", BIOS_SIZE,
+                               &error_abort);
         vmstate_register_ram_global(bios);
 
         if (bios_name == NULL)
@@ -572,7 +573,8 @@ static void taihu_405ep_init(MachineState *machine)
         if (bios_name == NULL)
             bios_name = BIOS_FILENAME;
         bios = g_new(MemoryRegion, 1);
-        memory_region_init_ram(bios, NULL, "taihu_405ep.bios", BIOS_SIZE);
+        memory_region_init_ram(bios, NULL, "taihu_405ep.bios", BIOS_SIZE,
+                               &error_abort);
         vmstate_register_ram_global(bios);
         filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
         if (filename) {
diff --git a/hw/ppc/ppc405_uc.c b/hw/ppc/ppc405_uc.c
index a73e918..c77434a 100644
--- a/hw/ppc/ppc405_uc.c
+++ b/hw/ppc/ppc405_uc.c
@@ -974,7 +974,8 @@ static void ppc405_ocm_init(CPUPPCState *env)
 
     ocm = g_malloc0(sizeof(ppc405_ocm_t));
     /* XXX: Size is 4096 or 0x04000000 */
-    memory_region_init_ram(&ocm->isarc_ram, NULL, "ppc405.ocm", 4096);
+    memory_region_init_ram(&ocm->isarc_ram, NULL, "ppc405.ocm", 4096,
+                           &error_abort);
     vmstate_register_ram_global(&ocm->isarc_ram);
     memory_region_init_alias(&ocm->dsarc_ram, NULL, "ppc405.dsarc", &ocm->isarc_ram,
                              0, 4096);
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 42f5cec..2d7a868 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -110,7 +110,7 @@ static void ccw_init(MachineState *machine)
     virtio_ccw_register_hcalls();
 
     /* allocate RAM */
-    memory_region_init_ram(ram, NULL, "s390.ram", my_ram_size);
+    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);
 
diff --git a/hw/s390x/s390-virtio.c b/hw/s390x/s390-virtio.c
index 93c7ace..62460d6 100644
--- a/hw/s390x/s390-virtio.c
+++ b/hw/s390x/s390-virtio.c
@@ -256,7 +256,7 @@ static void s390_init(MachineState *machine)
     s390_virtio_register_hcalls();
 
     /* allocate RAM */
-    memory_region_init_ram(ram, NULL, "s390.ram", my_ram_size);
+    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);
 
diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
index 95c0246..321379e 100644
--- a/hw/sh4/r2d.c
+++ b/hw/sh4/r2d.c
@@ -255,7 +255,7 @@ static void r2d_init(MachineState *machine)
     qemu_register_reset(main_cpu_reset, reset_info);
 
     /* Allocate memory space */
-    memory_region_init_ram(sdram, NULL, "r2d.sdram", SDRAM_SIZE);
+    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);
     /* Register peripherals */
diff --git a/hw/sh4/shix.c b/hw/sh4/shix.c
index 7c152b4..f93f98e 100644
--- a/hw/sh4/shix.c
+++ b/hw/sh4/shix.c
@@ -59,14 +59,16 @@ static void shix_init(MachineState *machine)
     }
 
     /* Allocate memory space */
-    memory_region_init_ram(rom, NULL, "shix.rom", 0x4000);
+    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_init_ram(&sdram[0], NULL, "shix.sdram1", 0x01000000);
+    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_init_ram(&sdram[1], NULL, "shix.sdram2", 0x01000000);
+    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]);
 
diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
index 827383b..751392e 100644
--- a/hw/sparc/leon3.c
+++ b/hw/sparc/leon3.c
@@ -151,13 +151,13 @@ static void leon3_generic_hw_init(MachineState *machine)
         exit(1);
     }
 
-    memory_region_init_ram(ram, NULL, "leon3.ram", ram_size);
+    memory_region_init_ram(ram, NULL, "leon3.ram", ram_size, &error_abort);
     vmstate_register_ram_global(ram);
     memory_region_add_subregion(address_space_mem, 0x40000000, ram);
 
     /* Allocate BIOS */
     prom_size = 8 * 1024 * 1024; /* 8Mb */
-    memory_region_init_ram(prom, NULL, "Leon3.bios", prom_size);
+    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);
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 67e3663..78f87a2 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -621,7 +621,7 @@ static int idreg_init1(SysBusDevice *dev)
     IDRegState *s = MACIO_ID_REGISTER(dev);
 
     memory_region_init_ram(&s->mem, OBJECT(s),
-                           "sun4m.idreg", sizeof(idreg_data));
+                           "sun4m.idreg", sizeof(idreg_data), &error_abort);
     vmstate_register_ram_global(&s->mem);
     memory_region_set_readonly(&s->mem, true);
     sysbus_init_mmio(dev, &s->mem);
@@ -668,7 +668,7 @@ static int afx_init1(SysBusDevice *dev)
 {
     AFXState *s = TCX_AFX(dev);
 
-    memory_region_init_ram(&s->mem, OBJECT(s), "sun4m.afx", 4);
+    memory_region_init_ram(&s->mem, OBJECT(s), "sun4m.afx", 4, &error_abort);
     vmstate_register_ram_global(&s->mem);
     sysbus_init_mmio(dev, &s->mem);
     return 0;
@@ -742,7 +742,8 @@ static int prom_init1(SysBusDevice *dev)
 {
     PROMState *s = OPENPROM(dev);
 
-    memory_region_init_ram(&s->prom, OBJECT(s), "sun4m.prom", PROM_SIZE_MAX);
+    memory_region_init_ram(&s->prom, OBJECT(s), "sun4m.prom", PROM_SIZE_MAX,
+                           &error_abort);
     vmstate_register_ram_global(&s->prom);
     memory_region_set_readonly(&s->prom, true);
     sysbus_init_mmio(dev, &s->prom);
@@ -784,7 +785,8 @@ static int ram_init1(SysBusDevice *dev)
 {
     RamDevice *d = SUN4M_RAM(dev);
 
-    memory_region_init_ram(&d->ram, OBJECT(d), "sun4m.ram", d->size);
+    memory_region_init_ram(&d->ram, OBJECT(d), "sun4m.ram", d->size,
+                           &error_abort);
     vmstate_register_ram_global(&d->ram);
     sysbus_init_mmio(dev, &d->ram);
     return 0;
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index 33c311b..c541228 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -686,7 +686,8 @@ static int prom_init1(SysBusDevice *dev)
 {
     PROMState *s = OPENPROM(dev);
 
-    memory_region_init_ram(&s->prom, OBJECT(s), "sun4u.prom", PROM_SIZE_MAX);
+    memory_region_init_ram(&s->prom, OBJECT(s), "sun4u.prom", PROM_SIZE_MAX,
+                           &error_abort);
     vmstate_register_ram_global(&s->prom);
     memory_region_set_readonly(&s->prom, true);
     sysbus_init_mmio(dev, &s->prom);
@@ -729,7 +730,8 @@ static int ram_init1(SysBusDevice *dev)
 {
     RamDevice *d = SUN4U_RAM(dev);
 
-    memory_region_init_ram(&d->ram, OBJECT(d), "sun4u.ram", d->size);
+    memory_region_init_ram(&d->ram, OBJECT(d), "sun4u.ram", d->size,
+                           &error_abort);
     vmstate_register_ram_global(&d->ram);
     sysbus_init_mmio(dev, &d->ram);
     return 0;
diff --git a/hw/unicore32/puv3.c b/hw/unicore32/puv3.c
index 08dd4d0..c41499e 100644
--- a/hw/unicore32/puv3.c
+++ b/hw/unicore32/puv3.c
@@ -74,7 +74,8 @@ static void puv3_board_init(CPUUniCore32State *env, ram_addr_t ram_size)
     MemoryRegion *ram_memory = g_new(MemoryRegion, 1);
 
     /* SDRAM at address zero.  */
-    memory_region_init_ram(ram_memory, NULL, "puv3.ram", 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);
 }
diff --git a/hw/xtensa/sim.c b/hw/xtensa/sim.c
index 9642bf5..37ea9ae 100644
--- a/hw/xtensa/sim.c
+++ b/hw/xtensa/sim.c
@@ -79,12 +79,12 @@ static void xtensa_sim_init(MachineState *machine)
     }
 
     ram = g_malloc(sizeof(*ram));
-    memory_region_init_ram(ram, NULL, "xtensa.sram", ram_size);
+    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);
 
     rom = g_malloc(sizeof(*rom));
-    memory_region_init_ram(rom, NULL, "xtensa.rom", 0x1000);
+    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);
 
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index a2dff5a..ed06ff7 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -143,7 +143,7 @@ static void lx60_net_init(MemoryRegion *address_space,
             sysbus_mmio_get_region(s, 1));
 
     ram = g_malloc(sizeof(*ram));
-    memory_region_init_ram(ram, OBJECT(s), "open_eth.ram", 16384);
+    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);
 }
@@ -205,7 +205,8 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
     }
 
     ram = g_malloc(sizeof(*ram));
-    memory_region_init_ram(ram, NULL, "lx60.dram", machine->ram_size);
+    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);
 
@@ -254,7 +255,8 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
         uint32_t cur_lowmem = QEMU_ALIGN_UP(lowmem_end / 2, 4096);
 
         rom = g_malloc(sizeof(*rom));
-        memory_region_init_ram(rom, NULL, "lx60.sram", board->sram_size);
+        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);
 
diff --git a/include/exec/memory.h b/include/exec/memory.h
index e2c8e3e..ec6299b 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -311,11 +311,13 @@ void memory_region_init_io(MemoryRegion *mr,
  * @owner: the object that tracks the region's reference count
  * @name: the name of the region.
  * @size: size of the region.
+ * @errp: pointer to Error*, to store an error if it happens.
  */
 void memory_region_init_ram(MemoryRegion *mr,
                             struct Object *owner,
                             const char *name,
-                            uint64_t size);
+                            uint64_t size,
+                            Error **errp);
 
 #ifdef __linux__
 /**
diff --git a/memory.c b/memory.c
index 59d9935..feecbb1 100644
--- a/memory.c
+++ b/memory.c
@@ -1163,13 +1163,14 @@ void memory_region_init_io(MemoryRegion *mr,
 void memory_region_init_ram(MemoryRegion *mr,
                             Object *owner,
                             const char *name,
-                            uint64_t size)
+                            uint64_t size,
+                            Error **errp)
 {
     memory_region_init(mr, owner, name, size);
     mr->ram = true;
     mr->terminates = true;
     mr->destructor = memory_region_destructor_ram;
-    mr->ram_addr = qemu_ram_alloc(size, mr, &error_abort);
+    mr->ram_addr = qemu_ram_alloc(size, mr, errp);
 }
 
 #ifdef __linux__
diff --git a/numa.c b/numa.c
index 7bf7834..e4e352b 100644
--- a/numa.c
+++ b/numa.c
@@ -263,14 +263,14 @@ static void allocate_system_memory_nonnuma(MemoryRegion *mr, Object *owner,
         if (err) {
             qerror_report_err(err);
             error_free(err);
-            memory_region_init_ram(mr, owner, name, ram_size);
+            memory_region_init_ram(mr, owner, name, ram_size, &error_abort);
         }
 #else
         fprintf(stderr, "-mem-path not supported on this host\n");
         exit(1);
 #endif
     } else {
-        memory_region_init_ram(mr, owner, name, ram_size);
+        memory_region_init_ram(mr, owner, name, ram_size, &error_abort);
     }
     vmstate_register_ram_global(mr);
 }
diff --git a/xen-hvm.c b/xen-hvm.c
index 91de2e2..9328aff 100644
--- a/xen-hvm.c
+++ b/xen-hvm.c
@@ -188,7 +188,8 @@ static void xen_ram_init(ram_addr_t *below_4g_mem_size,
          */
         block_len = (1ULL << 32) + *above_4g_mem_size;
     }
-    memory_region_init_ram(&ram_memory, NULL, "xen.ram", block_len);
+    memory_region_init_ram(&ram_memory, NULL, "xen.ram", block_len,
+                           &error_abort);
     *ram_memory_p = &ram_memory;
     vmstate_register_ram_global(&ram_memory);
 
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH v5 3/6] memory: add parameter errp to memory_region_init_ram_ptr
  2014-08-06  5:36 [Qemu-devel] [PATCH v5 0/6] memory API improvements and bug fixes for memory Hu Tao
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 1/6] exec: add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr Hu Tao
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 2/6] memory: add parameter errp to memory_region_init_ram Hu Tao
@ 2014-08-06  5:36 ` Hu Tao
  2014-08-06 12:29   ` Peter Crosthwaite
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 4/6] memory: add parameter errp to memory_region_init_rom_device Hu Tao
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 16+ messages in thread
From: Hu Tao @ 2014-08-06  5:36 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Crosthwaite, Michael S. Tsirkin, Yasuaki Isimatu,
	Paolo Bonzini, Yasunori Goto

Add parameter errp to memory_region_init_ram_ptr and update all call
sites to pass in &error_abort.

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/display/g364fb.c      | 2 +-
 hw/i386/kvm/pci-assign.c | 3 ++-
 hw/misc/ivshmem.c        | 5 +++--
 hw/misc/vfio.c           | 3 ++-
 hw/ppc/spapr.c           | 2 +-
 include/exec/memory.h    | 4 +++-
 memory.c                 | 5 +++--
 7 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/hw/display/g364fb.c b/hw/display/g364fb.c
index 46f7b41..cce33ae 100644
--- a/hw/display/g364fb.c
+++ b/hw/display/g364fb.c
@@ -487,7 +487,7 @@ static void g364fb_init(DeviceState *dev, G364State *s)
 
     memory_region_init_io(&s->mem_ctrl, NULL, &g364fb_ctrl_ops, s, "ctrl", 0x180000);
     memory_region_init_ram_ptr(&s->mem_vram, NULL, "vram",
-                               s->vram_size, s->vram);
+                               s->vram_size, s->vram, &error_abort);
     vmstate_register_ram(&s->mem_vram, dev);
     memory_region_set_coalescing(&s->mem_vram);
 }
diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c
index 5dcd2d5..d2013af 100644
--- a/hw/i386/kvm/pci-assign.c
+++ b/hw/i386/kvm/pci-assign.c
@@ -456,7 +456,8 @@ static void assigned_dev_register_regions(PCIRegion *io_regions,
                          object_get_typename(OBJECT(pci_dev)), i);
                 memory_region_init_ram_ptr(&pci_dev->v_addrs[i].real_iomem,
                                            OBJECT(pci_dev), name,
-                                           cur_region->size, virtbase);
+                                           cur_region->size, virtbase,
+                                           &error_abort);
                 vmstate_register_ram(&pci_dev->v_addrs[i].real_iomem,
                                      &pci_dev->dev.qdev);
             }
diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
index 768e528..0949c15 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -348,7 +348,7 @@ static void create_shared_memory_BAR(IVShmemState *s, int fd) {
     ptr = mmap(0, s->ivshmem_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
 
     memory_region_init_ram_ptr(&s->ivshmem, OBJECT(s), "ivshmem.bar2",
-                               s->ivshmem_size, ptr);
+                               s->ivshmem_size, ptr, &error_abort);
     vmstate_register_ram(&s->ivshmem, DEVICE(s));
     memory_region_add_subregion(&s->bar, 0, &s->ivshmem);
 
@@ -476,7 +476,8 @@ static void ivshmem_read(void *opaque, const uint8_t * buf, int flags)
         map_ptr = mmap(0, s->ivshmem_size, PROT_READ|PROT_WRITE, MAP_SHARED,
                                                             incoming_fd, 0);
         memory_region_init_ram_ptr(&s->ivshmem, OBJECT(s),
-                                   "ivshmem.bar2", s->ivshmem_size, map_ptr);
+                                   "ivshmem.bar2", s->ivshmem_size, map_ptr,
+                                   &error_abort);
         vmstate_register_ram(&s->ivshmem, DEVICE(s));
 
         IVSHMEM_DPRINTF("guest h/w addr = %" PRIu64 ", size = %" PRIu64 "\n",
diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
index 0b9eba0..91d2c95 100644
--- a/hw/misc/vfio.c
+++ b/hw/misc/vfio.c
@@ -2894,7 +2894,8 @@ static int vfio_mmap_bar(VFIODevice *vdev, VFIOBAR *bar,
             goto empty_region;
         }
 
-        memory_region_init_ram_ptr(submem, OBJECT(vdev), name, size, *map);
+        memory_region_init_ram_ptr(submem, OBJECT(vdev), name, size, *map,
+                                   &error_abort);
     } else {
 empty_region:
         /* Create a zero sized sub-region to make cleanup easy. */
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index d01978f..4dfe40a 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1342,7 +1342,7 @@ static void ppc_spapr_init(MachineState *machine)
     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);
+                                   rma_alloc_size, rma, &error_abort);
         vmstate_register_ram_global(rma_region);
         memory_region_add_subregion(sysmem, 0, rma_region);
     }
diff --git a/include/exec/memory.h b/include/exec/memory.h
index ec6299b..caa988d 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -351,12 +351,14 @@ void memory_region_init_ram_from_file(MemoryRegion *mr,
  * @name: the name of the region.
  * @size: size of the region.
  * @ptr: memory to be mapped; must contain at least @size bytes.
+ * @errp: pointer to Error*, to store an error if it happens.
  */
 void memory_region_init_ram_ptr(MemoryRegion *mr,
                                 struct Object *owner,
                                 const char *name,
                                 uint64_t size,
-                                void *ptr);
+                                void *ptr,
+                                Error **errp);
 
 /**
  * memory_region_init_alias: Initialize a memory region that aliases all or a
diff --git a/memory.c b/memory.c
index feecbb1..bcebfd8 100644
--- a/memory.c
+++ b/memory.c
@@ -1194,13 +1194,14 @@ void memory_region_init_ram_ptr(MemoryRegion *mr,
                                 Object *owner,
                                 const char *name,
                                 uint64_t size,
-                                void *ptr)
+                                void *ptr,
+                                Error **errp)
 {
     memory_region_init(mr, owner, name, size);
     mr->ram = true;
     mr->terminates = true;
     mr->destructor = memory_region_destructor_ram_from_ptr;
-    mr->ram_addr = qemu_ram_alloc_from_ptr(size, ptr, mr, &error_abort);
+    mr->ram_addr = qemu_ram_alloc_from_ptr(size, ptr, mr, errp);
 }
 
 void memory_region_init_alias(MemoryRegion *mr,
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH v5 4/6] memory: add parameter errp to memory_region_init_rom_device
  2014-08-06  5:36 [Qemu-devel] [PATCH v5 0/6] memory API improvements and bug fixes for memory Hu Tao
                   ` (2 preceding siblings ...)
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 3/6] memory: add parameter errp to memory_region_init_ram_ptr Hu Tao
@ 2014-08-06  5:36 ` Hu Tao
  2014-08-06 12:32   ` Peter Crosthwaite
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 5/6] hostmem-ram: don't exit qemu if size of memory-backend-ram is way too big Hu Tao
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 6/6] exec: improve error handling and reporting in file_ram_alloc() and gethugepagesize() Hu Tao
  5 siblings, 1 reply; 16+ messages in thread
From: Hu Tao @ 2014-08-06  5:36 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Crosthwaite, Michael S. Tsirkin, Yasuaki Isimatu,
	Paolo Bonzini, Yasunori Goto

Add parameter errp to memory_region_init_rom_device and update all call
sites to pass in &error_abort.

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 hw/block/pflash_cfi01.c | 2 +-
 hw/block/pflash_cfi02.c | 2 +-
 include/exec/memory.h   | 4 +++-
 memory.c                | 5 +++--
 4 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c
index f9507b4..649565d 100644
--- a/hw/block/pflash_cfi01.c
+++ b/hw/block/pflash_cfi01.c
@@ -770,7 +770,7 @@ static void pflash_cfi01_realize(DeviceState *dev, Error **errp)
     memory_region_init_rom_device(
         &pfl->mem, OBJECT(dev),
         pfl->be ? &pflash_cfi01_ops_be : &pflash_cfi01_ops_le, pfl,
-        pfl->name, total_len);
+        pfl->name, total_len, &error_abort);
     vmstate_register_ram(&pfl->mem, DEVICE(pfl));
     pfl->storage = memory_region_get_ram_ptr(&pfl->mem);
     sysbus_init_mmio(SYS_BUS_DEVICE(dev), &pfl->mem);
diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c
index 8d4b828..49db02d 100644
--- a/hw/block/pflash_cfi02.c
+++ b/hw/block/pflash_cfi02.c
@@ -608,7 +608,7 @@ static void pflash_cfi02_realize(DeviceState *dev, Error **errp)
 
     memory_region_init_rom_device(&pfl->orig_mem, OBJECT(pfl), pfl->be ?
                                   &pflash_cfi02_ops_be : &pflash_cfi02_ops_le,
-                                  pfl, pfl->name, chip_len);
+                                  pfl, pfl->name, chip_len, &error_abort);
     vmstate_register_ram(&pfl->orig_mem, DEVICE(pfl));
     pfl->storage = memory_region_get_ram_ptr(&pfl->orig_mem);
     pfl->chip_len = chip_len;
diff --git a/include/exec/memory.h b/include/exec/memory.h
index caa988d..71bed47 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -388,13 +388,15 @@ void memory_region_init_alias(MemoryRegion *mr,
  * @ops: callbacks for write access handling.
  * @name: the name of the region.
  * @size: size of the region.
+ * @errp: pointer to Error*, to store an error if it happens.
  */
 void memory_region_init_rom_device(MemoryRegion *mr,
                                    struct Object *owner,
                                    const MemoryRegionOps *ops,
                                    void *opaque,
                                    const char *name,
-                                   uint64_t size);
+                                   uint64_t size,
+                                   Error **errp);
 
 /**
  * memory_region_init_reservation: Initialize a memory region that reserves
diff --git a/memory.c b/memory.c
index bcebfd8..06a7e1b 100644
--- a/memory.c
+++ b/memory.c
@@ -1223,7 +1223,8 @@ void memory_region_init_rom_device(MemoryRegion *mr,
                                    const MemoryRegionOps *ops,
                                    void *opaque,
                                    const char *name,
-                                   uint64_t size)
+                                   uint64_t size,
+                                   Error **errp)
 {
     memory_region_init(mr, owner, name, size);
     mr->ops = ops;
@@ -1231,7 +1232,7 @@ void memory_region_init_rom_device(MemoryRegion *mr,
     mr->terminates = true;
     mr->rom_device = true;
     mr->destructor = memory_region_destructor_rom_device;
-    mr->ram_addr = qemu_ram_alloc(size, mr, &error_abort);
+    mr->ram_addr = qemu_ram_alloc(size, mr, errp);
 }
 
 void memory_region_init_iommu(MemoryRegion *mr,
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH v5 5/6] hostmem-ram: don't exit qemu if size of memory-backend-ram is way too big
  2014-08-06  5:36 [Qemu-devel] [PATCH v5 0/6] memory API improvements and bug fixes for memory Hu Tao
                   ` (3 preceding siblings ...)
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 4/6] memory: add parameter errp to memory_region_init_rom_device Hu Tao
@ 2014-08-06  5:36 ` Hu Tao
  2014-08-06 12:37   ` Peter Crosthwaite
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 6/6] exec: improve error handling and reporting in file_ram_alloc() and gethugepagesize() Hu Tao
  5 siblings, 1 reply; 16+ messages in thread
From: Hu Tao @ 2014-08-06  5:36 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Crosthwaite, Michael S. Tsirkin, Yasuaki Isimatu,
	Paolo Bonzini, Yasunori Goto

When using monitor command object_add to add a memory backend whose
size is way too big to allocate memory for it, qemu just exits. In
the case we'd better give an error message and keep guest running.

The problem can be reproduced as follows:

1. run qemu
2. (monitor)object_add memory-backend-ram,size=100000G,id=ram0

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 backends/hostmem-ram.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c
index e55d066..a67a134 100644
--- a/backends/hostmem-ram.c
+++ b/backends/hostmem-ram.c
@@ -27,7 +27,7 @@ ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
 
     path = object_get_canonical_path_component(OBJECT(backend));
     memory_region_init_ram(&backend->mr, OBJECT(backend), path,
-                           backend->size, &error_abort);
+                           backend->size, errp);
     g_free(path);
 }
 
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH v5 6/6] exec: improve error handling and reporting in file_ram_alloc() and gethugepagesize()
  2014-08-06  5:36 [Qemu-devel] [PATCH v5 0/6] memory API improvements and bug fixes for memory Hu Tao
                   ` (4 preceding siblings ...)
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 5/6] hostmem-ram: don't exit qemu if size of memory-backend-ram is way too big Hu Tao
@ 2014-08-06  5:36 ` Hu Tao
  2014-08-06 12:49   ` Peter Crosthwaite
  5 siblings, 1 reply; 16+ messages in thread
From: Hu Tao @ 2014-08-06  5:36 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Crosthwaite, Michael S. Tsirkin, Yasuaki Isimatu,
	Paolo Bonzini, Yasunori Goto

This patch fixes two problems of memory-backend-file:

1. If user adds a memory-backend-file object using object_add command,
   specifying a non-existing directory for property mem-path, qemu
   will core dump with message:

     /nonexistingdir: No such file or directory
     Bad ram offset fffffffffffff000
     Aborted (core dumped)

   with this patch, qemu reports error message like:

     qemu-system-x86_64: -object memory-backend-file,mem-path=/nonexistingdir,id=mem-file0,size=128M:
     failed to stat file /nonexistingdir: No such file or directory

2. If user adds a memory-backend-file object using object_add command,
   specifying a size that is less than huge page size, qemu
   will core dump with message:

     Bad ram offset fffffffffffff000
     Aborted (core dumped)

   with this patch, qemu reports error message like:

     qemu-system-x86_64: -object memory-backend-file,mem-path=/hugepages,id=mem-file0,size=1M: memory
     size 0x100000 should be euqal or larger than huge page size 0x200000

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 exec.c | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/exec.c b/exec.c
index 7e60a44..6512820 100644
--- a/exec.c
+++ b/exec.c
@@ -996,7 +996,7 @@ void qemu_mutex_unlock_ramlist(void)
 
 #define HUGETLBFS_MAGIC       0x958458f6
 
-static long gethugepagesize(const char *path)
+static long gethugepagesize(const char *path, Error **errp)
 {
     struct statfs fs;
     int ret;
@@ -1006,7 +1006,7 @@ static long gethugepagesize(const char *path)
     } while (ret != 0 && errno == EINTR);
 
     if (ret != 0) {
-        perror(path);
+        error_setg_errno(errp, errno, "failed to get size of file %s", path);
         return 0;
     }
 
@@ -1024,17 +1024,20 @@ static void *file_ram_alloc(RAMBlock *block,
     char *filename;
     char *sanitized_name;
     char *c;
-    void *area;
+    void *area = NULL;
     int fd;
-    unsigned long hpagesize;
+    uint64_t hpagesize;
 
-    hpagesize = gethugepagesize(path);
-    if (!hpagesize) {
+    hpagesize = gethugepagesize(path, errp);
+    if (errp && *errp) {
         goto error;
     }
 
     if (memory < hpagesize) {
-        return NULL;
+        error_setg(errp, "memory size 0x" RAM_ADDR_FMT " must be euqal to "
+                   "or larger than huge page size 0x%" PRIx64,
+                   memory, hpagesize);
+        goto error;
     }
 
     if (kvm_enabled() && !kvm_has_sync_mmu()) {
@@ -1094,8 +1097,8 @@ static void *file_ram_alloc(RAMBlock *block,
     return area;
 
 error:
-    if (mem_prealloc) {
-        exit(1);
+    if (area && area != MAP_FAILED) {
+        munmap(area, memory);
     }
     return NULL;
 }
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v5 1/6] exec: add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 1/6] exec: add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr Hu Tao
@ 2014-08-06 12:15   ` Peter Crosthwaite
  2014-08-07  7:52     ` Hu Tao
  0 siblings, 1 reply; 16+ messages in thread
From: Peter Crosthwaite @ 2014-08-06 12:15 UTC (permalink / raw)
  To: Hu Tao
  Cc: Yasunori Goto, Paolo Bonzini, Yasuaki Isimatu,
	qemu-devel@nongnu.org Developers, Michael S. Tsirkin

On Wed, Aug 6, 2014 at 3:36 PM, Hu Tao <hutao@cn.fujitsu.com> wrote:
> Add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr so that
> we can handler errors.

"handle"

>
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  exec.c                  | 32 +++++++++++++++++++++++---------
>  include/exec/ram_addr.h |  4 ++--
>  memory.c                |  6 +++---
>  3 files changed, 28 insertions(+), 14 deletions(-)
>
> diff --git a/exec.c b/exec.c
> index 765bd94..7e60a44 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -1224,7 +1224,7 @@ static int memory_try_enable_merging(void *addr, size_t len)
>      return qemu_madvise(addr, len, QEMU_MADV_MERGEABLE);
>  }
>
> -static ram_addr_t ram_block_add(RAMBlock *new_block)
> +static ram_addr_t ram_block_add(RAMBlock *new_block, Error **errp)
>  {
>      RAMBlock *block;
>      ram_addr_t old_ram_size, new_ram_size;
> @@ -1241,9 +1241,11 @@ static ram_addr_t ram_block_add(RAMBlock *new_block)
>          } else {
>              new_block->host = phys_mem_alloc(new_block->length);
>              if (!new_block->host) {
> -                fprintf(stderr, "Cannot set up guest memory '%s': %s\n",
> -                        new_block->mr->name, strerror(errno));
> -                exit(1);
> +                error_setg_errno(errp, errno,
> +                                 "cannot set up guest memory '%s'",
> +                                 new_block->mr->name);
> +                qemu_mutex_unlock_ramlist();
> +                return -1;
>              }
>              memory_try_enable_merging(new_block->host, new_block->length);
>          }
> @@ -1294,6 +1296,7 @@ ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
>                                      Error **errp)
>  {
>      RAMBlock *new_block;
> +    ram_addr_t addr;
>
>      if (xen_enabled()) {
>          error_setg(errp, "-mem-path not supported with Xen");
> @@ -1323,14 +1326,20 @@ ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
>          return -1;
>      }
>
> -    return ram_block_add(new_block);
> +    addr = ram_block_add(new_block, errp);
> +    if (errp && *errp) {
> +        g_free(new_block);

The free being conditional on errp will cause a leak if clients
(validly) pass a NULL errp in. This free needs to be unconditional.
The way to achieve that is the local_err error_propagate pattern.

> +        return -1;
> +    }
> +    return addr;
>  }
>  #endif
>
>  ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
> -                                   MemoryRegion *mr)
> +                                   MemoryRegion *mr, Error **errp)
>  {
>      RAMBlock *new_block;
> +    ram_addr_t addr;
>
>      size = TARGET_PAGE_ALIGN(size);
>      new_block = g_malloc0(sizeof(*new_block));
> @@ -1341,12 +1350,17 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
>      if (host) {
>          new_block->flags |= RAM_PREALLOC;
>      }
> -    return ram_block_add(new_block);
> +    addr = ram_block_add(new_block, errp);
> +    if (errp && *errp) {
> +        g_free(new_block);

ditto.

Regards,
Peter

> +        return -1;
> +    }
> +    return addr;
>  }
>
> -ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr)
> +ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr, Error **errp)
>  {
> -    return qemu_ram_alloc_from_ptr(size, NULL, mr);
> +    return qemu_ram_alloc_from_ptr(size, NULL, mr, errp);
>  }
>
>  void qemu_ram_free_from_ptr(ram_addr_t addr)
> diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h
> index 6593be1..cf1d4c7 100644
> --- a/include/exec/ram_addr.h
> +++ b/include/exec/ram_addr.h
> @@ -26,8 +26,8 @@ ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
>                                      bool share, const char *mem_path,
>                                      Error **errp);
>  ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
> -                                   MemoryRegion *mr);
> -ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr);
> +                                   MemoryRegion *mr, Error **errp);
> +ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr, Error **errp);
>  int qemu_get_ram_fd(ram_addr_t addr);
>  void *qemu_get_ram_block_host_ptr(ram_addr_t addr);
>  void *qemu_get_ram_ptr(ram_addr_t addr);
> diff --git a/memory.c b/memory.c
> index 64d7176..59d9935 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -1169,7 +1169,7 @@ void memory_region_init_ram(MemoryRegion *mr,
>      mr->ram = true;
>      mr->terminates = true;
>      mr->destructor = memory_region_destructor_ram;
> -    mr->ram_addr = qemu_ram_alloc(size, mr);
> +    mr->ram_addr = qemu_ram_alloc(size, mr, &error_abort);
>  }
>
>  #ifdef __linux__
> @@ -1199,7 +1199,7 @@ void memory_region_init_ram_ptr(MemoryRegion *mr,
>      mr->ram = true;
>      mr->terminates = true;
>      mr->destructor = memory_region_destructor_ram_from_ptr;
> -    mr->ram_addr = qemu_ram_alloc_from_ptr(size, ptr, mr);
> +    mr->ram_addr = qemu_ram_alloc_from_ptr(size, ptr, mr, &error_abort);
>  }
>
>  void memory_region_init_alias(MemoryRegion *mr,
> @@ -1229,7 +1229,7 @@ void memory_region_init_rom_device(MemoryRegion *mr,
>      mr->terminates = true;
>      mr->rom_device = true;
>      mr->destructor = memory_region_destructor_rom_device;
> -    mr->ram_addr = qemu_ram_alloc(size, mr);
> +    mr->ram_addr = qemu_ram_alloc(size, mr, &error_abort);
>  }
>
>  void memory_region_init_iommu(MemoryRegion *mr,
> --
> 1.9.3
>
>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v5 2/6] memory: add parameter errp to memory_region_init_ram
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 2/6] memory: add parameter errp to memory_region_init_ram Hu Tao
@ 2014-08-06 12:27   ` Peter Crosthwaite
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Crosthwaite @ 2014-08-06 12:27 UTC (permalink / raw)
  To: Hu Tao
  Cc: Yasunori Goto, Paolo Bonzini, Yasuaki Isimatu,
	qemu-devel@nongnu.org Developers, Michael S. Tsirkin

On Wed, Aug 6, 2014 at 3:36 PM, Hu Tao <hutao@cn.fujitsu.com> wrote:
> Add parameter errp to memory_region_init_ram and update all call sites
> to pass in &error_abort.
>
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>

Liking it.

Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

> ---
>  backends/hostmem-ram.c                   |  2 +-
>  hw/alpha/typhoon.c                       |  3 ++-
>  hw/arm/armv7m.c                          |  7 ++++---
>  hw/arm/cubieboard.c                      |  2 +-
>  hw/arm/digic_boards.c                    |  2 +-
>  hw/arm/exynos4210.c                      |  9 +++++----
>  hw/arm/highbank.c                        |  5 +++--
>  hw/arm/integratorcp.c                    |  5 +++--
>  hw/arm/kzm.c                             |  4 ++--
>  hw/arm/mainstone.c                       |  3 ++-
>  hw/arm/musicpal.c                        |  6 ++++--
>  hw/arm/omap1.c                           |  6 ++++--
>  hw/arm/omap2.c                           |  6 ++++--
>  hw/arm/omap_sx1.c                        |  6 ++++--
>  hw/arm/palm.c                            |  3 ++-
>  hw/arm/pxa2xx.c                          | 11 +++++++----
>  hw/arm/realview.c                        |  9 ++++++---
>  hw/arm/spitz.c                           |  2 +-
>  hw/arm/strongarm.c                       |  3 ++-
>  hw/arm/tosa.c                            |  2 +-
>  hw/arm/versatilepb.c                     |  3 ++-
>  hw/arm/vexpress.c                        | 15 ++++++++++-----
>  hw/arm/virt.c                            |  3 ++-
>  hw/arm/xilinx_zynq.c                     |  6 ++++--
>  hw/block/onenand.c                       |  2 +-
>  hw/core/loader.c                         |  2 +-
>  hw/cris/axis_dev88.c                     |  6 ++++--
>  hw/display/cg3.c                         |  6 ++++--
>  hw/display/qxl.c                         |  6 +++---
>  hw/display/sm501.c                       |  2 +-
>  hw/display/tc6393xb.c                    |  3 ++-
>  hw/display/tcx.c                         |  5 +++--
>  hw/display/vga.c                         |  3 ++-
>  hw/display/vmware_vga.c                  |  3 ++-
>  hw/i386/kvm/pci-assign.c                 |  3 ++-
>  hw/i386/pc.c                             |  3 ++-
>  hw/i386/pc_sysfw.c                       |  5 +++--
>  hw/input/milkymist-softusb.c             |  4 ++--
>  hw/lm32/lm32_boards.c                    |  6 ++++--
>  hw/lm32/milkymist.c                      |  3 ++-
>  hw/m68k/an5206.c                         |  4 ++--
>  hw/m68k/dummy_m68k.c                     |  2 +-
>  hw/m68k/mcf5208.c                        |  4 ++--
>  hw/microblaze/petalogix_ml605_mmu.c      |  5 +++--
>  hw/microblaze/petalogix_s3adsp1800_mmu.c |  6 ++++--
>  hw/mips/mips_fulong2e.c                  |  5 +++--
>  hw/mips/mips_jazz.c                      |  8 +++++---
>  hw/mips/mips_malta.c                     |  6 ++++--
>  hw/mips/mips_mipssim.c                   |  6 ++++--
>  hw/mips/mips_r4k.c                       |  5 +++--
>  hw/moxie/moxiesim.c                      |  4 ++--
>  hw/net/milkymist-minimac2.c              |  2 +-
>  hw/openrisc/openrisc_sim.c               |  2 +-
>  hw/pci-host/prep.c                       |  3 ++-
>  hw/pci/pci.c                             |  2 +-
>  hw/ppc/mac_newworld.c                    |  3 ++-
>  hw/ppc/mac_oldworld.c                    |  3 ++-
>  hw/ppc/ppc405_boards.c                   |  8 +++++---
>  hw/ppc/ppc405_uc.c                       |  3 ++-
>  hw/s390x/s390-virtio-ccw.c               |  2 +-
>  hw/s390x/s390-virtio.c                   |  2 +-
>  hw/sh4/r2d.c                             |  2 +-
>  hw/sh4/shix.c                            |  8 +++++---
>  hw/sparc/leon3.c                         |  4 ++--
>  hw/sparc/sun4m.c                         | 10 ++++++----
>  hw/sparc64/sun4u.c                       |  6 ++++--
>  hw/unicore32/puv3.c                      |  3 ++-
>  hw/xtensa/sim.c                          |  4 ++--
>  hw/xtensa/xtfpga.c                       |  8 +++++---
>  include/exec/memory.h                    |  4 +++-
>  memory.c                                 |  5 +++--
>  numa.c                                   |  4 ++--
>  xen-hvm.c                                |  3 ++-
>  73 files changed, 203 insertions(+), 128 deletions(-)
>
> diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c
> index d9a8290..e55d066 100644
> --- a/backends/hostmem-ram.c
> +++ b/backends/hostmem-ram.c
> @@ -27,7 +27,7 @@ ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
>
>      path = object_get_canonical_path_component(OBJECT(backend));
>      memory_region_init_ram(&backend->mr, OBJECT(backend), path,
> -                           backend->size);
> +                           backend->size, &error_abort);
>      g_free(path);
>  }
>
> diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c
> index 67a1070..058b723 100644
> --- a/hw/alpha/typhoon.c
> +++ b/hw/alpha/typhoon.c
> @@ -843,7 +843,8 @@ PCIBus *typhoon_init(ram_addr_t ram_size, ISABus **isa_bus,
>
>      /* Main memory region, 0x00.0000.0000.  Real hardware supports 32GB,
>         but the address space hole reserved at this point is 8TB.  */
> -    memory_region_init_ram(&s->ram_region, OBJECT(s), "ram", ram_size);
> +    memory_region_init_ram(&s->ram_region, OBJECT(s), "ram", ram_size,
> +                           &error_abort);
>      vmstate_register_ram_global(&s->ram_region);
>      memory_region_add_subregion(addr_space, 0, &s->ram_region);
>
> diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
> index 397e8df..32b4be6 100644
> --- a/hw/arm/armv7m.c
> +++ b/hw/arm/armv7m.c
> @@ -210,11 +210,12 @@ qemu_irq *armv7m_init(MemoryRegion *address_space_mem,
>  #endif
>
>      /* Flash programming is done via the SCU, so pretend it is ROM.  */
> -    memory_region_init_ram(flash, NULL, "armv7m.flash", flash_size);
> +    memory_region_init_ram(flash, NULL, "armv7m.flash", flash_size,
> +                           &error_abort);
>      vmstate_register_ram_global(flash);
>      memory_region_set_readonly(flash, true);
>      memory_region_add_subregion(address_space_mem, 0, flash);
> -    memory_region_init_ram(sram, NULL, "armv7m.sram", sram_size);
> +    memory_region_init_ram(sram, NULL, "armv7m.sram", sram_size, &error_abort);
>      vmstate_register_ram_global(sram);
>      memory_region_add_subregion(address_space_mem, 0x20000000, sram);
>      armv7m_bitband_init();
> @@ -255,7 +256,7 @@ qemu_irq *armv7m_init(MemoryRegion *address_space_mem,
>      /* Hack to map an additional page of ram at the top of the address
>         space.  This stops qemu complaining about executing code outside RAM
>         when returning from an exception.  */
> -    memory_region_init_ram(hack, NULL, "armv7m.hack", 0x1000);
> +    memory_region_init_ram(hack, NULL, "armv7m.hack", 0x1000, &error_abort);
>      vmstate_register_ram_global(hack);
>      memory_region_add_subregion(address_space_mem, 0xfffff000, hack);
>
> diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
> index e2260e3..d1e53be 100644
> --- a/hw/arm/cubieboard.c
> +++ b/hw/arm/cubieboard.c
> @@ -64,7 +64,7 @@ static void cubieboard_init(MachineState *machine)
>      }
>
>      memory_region_init_ram(&s->sdram, NULL, "cubieboard.ram",
> -                           machine->ram_size);
> +                           machine->ram_size, &error_abort);
>      vmstate_register_ram_global(&s->sdram);
>      memory_region_add_subregion(get_system_memory(), AW_A10_SDRAM_BASE,
>                                  &s->sdram);
> diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
> index d1424ee..2a4b872 100644
> --- a/hw/arm/digic_boards.c
> +++ b/hw/arm/digic_boards.c
> @@ -51,7 +51,7 @@ typedef struct DigicBoard {
>
>  static void digic4_board_setup_ram(DigicBoardState *s, hwaddr ram_size)
>  {
> -    memory_region_init_ram(&s->ram, NULL, "ram", ram_size);
> +    memory_region_init_ram(&s->ram, NULL, "ram", ram_size, &error_abort);
>      memory_region_add_subregion(get_system_memory(), 0, &s->ram);
>      vmstate_register_ram_global(&s->ram);
>  }
> diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
> index 6426d16..582794c 100644
> --- a/hw/arm/exynos4210.c
> +++ b/hw/arm/exynos4210.c
> @@ -248,7 +248,7 @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem,
>
>      /* Internal ROM */
>      memory_region_init_ram(&s->irom_mem, NULL, "exynos4210.irom",
> -                           EXYNOS4210_IROM_SIZE);
> +                           EXYNOS4210_IROM_SIZE, &error_abort);
>      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,
> @@ -264,7 +264,7 @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem,
>
>      /* Internal RAM */
>      memory_region_init_ram(&s->iram_mem, NULL, "exynos4210.iram",
> -                           EXYNOS4210_IRAM_SIZE);
> +                           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);
> @@ -273,13 +273,14 @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem,
>      mem_size = ram_size;
>      if (mem_size > EXYNOS4210_DRAM_MAX_SIZE) {
>          memory_region_init_ram(&s->dram1_mem, NULL, "exynos4210.dram1",
> -                mem_size - EXYNOS4210_DRAM_MAX_SIZE);
> +                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);
>          mem_size = EXYNOS4210_DRAM_MAX_SIZE;
>      }
> -    memory_region_init_ram(&s->dram0_mem, NULL, "exynos4210.dram0", mem_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);
> diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
> index 8340434..fa61e5f 100644
> --- a/hw/arm/highbank.c
> +++ b/hw/arm/highbank.c
> @@ -255,12 +255,13 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
>
>      sysmem = get_system_memory();
>      dram = g_new(MemoryRegion, 1);
> -    memory_region_init_ram(dram, NULL, "highbank.dram", ram_size);
> +    memory_region_init_ram(dram, NULL, "highbank.dram", ram_size, &error_abort);
>      /* SDRAM at address zero.  */
>      memory_region_add_subregion(sysmem, 0, dram);
>
>      sysram = g_new(MemoryRegion, 1);
> -    memory_region_init_ram(sysram, NULL, "highbank.sysram", 0x8000);
> +    memory_region_init_ram(sysram, NULL, "highbank.sysram", 0x8000,
> +                           &error_abort);
>      memory_region_add_subregion(sysmem, 0xfff88000, sysram);
>      if (bios_name != NULL) {
>          sysboot_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
> diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
> index 0e476c3..266ec18 100644
> --- a/hw/arm/integratorcp.c
> +++ b/hw/arm/integratorcp.c
> @@ -264,7 +264,8 @@ static int integratorcm_init(SysBusDevice *dev)
>      s->cm_init = 0x00000112;
>      s->cm_refcnt_offset = muldiv64(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), 24,
>                                     1000);
> -    memory_region_init_ram(&s->flash, OBJECT(s), "integrator.flash", 0x100000);
> +    memory_region_init_ram(&s->flash, OBJECT(s), "integrator.flash", 0x100000,
> +                           &error_abort);
>      vmstate_register_ram_global(&s->flash);
>
>      memory_region_init_io(&s->iomem, OBJECT(s), &integratorcm_ops, s,
> @@ -485,7 +486,7 @@ static void integratorcp_init(MachineState *machine)
>          exit(1);
>      }
>
> -    memory_region_init_ram(ram, NULL, "integrator.ram", ram_size);
> +    memory_region_init_ram(ram, NULL, "integrator.ram", ram_size, &error_abort);
>      vmstate_register_ram_global(ram);
>      /* ??? On a real system the first 1Mb is mapped as SSRAM or boot flash.  */
>      /* ??? RAM should repeat to fill physical memory space.  */
> diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
> index 0555d12..94ceab6 100644
> --- a/hw/arm/kzm.c
> +++ b/hw/arm/kzm.c
> @@ -97,14 +97,14 @@ static void kzm_init(MachineState *machine)
>
>      /* On a real system, the first 16k is a `secure boot rom' */
>
> -    memory_region_init_ram(ram, NULL, "kzm.ram", ram_size);
> +    memory_region_init_ram(ram, NULL, "kzm.ram", ram_size, &error_abort);
>      vmstate_register_ram_global(ram);
>      memory_region_add_subregion(address_space_mem, KZM_RAMADDRESS, ram);
>
>      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_init_ram(sram, NULL, "kzm.sram", 0x4000);
> +    memory_region_init_ram(sram, NULL, "kzm.sram", 0x4000, &error_abort);
>      memory_region_add_subregion(address_space_mem, 0x1FFFC000, sram);
>
>      dev = sysbus_create_varargs("imx_avic", 0x68000000,
> diff --git a/hw/arm/mainstone.c b/hw/arm/mainstone.c
> index 44f1873..2f1d618 100644
> --- a/hw/arm/mainstone.c
> +++ b/hw/arm/mainstone.c
> @@ -123,7 +123,8 @@ static void mainstone_common_init(MemoryRegion *address_space_mem,
>
>      /* Setup CPU & memory */
>      mpu = pxa270_init(address_space_mem, mainstone_binfo.ram_size, cpu_model);
> -    memory_region_init_ram(rom, NULL, "mainstone.rom", MAINSTONE_ROM);
> +    memory_region_init_ram(rom, NULL, "mainstone.rom", MAINSTONE_ROM,
> +                           &error_abort);
>      vmstate_register_ram_global(rom);
>      memory_region_set_readonly(rom, true);
>      memory_region_add_subregion(address_space_mem, 0, rom);
> diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
> index 6a134f2..c541455 100644
> --- a/hw/arm/musicpal.c
> +++ b/hw/arm/musicpal.c
> @@ -1601,11 +1601,13 @@ static void musicpal_init(MachineState *machine)
>      }
>
>      /* For now we use a fixed - the original - RAM size */
> -    memory_region_init_ram(ram, NULL, "musicpal.ram", MP_RAM_DEFAULT_SIZE);
> +    memory_region_init_ram(ram, NULL, "musicpal.ram", MP_RAM_DEFAULT_SIZE,
> +                           &error_abort);
>      vmstate_register_ram_global(ram);
>      memory_region_add_subregion(address_space_mem, 0, ram);
>
> -    memory_region_init_ram(sram, NULL, "musicpal.sram", MP_SRAM_SIZE);
> +    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);
>
> diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
> index e7cc5d7..306cf17 100644
> --- a/hw/arm/omap1.c
> +++ b/hw/arm/omap1.c
> @@ -3854,10 +3854,12 @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *system_memory,
>      omap_clk_init(s);
>
>      /* Memory-mapped stuff */
> -    memory_region_init_ram(&s->emiff_ram, NULL, "omap1.dram", s->sdram_size);
> +    memory_region_init_ram(&s->emiff_ram, NULL, "omap1.dram", s->sdram_size,
> +                           &error_abort);
>      vmstate_register_ram_global(&s->emiff_ram);
>      memory_region_add_subregion(system_memory, OMAP_EMIFF_BASE, &s->emiff_ram);
> -    memory_region_init_ram(&s->imif_ram, NULL, "omap1.sram", s->sram_size);
> +    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);
>
> diff --git a/hw/arm/omap2.c b/hw/arm/omap2.c
> index dc53a7a..d6e19ae 100644
> --- a/hw/arm/omap2.c
> +++ b/hw/arm/omap2.c
> @@ -2266,10 +2266,12 @@ struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sysmem,
>      omap_clk_init(s);
>
>      /* Memory-mapped stuff */
> -    memory_region_init_ram(&s->sdram, NULL, "omap2.dram", s->sdram_size);
> +    memory_region_init_ram(&s->sdram, NULL, "omap2.dram", s->sdram_size,
> +                           &error_abort);
>      vmstate_register_ram_global(&s->sdram);
>      memory_region_add_subregion(sysmem, OMAP2_Q2_BASE, &s->sdram);
> -    memory_region_init_ram(&s->sram, NULL, "omap2.sram", s->sram_size);
> +    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);
>
> diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
> index b4f6da6..320b39c 100644
> --- a/hw/arm/omap_sx1.c
> +++ b/hw/arm/omap_sx1.c
> @@ -122,7 +122,8 @@ static void sx1_init(MachineState *machine, const int version)
>                             machine->cpu_model);
>
>      /* External Flash (EMIFS) */
> -    memory_region_init_ram(flash, NULL, "omap_sx1.flash0-0", flash_size);
> +    memory_region_init_ram(flash, NULL, "omap_sx1.flash0-0", flash_size,
> +                           &error_abort);
>      vmstate_register_ram_global(flash);
>      memory_region_set_readonly(flash, true);
>      memory_region_add_subregion(address_space, OMAP_CS0_BASE, flash);
> @@ -164,7 +165,8 @@ static void sx1_init(MachineState *machine, const int version)
>
>      if ((version == 1) &&
>              (dinfo = drive_get(IF_PFLASH, 0, fl_idx)) != NULL) {
> -        memory_region_init_ram(flash_1, NULL, "omap_sx1.flash1-0", flash1_size);
> +        memory_region_init_ram(flash_1, NULL, "omap_sx1.flash1-0", flash1_size,
> +                               &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);
> diff --git a/hw/arm/palm.c b/hw/arm/palm.c
> index e61995f..7f1cfb8 100644
> --- a/hw/arm/palm.c
> +++ b/hw/arm/palm.c
> @@ -212,7 +212,8 @@ static void palmte_init(MachineState *machine)
>      mpu = omap310_mpu_init(address_space_mem, sdram_size, cpu_model);
>
>      /* External Flash (EMIFS) */
> -    memory_region_init_ram(flash, NULL, "palmte.flash", flash_size);
> +    memory_region_init_ram(flash, NULL, "palmte.flash", flash_size,
> +                           &error_abort);
>      vmstate_register_ram_global(flash);
>      memory_region_set_readonly(flash, true);
>      memory_region_add_subregion(address_space_mem, OMAP_CS0_BASE, flash);
> diff --git a/hw/arm/pxa2xx.c b/hw/arm/pxa2xx.c
> index 557e0f1..7d306fb 100644
> --- a/hw/arm/pxa2xx.c
> +++ b/hw/arm/pxa2xx.c
> @@ -2055,10 +2055,12 @@ PXA2xxState *pxa270_init(MemoryRegion *address_space,
>      s->reset = qemu_allocate_irq(pxa2xx_reset, s, 0);
>
>      /* SDRAM & Internal Memory Storage */
> -    memory_region_init_ram(&s->sdram, NULL, "pxa270.sdram", sdram_size);
> +    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_init_ram(&s->internal, NULL, "pxa270.internal", 0x40000);
> +    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);
> @@ -2186,11 +2188,12 @@ PXA2xxState *pxa255_init(MemoryRegion *address_space, unsigned int sdram_size)
>      s->reset = qemu_allocate_irq(pxa2xx_reset, s, 0);
>
>      /* SDRAM & Internal Memory Storage */
> -    memory_region_init_ram(&s->sdram, NULL, "pxa255.sdram", 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_init_ram(&s->internal, NULL, "pxa255.internal",
> -                           PXA2XX_INTERNAL_SIZE);
> +                           PXA2XX_INTERNAL_SIZE, &error_abort);
>      vmstate_register_ram_global(&s->internal);
>      memory_region_add_subregion(address_space, PXA2XX_INTERNAL_BASE,
>                                  &s->internal);
> diff --git a/hw/arm/realview.c b/hw/arm/realview.c
> index 64b9251..8bd3ff6 100644
> --- a/hw/arm/realview.c
> +++ b/hw/arm/realview.c
> @@ -137,12 +137,14 @@ static void realview_init(MachineState *machine,
>          /* Core tile RAM.  */
>          low_ram_size = ram_size - 0x20000000;
>          ram_size = 0x20000000;
> -        memory_region_init_ram(ram_lo, NULL, "realview.lowmem", low_ram_size);
> +        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_init_ram(ram_hi, NULL, "realview.highmem", ram_size);
> +    memory_region_init_ram(ram_hi, NULL, "realview.highmem", ram_size,
> +                           &error_abort);
>      vmstate_register_ram_global(ram_hi);
>      low_ram_size = ram_size;
>      if (low_ram_size > 0x10000000)
> @@ -337,7 +339,8 @@ static void realview_init(MachineState *machine,
>         startup code.  I guess this works on real hardware because the
>         BootROM happens to be in ROM/flash or in memory that isn't clobbered
>         until after Linux boots the secondary CPUs.  */
> -    memory_region_init_ram(ram_hack, NULL, "realview.hack", 0x1000);
> +    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);
>
> diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
> index 03cc6ce..9260896 100644
> --- a/hw/arm/spitz.c
> +++ b/hw/arm/spitz.c
> @@ -912,7 +912,7 @@ static void spitz_common_init(MachineState *machine,
>
>      sl_flash_register(mpu, (model == spitz) ? FLASH_128M : FLASH_1024M);
>
> -    memory_region_init_ram(rom, NULL, "spitz.rom", SPITZ_ROM);
> +    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);
> diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c
> index 9e2a0d4..3206345 100644
> --- a/hw/arm/strongarm.c
> +++ b/hw/arm/strongarm.c
> @@ -1604,7 +1604,8 @@ StrongARMState *sa1110_init(MemoryRegion *sysmem,
>          exit(1);
>      }
>
> -    memory_region_init_ram(&s->sdram, NULL, "strongarm.sdram", sdram_size);
> +    memory_region_init_ram(&s->sdram, NULL, "strongarm.sdram", sdram_size,
> +                           &error_abort);
>      vmstate_register_ram_global(&s->sdram);
>      memory_region_add_subregion(sysmem, SA_SDCS0, &s->sdram);
>
> diff --git a/hw/arm/tosa.c b/hw/arm/tosa.c
> index abc0f2a..6c574bc 100644
> --- a/hw/arm/tosa.c
> +++ b/hw/arm/tosa.c
> @@ -228,7 +228,7 @@ static void tosa_init(MachineState *machine)
>
>      mpu = pxa255_init(address_space_mem, tosa_binfo.ram_size);
>
> -    memory_region_init_ram(rom, NULL, "tosa.rom", TOSA_ROM);
> +    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);
> diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
> index dea5fc7..7696be1 100644
> --- a/hw/arm/versatilepb.c
> +++ b/hw/arm/versatilepb.c
> @@ -198,7 +198,8 @@ static void versatile_init(MachineState *machine, int board_id)
>          fprintf(stderr, "Unable to find CPU definition\n");
>          exit(1);
>      }
> -    memory_region_init_ram(ram, NULL, "versatile.ram", machine->ram_size);
> +    memory_region_init_ram(ram, NULL, "versatile.ram", machine->ram_size,
> +                           &error_abort);
>      vmstate_register_ram_global(ram);
>      /* ??? RAM should repeat to fill physical memory space.  */
>      /* SDRAM at address zero.  */
> diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
> index a88732c..aed218f 100644
> --- a/hw/arm/vexpress.c
> +++ b/hw/arm/vexpress.c
> @@ -252,7 +252,8 @@ static void a9_daughterboard_init(const VEDBoardInfo *daughterboard,
>          exit(1);
>      }
>
> -    memory_region_init_ram(ram, NULL, "vexpress.highmem", ram_size);
> +    memory_region_init_ram(ram, NULL, "vexpress.highmem", ram_size,
> +                           &error_abort);
>      vmstate_register_ram_global(ram);
>      low_ram_size = ram_size;
>      if (low_ram_size > 0x4000000) {
> @@ -346,7 +347,8 @@ static void a15_daughterboard_init(const VEDBoardInfo *daughterboard,
>          }
>      }
>
> -    memory_region_init_ram(ram, NULL, "vexpress.highmem", ram_size);
> +    memory_region_init_ram(ram, NULL, "vexpress.highmem", ram_size,
> +                           &error_abort);
>      vmstate_register_ram_global(ram);
>      /* RAM is from 0x80000000 upwards; there is no low-memory alias for it. */
>      memory_region_add_subregion(sysmem, 0x80000000, ram);
> @@ -364,7 +366,8 @@ static void a15_daughterboard_init(const VEDBoardInfo *daughterboard,
>      /* 0x2b060000: SP805 watchdog: not modelled */
>      /* 0x2b0a0000: PL341 dynamic memory controller: not modelled */
>      /* 0x2e000000: system SRAM */
> -    memory_region_init_ram(sram, NULL, "vexpress.a15sram", 0x10000);
> +    memory_region_init_ram(sram, NULL, "vexpress.a15sram", 0x10000,
> +                           &error_abort);
>      vmstate_register_ram_global(sram);
>      memory_region_add_subregion(sysmem, 0x2e000000, sram);
>
> @@ -634,12 +637,14 @@ static void vexpress_common_init(VEDBoardInfo *daughterboard,
>      }
>
>      sram_size = 0x2000000;
> -    memory_region_init_ram(sram, NULL, "vexpress.sram", sram_size);
> +    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);
>
>      vram_size = 0x800000;
> -    memory_region_init_ram(vram, NULL, "vexpress.vram", vram_size);
> +    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);
>
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index ba94298..fa435e7 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -489,7 +489,8 @@ static void machvirt_init(MachineState *machine)
>      fdt_add_cpu_nodes(vbi);
>      fdt_add_psci_node(vbi);
>
> -    memory_region_init_ram(ram, NULL, "mach-virt.ram", machine->ram_size);
> +    memory_region_init_ram(ram, NULL, "mach-virt.ram", machine->ram_size,
> +                           &error_abort);
>      vmstate_register_ram_global(ram);
>      memory_region_add_subregion(sysmem, vbi->memmap[VIRT_MEM].base, ram);
>
> diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
> index ba5aa82..ad85c7a 100644
> --- a/hw/arm/xilinx_zynq.c
> +++ b/hw/arm/xilinx_zynq.c
> @@ -149,12 +149,14 @@ static void zynq_init(MachineState *machine)
>      }
>
>      /* DDR remapped to address zero.  */
> -    memory_region_init_ram(ext_ram, NULL, "zynq.ext_ram", ram_size);
> +    memory_region_init_ram(ext_ram, NULL, "zynq.ext_ram", ram_size,
> +                           &error_abort);
>      vmstate_register_ram_global(ext_ram);
>      memory_region_add_subregion(address_space_mem, 0, ext_ram);
>
>      /* 256K of on-chip memory */
> -    memory_region_init_ram(ocm_ram, NULL, "zynq.ocm_ram", 256 << 10);
> +    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);
>
> diff --git a/hw/block/onenand.c b/hw/block/onenand.c
> index 5388122..e48e585 100644
> --- a/hw/block/onenand.c
> +++ b/hw/block/onenand.c
> @@ -789,7 +789,7 @@ static int onenand_initfn(SysBusDevice *sbd)
>      s->otp = memset(g_malloc((64 + 2) << PAGE_SHIFT),
>                      0xff, (64 + 2) << PAGE_SHIFT);
>      memory_region_init_ram(&s->ram, OBJECT(s), "onenand.ram",
> -                           0xc000 << s->shift);
> +                           0xc000 << s->shift, &error_abort);
>      vmstate_register_ram_global(&s->ram);
>      ram = memory_region_get_ram_ptr(&s->ram);
>      s->boot[0] = ram + (0x0000 << s->shift);
> diff --git a/hw/core/loader.c b/hw/core/loader.c
> index 2bf6b8f..7eb8277 100644
> --- a/hw/core/loader.c
> +++ b/hw/core/loader.c
> @@ -632,7 +632,7 @@ static void *rom_set_mr(Rom *rom, Object *owner, const char *name)
>      void *data;
>
>      rom->mr = g_malloc(sizeof(*rom->mr));
> -    memory_region_init_ram(rom->mr, owner, name, rom->datasize);
> +    memory_region_init_ram(rom->mr, owner, name, rom->datasize, &error_abort);
>      memory_region_set_readonly(rom->mr, true);
>      vmstate_register_ram_global(rom->mr);
>
> diff --git a/hw/cris/axis_dev88.c b/hw/cris/axis_dev88.c
> index 1849338..2fb3aa8 100644
> --- a/hw/cris/axis_dev88.c
> +++ b/hw/cris/axis_dev88.c
> @@ -270,13 +270,15 @@ void axisdev88_init(MachineState *machine)
>      env = &cpu->env;
>
>      /* allocate RAM */
> -    memory_region_init_ram(phys_ram, NULL, "axisdev88.ram", ram_size);
> +    memory_region_init_ram(phys_ram, NULL, "axisdev88.ram", ram_size,
> +                           &error_abort);
>      vmstate_register_ram_global(phys_ram);
>      memory_region_add_subregion(address_space_mem, 0x40000000, phys_ram);
>
>      /* 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);
> +    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);
>
> diff --git a/hw/display/cg3.c b/hw/display/cg3.c
> index 65ef7a7..1e6ff2b 100644
> --- a/hw/display/cg3.c
> +++ b/hw/display/cg3.c
> @@ -279,7 +279,8 @@ static void cg3_initfn(Object *obj)
>      SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
>      CG3State *s = CG3(obj);
>
> -    memory_region_init_ram(&s->rom, NULL, "cg3.prom", FCODE_MAX_ROM_SIZE);
> +    memory_region_init_ram(&s->rom, NULL, "cg3.prom", FCODE_MAX_ROM_SIZE,
> +                           &error_abort);
>      memory_region_set_readonly(&s->rom, true);
>      sysbus_init_mmio(sbd, &s->rom);
>
> @@ -306,7 +307,8 @@ static void cg3_realizefn(DeviceState *dev, Error **errp)
>          }
>      }
>
> -    memory_region_init_ram(&s->vram_mem, NULL, "cg3.vram", s->vram_size);
> +    memory_region_init_ram(&s->vram_mem, NULL, "cg3.vram", s->vram_size,
> +                           &error_abort);
>      vmstate_register_ram_global(&s->vram_mem);
>      sysbus_init_mmio(sbd, &s->vram_mem);
>
> diff --git a/hw/display/qxl.c b/hw/display/qxl.c
> index d43aa49..3a721b1 100644
> --- a/hw/display/qxl.c
> +++ b/hw/display/qxl.c
> @@ -1979,14 +1979,14 @@ static int qxl_init_common(PCIQXLDevice *qxl)
>
>      qxl->rom_size = qxl_rom_size();
>      memory_region_init_ram(&qxl->rom_bar, OBJECT(qxl), "qxl.vrom",
> -                           qxl->rom_size);
> +                           qxl->rom_size, &error_abort);
>      vmstate_register_ram(&qxl->rom_bar, &qxl->pci.qdev);
>      init_qxl_rom(qxl);
>      init_qxl_ram(qxl);
>
>      qxl->guest_surfaces.cmds = g_new0(QXLPHYSICAL, qxl->ssd.num_surfaces);
>      memory_region_init_ram(&qxl->vram_bar, OBJECT(qxl), "qxl.vram",
> -                           qxl->vram_size);
> +                           qxl->vram_size, &error_abort);
>      vmstate_register_ram(&qxl->vram_bar, &qxl->pci.qdev);
>      memory_region_init_alias(&qxl->vram32_bar, OBJECT(qxl), "qxl.vram32",
>                               &qxl->vram_bar, 0, qxl->vram32_size);
> @@ -2094,7 +2094,7 @@ static int qxl_init_secondary(PCIDevice *dev)
>      qxl->id = device_id++;
>      qxl_init_ramsize(qxl);
>      memory_region_init_ram(&qxl->vga.vram, OBJECT(dev), "qxl.vgavram",
> -                           qxl->vga.vram_size);
> +                           qxl->vga.vram_size, &error_abort);
>      vmstate_register_ram(&qxl->vga.vram, &qxl->pci.qdev);
>      qxl->vga.vram_ptr = memory_region_get_ram_ptr(&qxl->vga.vram);
>      qxl->vga.con = graphic_console_init(DEVICE(dev), 0, &qxl_ops, qxl);
> diff --git a/hw/display/sm501.c b/hw/display/sm501.c
> index eedf2d4..c72154b 100644
> --- a/hw/display/sm501.c
> +++ b/hw/display/sm501.c
> @@ -1410,7 +1410,7 @@ void sm501_init(MemoryRegion *address_space_mem, uint32_t base,
>
>      /* allocate local memory */
>      memory_region_init_ram(&s->local_mem_region, NULL, "sm501.local",
> -                           local_mem_bytes);
> +                           local_mem_bytes, &error_abort);
>      vmstate_register_ram_global(&s->local_mem_region);
>      s->local_mem = memory_region_get_ram_ptr(&s->local_mem_region);
>      memory_region_add_subregion(address_space_mem, base, &s->local_mem_region);
> diff --git a/hw/display/tc6393xb.c b/hw/display/tc6393xb.c
> index f4011d2..c19c055 100644
> --- a/hw/display/tc6393xb.c
> +++ b/hw/display/tc6393xb.c
> @@ -581,7 +581,8 @@ TC6393xbState *tc6393xb_init(MemoryRegion *sysmem, uint32_t base, qemu_irq irq)
>      memory_region_init_io(&s->iomem, NULL, &tc6393xb_ops, s, "tc6393xb", 0x10000);
>      memory_region_add_subregion(sysmem, base, &s->iomem);
>
> -    memory_region_init_ram(&s->vram, NULL, "tc6393xb.vram", 0x100000);
> +    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);
> diff --git a/hw/display/tcx.c b/hw/display/tcx.c
> index 28c742c..b1cd2a9 100644
> --- a/hw/display/tcx.c
> +++ b/hw/display/tcx.c
> @@ -535,7 +535,8 @@ static void tcx_initfn(Object *obj)
>      SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
>      TCXState *s = TCX(obj);
>
> -    memory_region_init_ram(&s->rom, NULL, "tcx.prom", FCODE_MAX_ROM_SIZE);
> +    memory_region_init_ram(&s->rom, NULL, "tcx.prom", FCODE_MAX_ROM_SIZE,
> +                           &error_abort);
>      memory_region_set_readonly(&s->rom, true);
>      sysbus_init_mmio(sbd, &s->rom);
>
> @@ -567,7 +568,7 @@ static void tcx_realizefn(DeviceState *dev, Error **errp)
>      char *fcode_filename;
>
>      memory_region_init_ram(&s->vram_mem, OBJECT(s), "tcx.vram",
> -                           s->vram_size * (1 + 4 + 4));
> +                           s->vram_size * (1 + 4 + 4), &error_abort);
>      vmstate_register_ram_global(&s->vram_mem);
>      vram_base = memory_region_get_ram_ptr(&s->vram_mem);
>
> diff --git a/hw/display/vga.c b/hw/display/vga.c
> index 4b089a3..8edcbb2 100644
> --- a/hw/display/vga.c
> +++ b/hw/display/vga.c
> @@ -2291,7 +2291,8 @@ void vga_common_init(VGACommonState *s, Object *obj, bool global_vmstate)
>      s->vram_size_mb = s->vram_size >> 20;
>
>      s->is_vbe_vmstate = 1;
> -    memory_region_init_ram(&s->vram, obj, "vga.vram", s->vram_size);
> +    memory_region_init_ram(&s->vram, obj, "vga.vram", s->vram_size,
> +                           &error_abort);
>      vmstate_register_ram(&s->vram, global_vmstate ? NULL : DEVICE(obj));
>      xen_register_framebuffer(&s->vram);
>      s->vram_ptr = memory_region_get_ram_ptr(&s->vram);
> diff --git a/hw/display/vmware_vga.c b/hw/display/vmware_vga.c
> index 591b645..32026e4 100644
> --- a/hw/display/vmware_vga.c
> +++ b/hw/display/vmware_vga.c
> @@ -1201,7 +1201,8 @@ static void vmsvga_init(DeviceState *dev, struct vmsvga_state_s *s,
>      s->vga.con = graphic_console_init(dev, 0, &vmsvga_ops, s);
>
>      s->fifo_size = SVGA_FIFO_SIZE;
> -    memory_region_init_ram(&s->fifo_ram, NULL, "vmsvga.fifo", s->fifo_size);
> +    memory_region_init_ram(&s->fifo_ram, NULL, "vmsvga.fifo", s->fifo_size,
> +                           &error_abort);
>      vmstate_register_ram_global(&s->fifo_ram);
>      s->fifo_ptr = memory_region_get_ram_ptr(&s->fifo_ram);
>
> diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c
> index de33657..5dcd2d5 100644
> --- a/hw/i386/kvm/pci-assign.c
> +++ b/hw/i386/kvm/pci-assign.c
> @@ -1943,7 +1943,8 @@ static void assigned_dev_load_option_rom(AssignedDevice *dev)
>
>      snprintf(name, sizeof(name), "%s.rom",
>              object_get_typename(OBJECT(dev)));
> -    memory_region_init_ram(&dev->dev.rom, OBJECT(dev), name, st.st_size);
> +    memory_region_init_ram(&dev->dev.rom, OBJECT(dev), name, st.st_size,
> +                           &error_abort);
>      vmstate_register_ram(&dev->dev.rom, &dev->dev.qdev);
>      ptr = memory_region_get_ram_ptr(&dev->dev.rom);
>      memset(ptr, 0xff, st.st_size);
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index 9e58982..d90f161 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1297,7 +1297,8 @@ FWCfgState *pc_memory_init(MachineState *machine,
>      pc_system_firmware_init(rom_memory, guest_info->isapc_ram_fw);
>
>      option_rom_mr = g_malloc(sizeof(*option_rom_mr));
> -    memory_region_init_ram(option_rom_mr, NULL, "pc.rom", PC_ROM_SIZE);
> +    memory_region_init_ram(option_rom_mr, NULL, "pc.rom", PC_ROM_SIZE,
> +                           &error_abort);
>      vmstate_register_ram_global(option_rom_mr);
>      memory_region_add_subregion_overlap(rom_memory,
>                                          PC_ROM_MIN_VGA,
> diff --git a/hw/i386/pc_sysfw.c b/hw/i386/pc_sysfw.c
> index 75a7ebb..bbe367a 100644
> --- a/hw/i386/pc_sysfw.c
> +++ b/hw/i386/pc_sysfw.c
> @@ -55,7 +55,8 @@ static void pc_isa_bios_init(MemoryRegion *rom_memory,
>      /* map the last 128KB of the BIOS in ISA space */
>      isa_bios_size = MIN(flash_size, 128 * 1024);
>      isa_bios = g_malloc(sizeof(*isa_bios));
> -    memory_region_init_ram(isa_bios, NULL, "isa-bios", isa_bios_size);
> +    memory_region_init_ram(isa_bios, NULL, "isa-bios", isa_bios_size,
> +                           &error_abort);
>      vmstate_register_ram_global(isa_bios);
>      memory_region_add_subregion_overlap(rom_memory,
>                                          0x100000 - isa_bios_size,
> @@ -192,7 +193,7 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory, bool isapc_ram_fw)
>          goto bios_error;
>      }
>      bios = g_malloc(sizeof(*bios));
> -    memory_region_init_ram(bios, NULL, "pc.bios", bios_size);
> +    memory_region_init_ram(bios, NULL, "pc.bios", bios_size, &error_abort);
>      vmstate_register_ram_global(bios);
>      if (!isapc_ram_fw) {
>          memory_region_set_readonly(bios, true);
> diff --git a/hw/input/milkymist-softusb.c b/hw/input/milkymist-softusb.c
> index 1b4b8d4..5a427f0 100644
> --- a/hw/input/milkymist-softusb.c
> +++ b/hw/input/milkymist-softusb.c
> @@ -250,12 +250,12 @@ static int milkymist_softusb_init(SysBusDevice *dev)
>
>      /* register pmem and dmem */
>      memory_region_init_ram(&s->pmem, OBJECT(s), "milkymist-softusb.pmem",
> -                           s->pmem_size);
> +                           s->pmem_size, &error_abort);
>      vmstate_register_ram_global(&s->pmem);
>      s->pmem_ptr = memory_region_get_ram_ptr(&s->pmem);
>      sysbus_init_mmio(dev, &s->pmem);
>      memory_region_init_ram(&s->dmem, OBJECT(s), "milkymist-softusb.dmem",
> -                           s->dmem_size);
> +                           s->dmem_size, &error_abort);
>      vmstate_register_ram_global(&s->dmem);
>      s->dmem_ptr = memory_region_get_ram_ptr(&s->dmem);
>      sysbus_init_mmio(dev, &s->dmem);
> diff --git a/hw/lm32/lm32_boards.c b/hw/lm32/lm32_boards.c
> index 0e01340..5ae6cad 100644
> --- a/hw/lm32/lm32_boards.c
> +++ b/hw/lm32/lm32_boards.c
> @@ -111,7 +111,8 @@ static void lm32_evr_init(MachineState *machine)
>
>      reset_info->flash_base = flash_base;
>
> -    memory_region_init_ram(phys_ram, NULL, "lm32_evr.sdram", ram_size);
> +    memory_region_init_ram(phys_ram, NULL, "lm32_evr.sdram", ram_size,
> +                           &error_abort);
>      vmstate_register_ram_global(phys_ram);
>      memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
>
> @@ -213,7 +214,8 @@ static void lm32_uclinux_init(MachineState *machine)
>
>      reset_info->flash_base = flash_base;
>
> -    memory_region_init_ram(phys_ram, NULL, "lm32_uclinux.sdram", ram_size);
> +    memory_region_init_ram(phys_ram, NULL, "lm32_uclinux.sdram", ram_size,
> +                           &error_abort);
>      vmstate_register_ram_global(phys_ram);
>      memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
>
> diff --git a/hw/lm32/milkymist.c b/hw/lm32/milkymist.c
> index 81c3933..c8832f0 100644
> --- a/hw/lm32/milkymist.c
> +++ b/hw/lm32/milkymist.c
> @@ -118,7 +118,8 @@ milkymist_init(MachineState *machine)
>
>      cpu_lm32_set_phys_msb_ignore(env, 1);
>
> -    memory_region_init_ram(phys_sdram, NULL, "milkymist.sdram", sdram_size);
> +    memory_region_init_ram(phys_sdram, NULL, "milkymist.sdram", sdram_size,
> +                           &error_abort);
>      vmstate_register_ram_global(phys_sdram);
>      memory_region_add_subregion(address_space_mem, sdram_base, phys_sdram);
>
> diff --git a/hw/m68k/an5206.c b/hw/m68k/an5206.c
> index 684496a..a9ac270 100644
> --- a/hw/m68k/an5206.c
> +++ b/hw/m68k/an5206.c
> @@ -50,12 +50,12 @@ static void an5206_init(MachineState *machine)
>      env->rambar0 = AN5206_RAMBAR_ADDR | 1;
>
>      /* DRAM at address zero */
> -    memory_region_init_ram(ram, NULL, "an5206.ram", ram_size);
> +    memory_region_init_ram(ram, NULL, "an5206.ram", ram_size, &error_abort);
>      vmstate_register_ram_global(ram);
>      memory_region_add_subregion(address_space_mem, 0, ram);
>
>      /* Internal SRAM.  */
> -    memory_region_init_ram(sram, NULL, "an5206.sram", 512);
> +    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);
>
> diff --git a/hw/m68k/dummy_m68k.c b/hw/m68k/dummy_m68k.c
> index 6db1b71..957ef82 100644
> --- a/hw/m68k/dummy_m68k.c
> +++ b/hw/m68k/dummy_m68k.c
> @@ -40,7 +40,7 @@ static void dummy_m68k_init(MachineState *machine)
>      env->vbr = 0;
>
>      /* RAM at address zero */
> -    memory_region_init_ram(ram, NULL, "dummy_m68k.ram", ram_size);
> +    memory_region_init_ram(ram, NULL, "dummy_m68k.ram", ram_size, &error_abort);
>      vmstate_register_ram_global(ram);
>      memory_region_add_subregion(address_space_mem, 0, ram);
>
> diff --git a/hw/m68k/mcf5208.c b/hw/m68k/mcf5208.c
> index 2ef617f..188230f 100644
> --- a/hw/m68k/mcf5208.c
> +++ b/hw/m68k/mcf5208.c
> @@ -218,12 +218,12 @@ static void mcf5208evb_init(MachineState *machine)
>      /* TODO: Configure BARs.  */
>
>      /* DRAM at 0x40000000 */
> -    memory_region_init_ram(ram, NULL, "mcf5208.ram", ram_size);
> +    memory_region_init_ram(ram, NULL, "mcf5208.ram", ram_size, &error_abort);
>      vmstate_register_ram_global(ram);
>      memory_region_add_subregion(address_space_mem, 0x40000000, ram);
>
>      /* Internal SRAM.  */
> -    memory_region_init_ram(sram, NULL, "mcf5208.sram", 16384);
> +    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);
>
> diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
> index aea9c5b..60c79c7 100644
> --- a/hw/microblaze/petalogix_ml605_mmu.c
> +++ b/hw/microblaze/petalogix_ml605_mmu.c
> @@ -100,11 +100,12 @@ petalogix_ml605_init(MachineState *machine)
>
>      /* Attach emulated BRAM through the LMB.  */
>      memory_region_init_ram(phys_lmb_bram, NULL, "petalogix_ml605.lmb_bram",
> -                           LMB_BRAM_SIZE);
> +                           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_init_ram(phys_ram, NULL, "petalogix_ml605.ram", ram_size);
> +    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, ddr_base, phys_ram);
>
> diff --git a/hw/microblaze/petalogix_s3adsp1800_mmu.c b/hw/microblaze/petalogix_s3adsp1800_mmu.c
> index 49dc6d1..8e0fca9 100644
> --- a/hw/microblaze/petalogix_s3adsp1800_mmu.c
> +++ b/hw/microblaze/petalogix_s3adsp1800_mmu.c
> @@ -81,11 +81,13 @@ petalogix_s3adsp1800_init(MachineState *machine)
>
>      /* Attach emulated BRAM through the LMB.  */
>      memory_region_init_ram(phys_lmb_bram, NULL,
> -                           "petalogix_s3adsp1800.lmb_bram", LMB_BRAM_SIZE);
> +                           "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_init_ram(phys_ram, NULL, "petalogix_s3adsp1800.ram", ram_size);
> +    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);
>
> diff --git a/hw/mips/mips_fulong2e.c b/hw/mips/mips_fulong2e.c
> index f7533ed..be286da 100644
> --- a/hw/mips/mips_fulong2e.c
> +++ b/hw/mips/mips_fulong2e.c
> @@ -302,9 +302,10 @@ static void mips_fulong2e_init(MachineState *machine)
>      bios_size = 1024 * 1024;
>
>      /* allocate RAM */
> -    memory_region_init_ram(ram, NULL, "fulong2e.ram", ram_size);
> +    memory_region_init_ram(ram, NULL, "fulong2e.ram", ram_size, &error_abort);
>      vmstate_register_ram_global(ram);
> -    memory_region_init_ram(bios, NULL, "fulong2e.bios", bios_size);
> +    memory_region_init_ram(bios, NULL, "fulong2e.bios", bios_size,
> +                           &error_abort);
>      vmstate_register_ram_global(bios);
>      memory_region_set_readonly(bios, true);
>
> diff --git a/hw/mips/mips_jazz.c b/hw/mips/mips_jazz.c
> index c113a80..6c31cb8 100644
> --- a/hw/mips/mips_jazz.c
> +++ b/hw/mips/mips_jazz.c
> @@ -179,11 +179,12 @@ static void mips_jazz_init(MemoryRegion *address_space,
>      cc->do_unassigned_access = mips_jazz_do_unassigned_access;
>
>      /* allocate RAM */
> -    memory_region_init_ram(ram, NULL, "mips_jazz.ram", ram_size);
> +    memory_region_init_ram(ram, NULL, "mips_jazz.ram", ram_size, &error_abort);
>      vmstate_register_ram_global(ram);
>      memory_region_add_subregion(address_space, 0, ram);
>
> -    memory_region_init_ram(bios, NULL, "mips_jazz.bios", MAGNUM_BIOS_SIZE);
> +    memory_region_init_ram(bios, NULL, "mips_jazz.bios", MAGNUM_BIOS_SIZE,
> +                           &error_abort);
>      vmstate_register_ram_global(bios);
>      memory_region_set_readonly(bios, true);
>      memory_region_init_alias(bios2, NULL, "mips_jazz.bios", bios,
> @@ -244,7 +245,8 @@ static void mips_jazz_init(MemoryRegion *address_space,
>          {
>              /* Simple ROM, so user doesn't have to provide one */
>              MemoryRegion *rom_mr = g_new(MemoryRegion, 1);
> -            memory_region_init_ram(rom_mr, NULL, "g364fb.rom", 0x80000);
> +            memory_region_init_ram(rom_mr, NULL, "g364fb.rom", 0x80000,
> +                                   &error_abort);
>              vmstate_register_ram_global(rom_mr);
>              memory_region_set_readonly(rom_mr, true);
>              uint8_t *rom = memory_region_get_ram_ptr(rom_mr);
> diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c
> index cfb60af..2d87de9 100644
> --- a/hw/mips/mips_malta.c
> +++ b/hw/mips/mips_malta.c
> @@ -992,7 +992,8 @@ void mips_malta_init(MachineState *machine)
>      }
>
>      /* register RAM at high address where it is undisturbed by IO */
> -    memory_region_init_ram(ram_high, NULL, "mips_malta.ram", ram_size);
> +    memory_region_init_ram(ram_high, NULL, "mips_malta.ram", ram_size,
> +                           &error_abort);
>      vmstate_register_ram_global(ram_high);
>      memory_region_add_subregion(system_memory, 0x80000000, ram_high);
>
> @@ -1116,7 +1117,8 @@ void mips_malta_init(MachineState *machine)
>       * handled by an overlapping region as the resulting ROM code subpage
>       * regions are not executable.
>       */
> -    memory_region_init_ram(bios_copy, NULL, "bios.1fc", BIOS_SIZE);
> +    memory_region_init_ram(bios_copy, NULL, "bios.1fc", BIOS_SIZE,
> +                           &error_abort);
>      if (!rom_copy(memory_region_get_ram_ptr(bios_copy),
>                    FLASH_ADDRESS, BIOS_SIZE)) {
>          memcpy(memory_region_get_ram_ptr(bios_copy),
> diff --git a/hw/mips/mips_mipssim.c b/hw/mips/mips_mipssim.c
> index 413e64d..7ea0b9a 100644
> --- a/hw/mips/mips_mipssim.c
> +++ b/hw/mips/mips_mipssim.c
> @@ -171,9 +171,11 @@ mips_mipssim_init(MachineState *machine)
>      qemu_register_reset(main_cpu_reset, reset_info);
>
>      /* Allocate RAM. */
> -    memory_region_init_ram(ram, NULL, "mips_mipssim.ram", ram_size);
> +    memory_region_init_ram(ram, NULL, "mips_mipssim.ram", ram_size,
> +                           &error_abort);
>      vmstate_register_ram_global(ram);
> -    memory_region_init_ram(bios, NULL, "mips_mipssim.bios", BIOS_SIZE);
> +    memory_region_init_ram(bios, NULL, "mips_mipssim.bios", BIOS_SIZE,
> +                           &error_abort);
>      vmstate_register_ram_global(bios);
>      memory_region_set_readonly(bios, true);
>
> diff --git a/hw/mips/mips_r4k.c b/hw/mips/mips_r4k.c
> index 7120293..e219766 100644
> --- a/hw/mips/mips_r4k.c
> +++ b/hw/mips/mips_r4k.c
> @@ -204,7 +204,7 @@ void mips_r4k_init(MachineState *machine)
>                  ((unsigned int)ram_size / (1 << 20)));
>          exit(1);
>      }
> -    memory_region_init_ram(ram, NULL, "mips_r4k.ram", ram_size);
> +    memory_region_init_ram(ram, NULL, "mips_r4k.ram", ram_size, &error_abort);
>      vmstate_register_ram_global(ram);
>
>      memory_region_add_subregion(address_space_mem, 0, ram);
> @@ -231,7 +231,8 @@ void mips_r4k_init(MachineState *machine)
>  #endif
>      if ((bios_size > 0) && (bios_size <= BIOS_SIZE)) {
>          bios = g_new(MemoryRegion, 1);
> -        memory_region_init_ram(bios, NULL, "mips_r4k.bios", BIOS_SIZE);
> +        memory_region_init_ram(bios, NULL, "mips_r4k.bios", BIOS_SIZE,
> +                               &error_abort);
>          vmstate_register_ram_global(bios);
>          memory_region_set_readonly(bios, true);
>          memory_region_add_subregion(get_system_memory(), 0x1fc00000, bios);
> diff --git a/hw/moxie/moxiesim.c b/hw/moxie/moxiesim.c
> index 430f841..80bcc5b 100644
> --- a/hw/moxie/moxiesim.c
> +++ b/hw/moxie/moxiesim.c
> @@ -123,11 +123,11 @@ static void moxiesim_init(MachineState *machine)
>      qemu_register_reset(main_cpu_reset, cpu);
>
>      /* Allocate RAM. */
> -    memory_region_init_ram(ram, NULL, "moxiesim.ram", ram_size);
> +    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_init_ram(rom, NULL, "moxie.rom", 128*0x1000);
> +    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);
>
> diff --git a/hw/net/milkymist-minimac2.c b/hw/net/milkymist-minimac2.c
> index c023351..c632672 100644
> --- a/hw/net/milkymist-minimac2.c
> +++ b/hw/net/milkymist-minimac2.c
> @@ -472,7 +472,7 @@ static int milkymist_minimac2_init(SysBusDevice *sbd)
>
>      /* register buffers memory */
>      memory_region_init_ram(&s->buffers, OBJECT(dev), "milkymist-minimac2.buffers",
> -                           buffers_size);
> +                           buffers_size, &error_abort);
>      vmstate_register_ram_global(&s->buffers);
>      s->rx0_buf = memory_region_get_ram_ptr(&s->buffers);
>      s->rx1_buf = s->rx0_buf + MINIMAC2_BUFFER_SIZE;
> diff --git a/hw/openrisc/openrisc_sim.c b/hw/openrisc/openrisc_sim.c
> index b2b4f9b..c110033 100644
> --- a/hw/openrisc/openrisc_sim.c
> +++ b/hw/openrisc/openrisc_sim.c
> @@ -114,7 +114,7 @@ static void openrisc_sim_init(MachineState *machine)
>      }
>
>      ram = g_malloc(sizeof(*ram));
> -    memory_region_init_ram(ram, NULL, "openrisc.ram", ram_size);
> +    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);
>
> diff --git a/hw/pci-host/prep.c b/hw/pci-host/prep.c
> index ec6f186..1de3681 100644
> --- a/hw/pci-host/prep.c
> +++ b/hw/pci-host/prep.c
> @@ -299,7 +299,8 @@ static int raven_init(PCIDevice *d)
>      d->config[0x0D] = 0x10; // latency_timer
>      d->config[0x34] = 0x00; // capabilities_pointer
>
> -    memory_region_init_ram(&s->bios, OBJECT(s), "bios", BIOS_SIZE);
> +    memory_region_init_ram(&s->bios, OBJECT(s), "bios", BIOS_SIZE,
> +                           &error_abort);
>      memory_region_set_readonly(&s->bios, true);
>      memory_region_add_subregion(get_system_memory(), (uint32_t)(-BIOS_SIZE),
>                                  &s->bios);
> diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> index 351d320..3b11d59 100644
> --- a/hw/pci/pci.c
> +++ b/hw/pci/pci.c
> @@ -1974,7 +1974,7 @@ static int pci_add_option_rom(PCIDevice *pdev, bool is_default_rom)
>          snprintf(name, sizeof(name), "%s.rom", object_get_typename(OBJECT(pdev)));
>      }
>      pdev->has_rom = true;
> -    memory_region_init_ram(&pdev->rom, OBJECT(pdev), name, size);
> +    memory_region_init_ram(&pdev->rom, OBJECT(pdev), name, size, &error_abort);
>      vmstate_register_ram(&pdev->rom, &pdev->qdev);
>      ptr = memory_region_get_ram_ptr(&pdev->rom);
>      load_image(path, ptr);
> diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
> index f5bccd2..6b5392e 100644
> --- a/hw/ppc/mac_newworld.c
> +++ b/hw/ppc/mac_newworld.c
> @@ -204,7 +204,8 @@ static void ppc_core99_init(MachineState *machine)
>      memory_region_add_subregion(get_system_memory(), 0, ram);
>
>      /* allocate and load BIOS */
> -    memory_region_init_ram(bios, NULL, "ppc_core99.bios", BIOS_SIZE);
> +    memory_region_init_ram(bios, NULL, "ppc_core99.bios", BIOS_SIZE,
> +                           &error_abort);
>      vmstate_register_ram_global(bios);
>
>      if (bios_name == NULL)
> diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
> index cd9bdbc..1c5d9f4 100644
> --- a/hw/ppc/mac_oldworld.c
> +++ b/hw/ppc/mac_oldworld.c
> @@ -135,7 +135,8 @@ static void ppc_heathrow_init(MachineState *machine)
>      memory_region_add_subregion(sysmem, 0, ram);
>
>      /* allocate and load BIOS */
> -    memory_region_init_ram(bios, NULL, "ppc_heathrow.bios", BIOS_SIZE);
> +    memory_region_init_ram(bios, NULL, "ppc_heathrow.bios", BIOS_SIZE,
> +                           &error_abort);
>      vmstate_register_ram_global(bios);
>
>      if (bios_name == NULL)
> diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
> index 11d3379..18a4ec5 100644
> --- a/hw/ppc/ppc405_boards.c
> +++ b/hw/ppc/ppc405_boards.c
> @@ -214,7 +214,7 @@ static void ref405ep_init(MachineState *machine)
>                          33333333, &pic, kernel_filename == NULL ? 0 : 1);
>      /* allocate SRAM */
>      sram_size = 512 * 1024;
> -    memory_region_init_ram(sram, NULL, "ef405ep.sram", sram_size);
> +    memory_region_init_ram(sram, NULL, "ef405ep.sram", sram_size, &error_abort);
>      vmstate_register_ram_global(sram);
>      memory_region_add_subregion(sysmem, 0xFFF00000, sram);
>      /* allocate and load BIOS */
> @@ -246,7 +246,8 @@ static void ref405ep_init(MachineState *machine)
>          printf("Load BIOS from file\n");
>  #endif
>          bios = g_new(MemoryRegion, 1);
> -        memory_region_init_ram(bios, NULL, "ef405ep.bios", BIOS_SIZE);
> +        memory_region_init_ram(bios, NULL, "ef405ep.bios", BIOS_SIZE,
> +                               &error_abort);
>          vmstate_register_ram_global(bios);
>
>          if (bios_name == NULL)
> @@ -572,7 +573,8 @@ static void taihu_405ep_init(MachineState *machine)
>          if (bios_name == NULL)
>              bios_name = BIOS_FILENAME;
>          bios = g_new(MemoryRegion, 1);
> -        memory_region_init_ram(bios, NULL, "taihu_405ep.bios", BIOS_SIZE);
> +        memory_region_init_ram(bios, NULL, "taihu_405ep.bios", BIOS_SIZE,
> +                               &error_abort);
>          vmstate_register_ram_global(bios);
>          filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
>          if (filename) {
> diff --git a/hw/ppc/ppc405_uc.c b/hw/ppc/ppc405_uc.c
> index a73e918..c77434a 100644
> --- a/hw/ppc/ppc405_uc.c
> +++ b/hw/ppc/ppc405_uc.c
> @@ -974,7 +974,8 @@ static void ppc405_ocm_init(CPUPPCState *env)
>
>      ocm = g_malloc0(sizeof(ppc405_ocm_t));
>      /* XXX: Size is 4096 or 0x04000000 */
> -    memory_region_init_ram(&ocm->isarc_ram, NULL, "ppc405.ocm", 4096);
> +    memory_region_init_ram(&ocm->isarc_ram, NULL, "ppc405.ocm", 4096,
> +                           &error_abort);
>      vmstate_register_ram_global(&ocm->isarc_ram);
>      memory_region_init_alias(&ocm->dsarc_ram, NULL, "ppc405.dsarc", &ocm->isarc_ram,
>                               0, 4096);
> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
> index 42f5cec..2d7a868 100644
> --- a/hw/s390x/s390-virtio-ccw.c
> +++ b/hw/s390x/s390-virtio-ccw.c
> @@ -110,7 +110,7 @@ static void ccw_init(MachineState *machine)
>      virtio_ccw_register_hcalls();
>
>      /* allocate RAM */
> -    memory_region_init_ram(ram, NULL, "s390.ram", my_ram_size);
> +    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);
>
> diff --git a/hw/s390x/s390-virtio.c b/hw/s390x/s390-virtio.c
> index 93c7ace..62460d6 100644
> --- a/hw/s390x/s390-virtio.c
> +++ b/hw/s390x/s390-virtio.c
> @@ -256,7 +256,7 @@ static void s390_init(MachineState *machine)
>      s390_virtio_register_hcalls();
>
>      /* allocate RAM */
> -    memory_region_init_ram(ram, NULL, "s390.ram", my_ram_size);
> +    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);
>
> diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
> index 95c0246..321379e 100644
> --- a/hw/sh4/r2d.c
> +++ b/hw/sh4/r2d.c
> @@ -255,7 +255,7 @@ static void r2d_init(MachineState *machine)
>      qemu_register_reset(main_cpu_reset, reset_info);
>
>      /* Allocate memory space */
> -    memory_region_init_ram(sdram, NULL, "r2d.sdram", SDRAM_SIZE);
> +    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);
>      /* Register peripherals */
> diff --git a/hw/sh4/shix.c b/hw/sh4/shix.c
> index 7c152b4..f93f98e 100644
> --- a/hw/sh4/shix.c
> +++ b/hw/sh4/shix.c
> @@ -59,14 +59,16 @@ static void shix_init(MachineState *machine)
>      }
>
>      /* Allocate memory space */
> -    memory_region_init_ram(rom, NULL, "shix.rom", 0x4000);
> +    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_init_ram(&sdram[0], NULL, "shix.sdram1", 0x01000000);
> +    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_init_ram(&sdram[1], NULL, "shix.sdram2", 0x01000000);
> +    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]);
>
> diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
> index 827383b..751392e 100644
> --- a/hw/sparc/leon3.c
> +++ b/hw/sparc/leon3.c
> @@ -151,13 +151,13 @@ static void leon3_generic_hw_init(MachineState *machine)
>          exit(1);
>      }
>
> -    memory_region_init_ram(ram, NULL, "leon3.ram", ram_size);
> +    memory_region_init_ram(ram, NULL, "leon3.ram", ram_size, &error_abort);
>      vmstate_register_ram_global(ram);
>      memory_region_add_subregion(address_space_mem, 0x40000000, ram);
>
>      /* Allocate BIOS */
>      prom_size = 8 * 1024 * 1024; /* 8Mb */
> -    memory_region_init_ram(prom, NULL, "Leon3.bios", prom_size);
> +    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);
> diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
> index 67e3663..78f87a2 100644
> --- a/hw/sparc/sun4m.c
> +++ b/hw/sparc/sun4m.c
> @@ -621,7 +621,7 @@ static int idreg_init1(SysBusDevice *dev)
>      IDRegState *s = MACIO_ID_REGISTER(dev);
>
>      memory_region_init_ram(&s->mem, OBJECT(s),
> -                           "sun4m.idreg", sizeof(idreg_data));
> +                           "sun4m.idreg", sizeof(idreg_data), &error_abort);
>      vmstate_register_ram_global(&s->mem);
>      memory_region_set_readonly(&s->mem, true);
>      sysbus_init_mmio(dev, &s->mem);
> @@ -668,7 +668,7 @@ static int afx_init1(SysBusDevice *dev)
>  {
>      AFXState *s = TCX_AFX(dev);
>
> -    memory_region_init_ram(&s->mem, OBJECT(s), "sun4m.afx", 4);
> +    memory_region_init_ram(&s->mem, OBJECT(s), "sun4m.afx", 4, &error_abort);
>      vmstate_register_ram_global(&s->mem);
>      sysbus_init_mmio(dev, &s->mem);
>      return 0;
> @@ -742,7 +742,8 @@ static int prom_init1(SysBusDevice *dev)
>  {
>      PROMState *s = OPENPROM(dev);
>
> -    memory_region_init_ram(&s->prom, OBJECT(s), "sun4m.prom", PROM_SIZE_MAX);
> +    memory_region_init_ram(&s->prom, OBJECT(s), "sun4m.prom", PROM_SIZE_MAX,
> +                           &error_abort);
>      vmstate_register_ram_global(&s->prom);
>      memory_region_set_readonly(&s->prom, true);
>      sysbus_init_mmio(dev, &s->prom);
> @@ -784,7 +785,8 @@ static int ram_init1(SysBusDevice *dev)
>  {
>      RamDevice *d = SUN4M_RAM(dev);
>
> -    memory_region_init_ram(&d->ram, OBJECT(d), "sun4m.ram", d->size);
> +    memory_region_init_ram(&d->ram, OBJECT(d), "sun4m.ram", d->size,
> +                           &error_abort);
>      vmstate_register_ram_global(&d->ram);
>      sysbus_init_mmio(dev, &d->ram);
>      return 0;
> diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
> index 33c311b..c541228 100644
> --- a/hw/sparc64/sun4u.c
> +++ b/hw/sparc64/sun4u.c
> @@ -686,7 +686,8 @@ static int prom_init1(SysBusDevice *dev)
>  {
>      PROMState *s = OPENPROM(dev);
>
> -    memory_region_init_ram(&s->prom, OBJECT(s), "sun4u.prom", PROM_SIZE_MAX);
> +    memory_region_init_ram(&s->prom, OBJECT(s), "sun4u.prom", PROM_SIZE_MAX,
> +                           &error_abort);
>      vmstate_register_ram_global(&s->prom);
>      memory_region_set_readonly(&s->prom, true);
>      sysbus_init_mmio(dev, &s->prom);
> @@ -729,7 +730,8 @@ static int ram_init1(SysBusDevice *dev)
>  {
>      RamDevice *d = SUN4U_RAM(dev);
>
> -    memory_region_init_ram(&d->ram, OBJECT(d), "sun4u.ram", d->size);
> +    memory_region_init_ram(&d->ram, OBJECT(d), "sun4u.ram", d->size,
> +                           &error_abort);
>      vmstate_register_ram_global(&d->ram);
>      sysbus_init_mmio(dev, &d->ram);
>      return 0;
> diff --git a/hw/unicore32/puv3.c b/hw/unicore32/puv3.c
> index 08dd4d0..c41499e 100644
> --- a/hw/unicore32/puv3.c
> +++ b/hw/unicore32/puv3.c
> @@ -74,7 +74,8 @@ static void puv3_board_init(CPUUniCore32State *env, ram_addr_t ram_size)
>      MemoryRegion *ram_memory = g_new(MemoryRegion, 1);
>
>      /* SDRAM at address zero.  */
> -    memory_region_init_ram(ram_memory, NULL, "puv3.ram", 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);
>  }
> diff --git a/hw/xtensa/sim.c b/hw/xtensa/sim.c
> index 9642bf5..37ea9ae 100644
> --- a/hw/xtensa/sim.c
> +++ b/hw/xtensa/sim.c
> @@ -79,12 +79,12 @@ static void xtensa_sim_init(MachineState *machine)
>      }
>
>      ram = g_malloc(sizeof(*ram));
> -    memory_region_init_ram(ram, NULL, "xtensa.sram", ram_size);
> +    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);
>
>      rom = g_malloc(sizeof(*rom));
> -    memory_region_init_ram(rom, NULL, "xtensa.rom", 0x1000);
> +    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);
>
> diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
> index a2dff5a..ed06ff7 100644
> --- a/hw/xtensa/xtfpga.c
> +++ b/hw/xtensa/xtfpga.c
> @@ -143,7 +143,7 @@ static void lx60_net_init(MemoryRegion *address_space,
>              sysbus_mmio_get_region(s, 1));
>
>      ram = g_malloc(sizeof(*ram));
> -    memory_region_init_ram(ram, OBJECT(s), "open_eth.ram", 16384);
> +    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);
>  }
> @@ -205,7 +205,8 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
>      }
>
>      ram = g_malloc(sizeof(*ram));
> -    memory_region_init_ram(ram, NULL, "lx60.dram", machine->ram_size);
> +    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);
>
> @@ -254,7 +255,8 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
>          uint32_t cur_lowmem = QEMU_ALIGN_UP(lowmem_end / 2, 4096);
>
>          rom = g_malloc(sizeof(*rom));
> -        memory_region_init_ram(rom, NULL, "lx60.sram", board->sram_size);
> +        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);
>
> diff --git a/include/exec/memory.h b/include/exec/memory.h
> index e2c8e3e..ec6299b 100644
> --- a/include/exec/memory.h
> +++ b/include/exec/memory.h
> @@ -311,11 +311,13 @@ void memory_region_init_io(MemoryRegion *mr,
>   * @owner: the object that tracks the region's reference count
>   * @name: the name of the region.
>   * @size: size of the region.
> + * @errp: pointer to Error*, to store an error if it happens.
>   */
>  void memory_region_init_ram(MemoryRegion *mr,
>                              struct Object *owner,
>                              const char *name,
> -                            uint64_t size);
> +                            uint64_t size,
> +                            Error **errp);
>
>  #ifdef __linux__
>  /**
> diff --git a/memory.c b/memory.c
> index 59d9935..feecbb1 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -1163,13 +1163,14 @@ void memory_region_init_io(MemoryRegion *mr,
>  void memory_region_init_ram(MemoryRegion *mr,
>                              Object *owner,
>                              const char *name,
> -                            uint64_t size)
> +                            uint64_t size,
> +                            Error **errp)
>  {
>      memory_region_init(mr, owner, name, size);
>      mr->ram = true;
>      mr->terminates = true;
>      mr->destructor = memory_region_destructor_ram;
> -    mr->ram_addr = qemu_ram_alloc(size, mr, &error_abort);
> +    mr->ram_addr = qemu_ram_alloc(size, mr, errp);
>  }
>
>  #ifdef __linux__
> diff --git a/numa.c b/numa.c
> index 7bf7834..e4e352b 100644
> --- a/numa.c
> +++ b/numa.c
> @@ -263,14 +263,14 @@ static void allocate_system_memory_nonnuma(MemoryRegion *mr, Object *owner,
>          if (err) {
>              qerror_report_err(err);
>              error_free(err);
> -            memory_region_init_ram(mr, owner, name, ram_size);
> +            memory_region_init_ram(mr, owner, name, ram_size, &error_abort);
>          }
>  #else
>          fprintf(stderr, "-mem-path not supported on this host\n");
>          exit(1);
>  #endif
>      } else {
> -        memory_region_init_ram(mr, owner, name, ram_size);
> +        memory_region_init_ram(mr, owner, name, ram_size, &error_abort);
>      }
>      vmstate_register_ram_global(mr);
>  }
> diff --git a/xen-hvm.c b/xen-hvm.c
> index 91de2e2..9328aff 100644
> --- a/xen-hvm.c
> +++ b/xen-hvm.c
> @@ -188,7 +188,8 @@ static void xen_ram_init(ram_addr_t *below_4g_mem_size,
>           */
>          block_len = (1ULL << 32) + *above_4g_mem_size;
>      }
> -    memory_region_init_ram(&ram_memory, NULL, "xen.ram", block_len);
> +    memory_region_init_ram(&ram_memory, NULL, "xen.ram", block_len,
> +                           &error_abort);
>      *ram_memory_p = &ram_memory;
>      vmstate_register_ram_global(&ram_memory);
>
> --
> 1.9.3
>
>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v5 3/6] memory: add parameter errp to memory_region_init_ram_ptr
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 3/6] memory: add parameter errp to memory_region_init_ram_ptr Hu Tao
@ 2014-08-06 12:29   ` Peter Crosthwaite
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Crosthwaite @ 2014-08-06 12:29 UTC (permalink / raw)
  To: Hu Tao
  Cc: Yasunori Goto, Paolo Bonzini, Yasuaki Isimatu,
	qemu-devel@nongnu.org Developers, Michael S. Tsirkin

On Wed, Aug 6, 2014 at 3:36 PM, Hu Tao <hutao@cn.fujitsu.com> wrote:
> Add parameter errp to memory_region_init_ram_ptr and update all call
> sites to pass in &error_abort.
>
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>

Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

> ---
>  hw/display/g364fb.c      | 2 +-
>  hw/i386/kvm/pci-assign.c | 3 ++-
>  hw/misc/ivshmem.c        | 5 +++--
>  hw/misc/vfio.c           | 3 ++-
>  hw/ppc/spapr.c           | 2 +-
>  include/exec/memory.h    | 4 +++-
>  memory.c                 | 5 +++--
>  7 files changed, 15 insertions(+), 9 deletions(-)
>
> diff --git a/hw/display/g364fb.c b/hw/display/g364fb.c
> index 46f7b41..cce33ae 100644
> --- a/hw/display/g364fb.c
> +++ b/hw/display/g364fb.c
> @@ -487,7 +487,7 @@ static void g364fb_init(DeviceState *dev, G364State *s)
>
>      memory_region_init_io(&s->mem_ctrl, NULL, &g364fb_ctrl_ops, s, "ctrl", 0x180000);
>      memory_region_init_ram_ptr(&s->mem_vram, NULL, "vram",
> -                               s->vram_size, s->vram);
> +                               s->vram_size, s->vram, &error_abort);
>      vmstate_register_ram(&s->mem_vram, dev);
>      memory_region_set_coalescing(&s->mem_vram);
>  }
> diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c
> index 5dcd2d5..d2013af 100644
> --- a/hw/i386/kvm/pci-assign.c
> +++ b/hw/i386/kvm/pci-assign.c
> @@ -456,7 +456,8 @@ static void assigned_dev_register_regions(PCIRegion *io_regions,
>                           object_get_typename(OBJECT(pci_dev)), i);
>                  memory_region_init_ram_ptr(&pci_dev->v_addrs[i].real_iomem,
>                                             OBJECT(pci_dev), name,
> -                                           cur_region->size, virtbase);
> +                                           cur_region->size, virtbase,
> +                                           &error_abort);
>                  vmstate_register_ram(&pci_dev->v_addrs[i].real_iomem,
>                                       &pci_dev->dev.qdev);
>              }
> diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
> index 768e528..0949c15 100644
> --- a/hw/misc/ivshmem.c
> +++ b/hw/misc/ivshmem.c
> @@ -348,7 +348,7 @@ static void create_shared_memory_BAR(IVShmemState *s, int fd) {
>      ptr = mmap(0, s->ivshmem_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
>
>      memory_region_init_ram_ptr(&s->ivshmem, OBJECT(s), "ivshmem.bar2",
> -                               s->ivshmem_size, ptr);
> +                               s->ivshmem_size, ptr, &error_abort);
>      vmstate_register_ram(&s->ivshmem, DEVICE(s));
>      memory_region_add_subregion(&s->bar, 0, &s->ivshmem);
>
> @@ -476,7 +476,8 @@ static void ivshmem_read(void *opaque, const uint8_t * buf, int flags)
>          map_ptr = mmap(0, s->ivshmem_size, PROT_READ|PROT_WRITE, MAP_SHARED,
>                                                              incoming_fd, 0);
>          memory_region_init_ram_ptr(&s->ivshmem, OBJECT(s),
> -                                   "ivshmem.bar2", s->ivshmem_size, map_ptr);
> +                                   "ivshmem.bar2", s->ivshmem_size, map_ptr,
> +                                   &error_abort);
>          vmstate_register_ram(&s->ivshmem, DEVICE(s));
>
>          IVSHMEM_DPRINTF("guest h/w addr = %" PRIu64 ", size = %" PRIu64 "\n",
> diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
> index 0b9eba0..91d2c95 100644
> --- a/hw/misc/vfio.c
> +++ b/hw/misc/vfio.c
> @@ -2894,7 +2894,8 @@ static int vfio_mmap_bar(VFIODevice *vdev, VFIOBAR *bar,
>              goto empty_region;
>          }
>
> -        memory_region_init_ram_ptr(submem, OBJECT(vdev), name, size, *map);
> +        memory_region_init_ram_ptr(submem, OBJECT(vdev), name, size, *map,
> +                                   &error_abort);
>      } else {
>  empty_region:
>          /* Create a zero sized sub-region to make cleanup easy. */
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index d01978f..4dfe40a 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -1342,7 +1342,7 @@ static void ppc_spapr_init(MachineState *machine)
>      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);
> +                                   rma_alloc_size, rma, &error_abort);
>          vmstate_register_ram_global(rma_region);
>          memory_region_add_subregion(sysmem, 0, rma_region);
>      }
> diff --git a/include/exec/memory.h b/include/exec/memory.h
> index ec6299b..caa988d 100644
> --- a/include/exec/memory.h
> +++ b/include/exec/memory.h
> @@ -351,12 +351,14 @@ void memory_region_init_ram_from_file(MemoryRegion *mr,
>   * @name: the name of the region.
>   * @size: size of the region.
>   * @ptr: memory to be mapped; must contain at least @size bytes.
> + * @errp: pointer to Error*, to store an error if it happens.
>   */
>  void memory_region_init_ram_ptr(MemoryRegion *mr,
>                                  struct Object *owner,
>                                  const char *name,
>                                  uint64_t size,
> -                                void *ptr);
> +                                void *ptr,
> +                                Error **errp);
>
>  /**
>   * memory_region_init_alias: Initialize a memory region that aliases all or a
> diff --git a/memory.c b/memory.c
> index feecbb1..bcebfd8 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -1194,13 +1194,14 @@ void memory_region_init_ram_ptr(MemoryRegion *mr,
>                                  Object *owner,
>                                  const char *name,
>                                  uint64_t size,
> -                                void *ptr)
> +                                void *ptr,
> +                                Error **errp)
>  {
>      memory_region_init(mr, owner, name, size);
>      mr->ram = true;
>      mr->terminates = true;
>      mr->destructor = memory_region_destructor_ram_from_ptr;
> -    mr->ram_addr = qemu_ram_alloc_from_ptr(size, ptr, mr, &error_abort);
> +    mr->ram_addr = qemu_ram_alloc_from_ptr(size, ptr, mr, errp);
>  }
>
>  void memory_region_init_alias(MemoryRegion *mr,
> --
> 1.9.3
>
>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v5 4/6] memory: add parameter errp to memory_region_init_rom_device
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 4/6] memory: add parameter errp to memory_region_init_rom_device Hu Tao
@ 2014-08-06 12:32   ` Peter Crosthwaite
  2014-08-07  8:57     ` Hu Tao
  0 siblings, 1 reply; 16+ messages in thread
From: Peter Crosthwaite @ 2014-08-06 12:32 UTC (permalink / raw)
  To: Hu Tao
  Cc: Yasunori Goto, Paolo Bonzini, Yasuaki Isimatu,
	qemu-devel@nongnu.org Developers, Michael S. Tsirkin

On Wed, Aug 6, 2014 at 3:36 PM, Hu Tao <hutao@cn.fujitsu.com> wrote:
> Add parameter errp to memory_region_init_rom_device and update all call
> sites to pass in &error_abort.
>
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>

Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

> ---
>  hw/block/pflash_cfi01.c | 2 +-
>  hw/block/pflash_cfi02.c | 2 +-
>  include/exec/memory.h   | 4 +++-
>  memory.c                | 5 +++--
>  4 files changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c
> index f9507b4..649565d 100644
> --- a/hw/block/pflash_cfi01.c
> +++ b/hw/block/pflash_cfi01.c
> @@ -770,7 +770,7 @@ static void pflash_cfi01_realize(DeviceState *dev, Error **errp)
>      memory_region_init_rom_device(
>          &pfl->mem, OBJECT(dev),
>          pfl->be ? &pflash_cfi01_ops_be : &pflash_cfi01_ops_le, pfl,
> -        pfl->name, total_len);
> +        pfl->name, total_len, &error_abort);
>      vmstate_register_ram(&pfl->mem, DEVICE(pfl));
>      pfl->storage = memory_region_get_ram_ptr(&pfl->mem);
>      sysbus_init_mmio(SYS_BUS_DEVICE(dev), &pfl->mem);
> diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c
> index 8d4b828..49db02d 100644
> --- a/hw/block/pflash_cfi02.c
> +++ b/hw/block/pflash_cfi02.c
> @@ -608,7 +608,7 @@ static void pflash_cfi02_realize(DeviceState *dev, Error **errp)
>
>      memory_region_init_rom_device(&pfl->orig_mem, OBJECT(pfl), pfl->be ?
>                                    &pflash_cfi02_ops_be : &pflash_cfi02_ops_le,
> -                                  pfl, pfl->name, chip_len);
> +                                  pfl, pfl->name, chip_len, &error_abort);

We probably should take the opportunity to error_propagate in these
cases, to prepare support for hotplug of devs like this. But I think
your blind conversions are a good first step as they will preserve
existing behaviour. So lets call that follow up.

Regards,
Peter

>      vmstate_register_ram(&pfl->orig_mem, DEVICE(pfl));
>      pfl->storage = memory_region_get_ram_ptr(&pfl->orig_mem);
>      pfl->chip_len = chip_len;
> diff --git a/include/exec/memory.h b/include/exec/memory.h
> index caa988d..71bed47 100644
> --- a/include/exec/memory.h
> +++ b/include/exec/memory.h
> @@ -388,13 +388,15 @@ void memory_region_init_alias(MemoryRegion *mr,
>   * @ops: callbacks for write access handling.
>   * @name: the name of the region.
>   * @size: size of the region.
> + * @errp: pointer to Error*, to store an error if it happens.
>   */
>  void memory_region_init_rom_device(MemoryRegion *mr,
>                                     struct Object *owner,
>                                     const MemoryRegionOps *ops,
>                                     void *opaque,
>                                     const char *name,
> -                                   uint64_t size);
> +                                   uint64_t size,
> +                                   Error **errp);
>
>  /**
>   * memory_region_init_reservation: Initialize a memory region that reserves
> diff --git a/memory.c b/memory.c
> index bcebfd8..06a7e1b 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -1223,7 +1223,8 @@ void memory_region_init_rom_device(MemoryRegion *mr,
>                                     const MemoryRegionOps *ops,
>                                     void *opaque,
>                                     const char *name,
> -                                   uint64_t size)
> +                                   uint64_t size,
> +                                   Error **errp)
>  {
>      memory_region_init(mr, owner, name, size);
>      mr->ops = ops;
> @@ -1231,7 +1232,7 @@ void memory_region_init_rom_device(MemoryRegion *mr,
>      mr->terminates = true;
>      mr->rom_device = true;
>      mr->destructor = memory_region_destructor_rom_device;
> -    mr->ram_addr = qemu_ram_alloc(size, mr, &error_abort);
> +    mr->ram_addr = qemu_ram_alloc(size, mr, errp);
>  }
>
>  void memory_region_init_iommu(MemoryRegion *mr,
> --
> 1.9.3
>
>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v5 5/6] hostmem-ram: don't exit qemu if size of memory-backend-ram is way too big
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 5/6] hostmem-ram: don't exit qemu if size of memory-backend-ram is way too big Hu Tao
@ 2014-08-06 12:37   ` Peter Crosthwaite
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Crosthwaite @ 2014-08-06 12:37 UTC (permalink / raw)
  To: Hu Tao
  Cc: Yasunori Goto, Paolo Bonzini, Yasuaki Isimatu,
	qemu-devel@nongnu.org Developers, Michael S. Tsirkin

On Wed, Aug 6, 2014 at 3:36 PM, Hu Tao <hutao@cn.fujitsu.com> wrote:
> When using monitor command object_add to add a memory backend whose
> size is way too big to allocate memory for it, qemu just exits. In
> the case we'd better give an error message and keep guest running.
>
> The problem can be reproduced as follows:
>
> 1. run qemu
> 2. (monitor)object_add memory-backend-ram,size=100000G,id=ram0
>
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>

Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

> ---
>  backends/hostmem-ram.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c
> index e55d066..a67a134 100644
> --- a/backends/hostmem-ram.c
> +++ b/backends/hostmem-ram.c
> @@ -27,7 +27,7 @@ ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
>
>      path = object_get_canonical_path_component(OBJECT(backend));
>      memory_region_init_ram(&backend->mr, OBJECT(backend), path,
> -                           backend->size, &error_abort);
> +                           backend->size, errp);
>      g_free(path);
>  }
>
> --
> 1.9.3
>
>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v5 6/6] exec: improve error handling and reporting in file_ram_alloc() and gethugepagesize()
  2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 6/6] exec: improve error handling and reporting in file_ram_alloc() and gethugepagesize() Hu Tao
@ 2014-08-06 12:49   ` Peter Crosthwaite
  2014-08-07  8:45     ` Hu Tao
  0 siblings, 1 reply; 16+ messages in thread
From: Peter Crosthwaite @ 2014-08-06 12:49 UTC (permalink / raw)
  To: Hu Tao
  Cc: Yasunori Goto, Paolo Bonzini, Yasuaki Isimatu,
	qemu-devel@nongnu.org Developers, Michael S. Tsirkin

You subject line is excessively long. How about just "improve RAM file
error handling" and elaborate in a commit msg para?

On Wed, Aug 6, 2014 at 3:36 PM, Hu Tao <hutao@cn.fujitsu.com> wrote:
> This patch fixes two problems of memory-backend-file:
>

It looks like two self contained changes. Any reason to not split?

> 1. If user adds a memory-backend-file object using object_add command,
>    specifying a non-existing directory for property mem-path, qemu
>    will core dump with message:
>
>      /nonexistingdir: No such file or directory
>      Bad ram offset fffffffffffff000
>      Aborted (core dumped)
>
>    with this patch, qemu reports error message like:
>
>      qemu-system-x86_64: -object memory-backend-file,mem-path=/nonexistingdir,id=mem-file0,size=128M:
>      failed to stat file /nonexistingdir: No such file or directory
>
> 2. If user adds a memory-backend-file object using object_add command,
>    specifying a size that is less than huge page size, qemu
>    will core dump with message:
>
>      Bad ram offset fffffffffffff000
>      Aborted (core dumped)
>
>    with this patch, qemu reports error message like:
>
>      qemu-system-x86_64: -object memory-backend-file,mem-path=/hugepages,id=mem-file0,size=1M: memory
>      size 0x100000 should be euqal or larger than huge page size 0x200000

"equal".

>
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  exec.c | 21 ++++++++++++---------
>  1 file changed, 12 insertions(+), 9 deletions(-)
>
> diff --git a/exec.c b/exec.c
> index 7e60a44..6512820 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -996,7 +996,7 @@ void qemu_mutex_unlock_ramlist(void)
>

>  #define HUGETLBFS_MAGIC       0x958458f6
>
> -static long gethugepagesize(const char *path)
> +static long gethugepagesize(const char *path, Error **errp)
>  {
>      struct statfs fs;
>      int ret;
> @@ -1006,7 +1006,7 @@ static long gethugepagesize(const char *path)
>      } while (ret != 0 && errno == EINTR);
>
>      if (ret != 0) {
> -        perror(path);
> +        error_setg_errno(errp, errno, "failed to get size of file %s", path);

I think your error message is imprecise. It's not the file size you
are trying to get its the page size for that file (or its underlying
file system I think).

>          return 0;
>      }
>
> @@ -1024,17 +1024,20 @@ static void *file_ram_alloc(RAMBlock *block,
>      char *filename;
>      char *sanitized_name;
>      char *c;
> -    void *area;
> +    void *area = NULL;
>      int fd;
> -    unsigned long hpagesize;
> +    uint64_t hpagesize;
>
> -    hpagesize = gethugepagesize(path);
> -    if (!hpagesize) {
> +    hpagesize = gethugepagesize(path, errp);
> +    if (errp && *errp) {

More flow control dependent on non NULL errp. I think you want a
local_err for safety here.

>          goto error;
>      }
>
>      if (memory < hpagesize) {
> -        return NULL;
> +        error_setg(errp, "memory size 0x" RAM_ADDR_FMT " must be euqal to "

"equal"

Regards,
Peter

> +                   "or larger than huge page size 0x%" PRIx64,
> +                   memory, hpagesize);
> +        goto error;
>      }
>
>      if (kvm_enabled() && !kvm_has_sync_mmu()) {
> @@ -1094,8 +1097,8 @@ static void *file_ram_alloc(RAMBlock *block,
>      return area;
>
>  error:
> -    if (mem_prealloc) {
> -        exit(1);
> +    if (area && area != MAP_FAILED) {
> +        munmap(area, memory);
>      }
>      return NULL;
>  }
> --
> 1.9.3
>
>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v5 1/6] exec: add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr
  2014-08-06 12:15   ` Peter Crosthwaite
@ 2014-08-07  7:52     ` Hu Tao
  0 siblings, 0 replies; 16+ messages in thread
From: Hu Tao @ 2014-08-07  7:52 UTC (permalink / raw)
  To: Peter Crosthwaite
  Cc: Yasunori Goto, Paolo Bonzini, Yasuaki Isimatu,
	qemu-devel@nongnu.org Developers, Michael S. Tsirkin

On Wed, Aug 06, 2014 at 10:15:17PM +1000, Peter Crosthwaite wrote:
> On Wed, Aug 6, 2014 at 3:36 PM, Hu Tao <hutao@cn.fujitsu.com> wrote:
> > Add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr so that
> > we can handler errors.
> 
> "handle"
> 
> >
> > Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> > ---
> >  exec.c                  | 32 +++++++++++++++++++++++---------
> >  include/exec/ram_addr.h |  4 ++--
> >  memory.c                |  6 +++---
> >  3 files changed, 28 insertions(+), 14 deletions(-)
> >
> > diff --git a/exec.c b/exec.c
> > index 765bd94..7e60a44 100644
> > --- a/exec.c
> > +++ b/exec.c
> > @@ -1224,7 +1224,7 @@ static int memory_try_enable_merging(void *addr, size_t len)
> >      return qemu_madvise(addr, len, QEMU_MADV_MERGEABLE);
> >  }
> >
> > -static ram_addr_t ram_block_add(RAMBlock *new_block)
> > +static ram_addr_t ram_block_add(RAMBlock *new_block, Error **errp)
> >  {
> >      RAMBlock *block;
> >      ram_addr_t old_ram_size, new_ram_size;
> > @@ -1241,9 +1241,11 @@ static ram_addr_t ram_block_add(RAMBlock *new_block)
> >          } else {
> >              new_block->host = phys_mem_alloc(new_block->length);
> >              if (!new_block->host) {
> > -                fprintf(stderr, "Cannot set up guest memory '%s': %s\n",
> > -                        new_block->mr->name, strerror(errno));
> > -                exit(1);
> > +                error_setg_errno(errp, errno,
> > +                                 "cannot set up guest memory '%s'",
> > +                                 new_block->mr->name);
> > +                qemu_mutex_unlock_ramlist();
> > +                return -1;
> >              }
> >              memory_try_enable_merging(new_block->host, new_block->length);
> >          }
> > @@ -1294,6 +1296,7 @@ ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
> >                                      Error **errp)
> >  {
> >      RAMBlock *new_block;
> > +    ram_addr_t addr;
> >
> >      if (xen_enabled()) {
> >          error_setg(errp, "-mem-path not supported with Xen");
> > @@ -1323,14 +1326,20 @@ ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
> >          return -1;
> >      }
> >
> > -    return ram_block_add(new_block);
> > +    addr = ram_block_add(new_block, errp);
> > +    if (errp && *errp) {
> > +        g_free(new_block);
> 
> The free being conditional on errp will cause a leak if clients
> (validly) pass a NULL errp in. This free needs to be unconditional.
> The way to achieve that is the local_err error_propagate pattern.

Yes.

Regards,
Hu

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v5 6/6] exec: improve error handling and reporting in file_ram_alloc() and gethugepagesize()
  2014-08-06 12:49   ` Peter Crosthwaite
@ 2014-08-07  8:45     ` Hu Tao
  0 siblings, 0 replies; 16+ messages in thread
From: Hu Tao @ 2014-08-07  8:45 UTC (permalink / raw)
  To: Peter Crosthwaite
  Cc: Yasunori Goto, Paolo Bonzini, Yasuaki Isimatu,
	qemu-devel@nongnu.org Developers, Michael S. Tsirkin

On Wed, Aug 06, 2014 at 10:49:23PM +1000, Peter Crosthwaite wrote:
> You subject line is excessively long. How about just "improve RAM file
> error handling" and elaborate in a commit msg para?

After splitting both patches are improving of RAM file error handling.
I'll reword the subjects and drop this one.

> 
> On Wed, Aug 6, 2014 at 3:36 PM, Hu Tao <hutao@cn.fujitsu.com> wrote:
> > This patch fixes two problems of memory-backend-file:
> >
> 
> It looks like two self contained changes. Any reason to not split?
> 
> > 1. If user adds a memory-backend-file object using object_add command,
> >    specifying a non-existing directory for property mem-path, qemu
> >    will core dump with message:
> >
> >      /nonexistingdir: No such file or directory
> >      Bad ram offset fffffffffffff000
> >      Aborted (core dumped)
> >
> >    with this patch, qemu reports error message like:
> >
> >      qemu-system-x86_64: -object memory-backend-file,mem-path=/nonexistingdir,id=mem-file0,size=128M:
> >      failed to stat file /nonexistingdir: No such file or directory
> >
> > 2. If user adds a memory-backend-file object using object_add command,
> >    specifying a size that is less than huge page size, qemu
> >    will core dump with message:
> >
> >      Bad ram offset fffffffffffff000
> >      Aborted (core dumped)
> >
> >    with this patch, qemu reports error message like:
> >
> >      qemu-system-x86_64: -object memory-backend-file,mem-path=/hugepages,id=mem-file0,size=1M: memory
> >      size 0x100000 should be euqal or larger than huge page size 0x200000
> 
> "equal".
> 
> >
> > Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> > ---
> >  exec.c | 21 ++++++++++++---------
> >  1 file changed, 12 insertions(+), 9 deletions(-)
> >
> > diff --git a/exec.c b/exec.c
> > index 7e60a44..6512820 100644
> > --- a/exec.c
> > +++ b/exec.c
> > @@ -996,7 +996,7 @@ void qemu_mutex_unlock_ramlist(void)
> >
> 
> >  #define HUGETLBFS_MAGIC       0x958458f6
> >
> > -static long gethugepagesize(const char *path)
> > +static long gethugepagesize(const char *path, Error **errp)
> >  {
> >      struct statfs fs;
> >      int ret;
> > @@ -1006,7 +1006,7 @@ static long gethugepagesize(const char *path)
> >      } while (ret != 0 && errno == EINTR);
> >
> >      if (ret != 0) {
> > -        perror(path);
> > +        error_setg_errno(errp, errno, "failed to get size of file %s", path);
> 
> I think your error message is imprecise. It's not the file size you
> are trying to get its the page size for that file (or its underlying
> file system I think).

changed to: failed to get page size of file

> 
> >          return 0;
> >      }
> >
> > @@ -1024,17 +1024,20 @@ static void *file_ram_alloc(RAMBlock *block,
> >      char *filename;
> >      char *sanitized_name;
> >      char *c;
> > -    void *area;
> > +    void *area = NULL;
> >      int fd;
> > -    unsigned long hpagesize;
> > +    uint64_t hpagesize;
> >
> > -    hpagesize = gethugepagesize(path);
> > -    if (!hpagesize) {
> > +    hpagesize = gethugepagesize(path, errp);
> > +    if (errp && *errp) {
> 
> More flow control dependent on non NULL errp. I think you want a
> local_err for safety here.

Okay.

> 
> >          goto error;
> >      }
> >
> >      if (memory < hpagesize) {
> > -        return NULL;
> > +        error_setg(errp, "memory size 0x" RAM_ADDR_FMT " must be euqal to "
> 
> "equal"

thanks!

> 
> Regards,
> Peter
> 
> > +                   "or larger than huge page size 0x%" PRIx64,
> > +                   memory, hpagesize);
> > +        goto error;
> >      }
> >
> >      if (kvm_enabled() && !kvm_has_sync_mmu()) {
> > @@ -1094,8 +1097,8 @@ static void *file_ram_alloc(RAMBlock *block,
> >      return area;
> >
> >  error:
> > -    if (mem_prealloc) {
> > -        exit(1);
> > +    if (area && area != MAP_FAILED) {
> > +        munmap(area, memory);
> >      }
> >      return NULL;
> >  }
> > --
> > 1.9.3
> >
> >

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v5 4/6] memory: add parameter errp to memory_region_init_rom_device
  2014-08-06 12:32   ` Peter Crosthwaite
@ 2014-08-07  8:57     ` Hu Tao
  0 siblings, 0 replies; 16+ messages in thread
From: Hu Tao @ 2014-08-07  8:57 UTC (permalink / raw)
  To: Peter Crosthwaite
  Cc: Yasunori Goto, Paolo Bonzini, Yasuaki Isimatu,
	qemu-devel@nongnu.org Developers, Michael S. Tsirkin

On Wed, Aug 06, 2014 at 10:32:53PM +1000, Peter Crosthwaite wrote:
> On Wed, Aug 6, 2014 at 3:36 PM, Hu Tao <hutao@cn.fujitsu.com> wrote:
> > Add parameter errp to memory_region_init_rom_device and update all call
> > sites to pass in &error_abort.
> >
> > Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> 
> Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> 
> > ---
> >  hw/block/pflash_cfi01.c | 2 +-
> >  hw/block/pflash_cfi02.c | 2 +-
> >  include/exec/memory.h   | 4 +++-
> >  memory.c                | 5 +++--
> >  4 files changed, 8 insertions(+), 5 deletions(-)
> >
> > diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c
> > index f9507b4..649565d 100644
> > --- a/hw/block/pflash_cfi01.c
> > +++ b/hw/block/pflash_cfi01.c
> > @@ -770,7 +770,7 @@ static void pflash_cfi01_realize(DeviceState *dev, Error **errp)
> >      memory_region_init_rom_device(
> >          &pfl->mem, OBJECT(dev),
> >          pfl->be ? &pflash_cfi01_ops_be : &pflash_cfi01_ops_le, pfl,
> > -        pfl->name, total_len);
> > +        pfl->name, total_len, &error_abort);
> >      vmstate_register_ram(&pfl->mem, DEVICE(pfl));
> >      pfl->storage = memory_region_get_ram_ptr(&pfl->mem);
> >      sysbus_init_mmio(SYS_BUS_DEVICE(dev), &pfl->mem);
> > diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c
> > index 8d4b828..49db02d 100644
> > --- a/hw/block/pflash_cfi02.c
> > +++ b/hw/block/pflash_cfi02.c
> > @@ -608,7 +608,7 @@ static void pflash_cfi02_realize(DeviceState *dev, Error **errp)
> >
> >      memory_region_init_rom_device(&pfl->orig_mem, OBJECT(pfl), pfl->be ?
> >                                    &pflash_cfi02_ops_be : &pflash_cfi02_ops_le,
> > -                                  pfl, pfl->name, chip_len);
> > +                                  pfl, pfl->name, chip_len, &error_abort);
> 
> We probably should take the opportunity to error_propagate in these
> cases, to prepare support for hotplug of devs like this. But I think
> your blind conversions are a good first step as they will preserve
> existing behaviour. So lets call that follow up.

The same pattern is done in patch 2 and patch 5 :)

> 
> Regards,
> Peter
> 
> >      vmstate_register_ram(&pfl->orig_mem, DEVICE(pfl));
> >      pfl->storage = memory_region_get_ram_ptr(&pfl->orig_mem);
> >      pfl->chip_len = chip_len;
> > diff --git a/include/exec/memory.h b/include/exec/memory.h
> > index caa988d..71bed47 100644
> > --- a/include/exec/memory.h
> > +++ b/include/exec/memory.h
> > @@ -388,13 +388,15 @@ void memory_region_init_alias(MemoryRegion *mr,
> >   * @ops: callbacks for write access handling.
> >   * @name: the name of the region.
> >   * @size: size of the region.
> > + * @errp: pointer to Error*, to store an error if it happens.
> >   */
> >  void memory_region_init_rom_device(MemoryRegion *mr,
> >                                     struct Object *owner,
> >                                     const MemoryRegionOps *ops,
> >                                     void *opaque,
> >                                     const char *name,
> > -                                   uint64_t size);
> > +                                   uint64_t size,
> > +                                   Error **errp);
> >
> >  /**
> >   * memory_region_init_reservation: Initialize a memory region that reserves
> > diff --git a/memory.c b/memory.c
> > index bcebfd8..06a7e1b 100644
> > --- a/memory.c
> > +++ b/memory.c
> > @@ -1223,7 +1223,8 @@ void memory_region_init_rom_device(MemoryRegion *mr,
> >                                     const MemoryRegionOps *ops,
> >                                     void *opaque,
> >                                     const char *name,
> > -                                   uint64_t size)
> > +                                   uint64_t size,
> > +                                   Error **errp)
> >  {
> >      memory_region_init(mr, owner, name, size);
> >      mr->ops = ops;
> > @@ -1231,7 +1232,7 @@ void memory_region_init_rom_device(MemoryRegion *mr,
> >      mr->terminates = true;
> >      mr->rom_device = true;
> >      mr->destructor = memory_region_destructor_rom_device;
> > -    mr->ram_addr = qemu_ram_alloc(size, mr, &error_abort);
> > +    mr->ram_addr = qemu_ram_alloc(size, mr, errp);
> >  }
> >
> >  void memory_region_init_iommu(MemoryRegion *mr,
> > --
> > 1.9.3
> >
> >

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2014-08-07  8:59 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-08-06  5:36 [Qemu-devel] [PATCH v5 0/6] memory API improvements and bug fixes for memory Hu Tao
2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 1/6] exec: add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr Hu Tao
2014-08-06 12:15   ` Peter Crosthwaite
2014-08-07  7:52     ` Hu Tao
2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 2/6] memory: add parameter errp to memory_region_init_ram Hu Tao
2014-08-06 12:27   ` Peter Crosthwaite
2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 3/6] memory: add parameter errp to memory_region_init_ram_ptr Hu Tao
2014-08-06 12:29   ` Peter Crosthwaite
2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 4/6] memory: add parameter errp to memory_region_init_rom_device Hu Tao
2014-08-06 12:32   ` Peter Crosthwaite
2014-08-07  8:57     ` Hu Tao
2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 5/6] hostmem-ram: don't exit qemu if size of memory-backend-ram is way too big Hu Tao
2014-08-06 12:37   ` Peter Crosthwaite
2014-08-06  5:36 ` [Qemu-devel] [PATCH v5 6/6] exec: improve error handling and reporting in file_ram_alloc() and gethugepagesize() Hu Tao
2014-08-06 12:49   ` Peter Crosthwaite
2014-08-07  8:45     ` Hu Tao

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.