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

This is merely a rebase of v7, and fixes two merge conflicts.

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-8, each fixes a bug of memory backend.
 
changes:

  v7:
  - split the memory-file preallocation fix into its own patch(patch 6)
  - some commit messages tweaks

  v6:
  - split patch 6 in v5 into 2
  - use local_err instead of errp
  - typo fixes

  v5:
  - 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.

  v4:
  - fix build on 32bit host
  - add memory API renaming
  - rebase on latest master

  v3:
  - introduce memory_region_init_ram_may_fail and
    memory_region_init_ram_ptr_may_fail
  - address comments by MST
  - missing the functions renaming. will send later.

  v2:
  - split patch 1 in v1 into 2 patches
  - don't rely on ram_block_add to return -1
  - error message tweak in file_ram_alloc
  - add error messages reported by qemu to commit message of patch 3

  v1:
  - initial version


Hu Tao (8):
  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: file_ram_alloc: don't exit if failed to preallocate memory
  exec: report error when memory < hpagesize
  exec: add parameter errp to gethugepagesize

 backends/hostmem-ram.c                   |  2 +-
 exec.c                                   | 60 ++++++++++++++++++++++----------
 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, 270 insertions(+), 162 deletions(-)

-- 
1.9.3

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

* [Qemu-devel] [PATCH v7 RESEND 1/8] exec: add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr
  2014-09-09  5:27 [Qemu-devel] [PATCH v7 RESEND 0/8] memory API improvements and bug fixes for memory backends Hu Tao
@ 2014-09-09  5:27 ` Hu Tao
  2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 2/8] memory: add parameter errp to memory_region_init_ram Hu Tao
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 17+ messages in thread
From: Hu Tao @ 2014-09-09  5:27 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 handle errors.

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

diff --git a/exec.c b/exec.c
index 7dddcc8..2b9c4c5 100644
--- a/exec.c
+++ b/exec.c
@@ -1259,7 +1259,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;
@@ -1276,9 +1276,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",
-                        memory_region_name(new_block->mr), strerror(errno));
-                exit(1);
+                error_setg_errno(errp, errno,
+                                 "cannot set up guest memory '%s'",
+                                 memory_region_name(new_block->mr));
+                qemu_mutex_unlock_ramlist();
+                return -1;
             }
             memory_try_enable_merging(new_block->host, new_block->length);
         }
@@ -1329,6 +1331,8 @@ ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
                                     Error **errp)
 {
     RAMBlock *new_block;
+    ram_addr_t addr;
+    Error *local_err = NULL;
 
     if (xen_enabled()) {
         error_setg(errp, "-mem-path not supported with Xen");
@@ -1358,14 +1362,22 @@ 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, &local_err);
+    if (local_err) {
+        g_free(new_block);
+        error_propagate(errp, local_err);
+        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;
+    Error *local_err = NULL;
 
     size = TARGET_PAGE_ALIGN(size);
     new_block = g_malloc0(sizeof(*new_block));
@@ -1376,12 +1388,18 @@ 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, &local_err);
+    if (local_err) {
+        g_free(new_block);
+        error_propagate(errp, local_err);
+        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 1bae951..17cf40d 100644
--- a/memory.c
+++ b/memory.c
@@ -1148,7 +1148,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__
@@ -1178,7 +1178,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,
@@ -1208,7 +1208,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] 17+ messages in thread

* [Qemu-devel] [PATCH v7 RESEND 2/8] memory: add parameter errp to memory_region_init_ram
  2014-09-09  5:27 [Qemu-devel] [PATCH v7 RESEND 0/8] memory API improvements and bug fixes for memory backends Hu Tao
  2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 1/8] exec: add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr Hu Tao
@ 2014-09-09  5:27 ` Hu Tao
  2014-09-09 11:28   ` Paolo Bonzini
  2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 3/8] memory: add parameter errp to memory_region_init_ram_ptr Hu Tao
                   ` (6 subsequent siblings)
  8 siblings, 1 reply; 17+ messages in thread
From: Hu Tao @ 2014-09-09  5:27 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>
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 31947d9..5310006 100644
--- a/hw/alpha/typhoon.c
+++ b/hw/alpha/typhoon.c
@@ -844,7 +844,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 aedef13..ef24ca4 100644
--- a/hw/arm/armv7m.c
+++ b/hw/arm/armv7m.c
@@ -210,11 +210,12 @@ qemu_irq *armv7m_init(MemoryRegion *system_memory,
 #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(system_memory, 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(system_memory, 0x20000000, sram);
     armv7m_bitband_init();
@@ -255,7 +256,7 @@ qemu_irq *armv7m_init(MemoryRegion *system_memory,
     /* 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(system_memory, 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 d6fffc7..89b4ed5 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -510,7 +510,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 597b117..5f3a859 100644
--- a/hw/core/loader.c
+++ b/hw/core/loader.c
@@ -701,7 +701,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 652af99..55d13a7 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);
@@ -2095,7 +2095,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 62e6243..d5f5a01 100644
--- a/hw/display/vga.c
+++ b/hw/display/vga.c
@@ -2326,7 +2326,8 @@ void vga_common_init(VGACommonState *s, Object *obj, bool global_vmstate)
     }
 
     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 17c7d6dc..13b9de0 100644
--- a/hw/i386/kvm/pci-assign.c
+++ b/hw/i386/kvm/pci-assign.c
@@ -1936,7 +1936,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 b6c9b61..77b6782 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1273,7 +1273,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 6843abf..fcb51bc 100644
--- a/hw/microblaze/petalogix_ml605_mmu.c
+++ b/hw/microblaze/petalogix_ml605_mmu.c
@@ -99,11 +99,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, MEMORY_BASEADDR, 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 d1e9a2a..6ce75aa 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 8453bfa..1626db4 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -206,7 +206,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 630a9f9..be9a194 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -136,7 +136,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 e538b1f..bc4dc2a 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -131,7 +131,7 @@ static void ccw_init(MachineState *machine)
     virtio_ccw_register_hcalls();
 
     /* allocate RAM for core */
-    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 4ca52b7..9c61246 100644
--- a/hw/s390x/s390-virtio.c
+++ b/hw/s390x/s390-virtio.c
@@ -260,7 +260,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 b9f3bee..9c77e18 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 ea381d6..fd4131b 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 17cf40d..95fbaf8 100644
--- a/memory.c
+++ b/memory.c
@@ -1142,13 +1142,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 f07149b..3b98135 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 0d09940..38059f3 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] 17+ messages in thread

* [Qemu-devel] [PATCH v7 RESEND 3/8] memory: add parameter errp to memory_region_init_ram_ptr
  2014-09-09  5:27 [Qemu-devel] [PATCH v7 RESEND 0/8] memory API improvements and bug fixes for memory backends Hu Tao
  2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 1/8] exec: add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr Hu Tao
  2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 2/8] memory: add parameter errp to memory_region_init_ram Hu Tao
@ 2014-09-09  5:27 ` Hu Tao
  2014-09-09 11:18   ` Paolo Bonzini
  2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 4/8] memory: add parameter errp to memory_region_init_rom_device Hu Tao
                   ` (5 subsequent siblings)
  8 siblings, 1 reply; 17+ messages in thread
From: Hu Tao @ 2014-09-09  5:27 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.

Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
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 13b9de0..b37d606 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 bd9d718..906a6b5 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -352,7 +352,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);
 
@@ -480,7 +480,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 = %p, size = %" PRIu64 "\n",
diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
index 40dcaa6..abb8d1b 100644
--- a/hw/misc/vfio.c
+++ b/hw/misc/vfio.c
@@ -2910,7 +2910,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 2ab4460..3c4aaf0 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1402,7 +1402,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 fd4131b..dcb35a2 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 95fbaf8..ffe24ff 100644
--- a/memory.c
+++ b/memory.c
@@ -1173,13 +1173,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] 17+ messages in thread

* [Qemu-devel] [PATCH v7 RESEND 4/8] memory: add parameter errp to memory_region_init_rom_device
  2014-09-09  5:27 [Qemu-devel] [PATCH v7 RESEND 0/8] memory API improvements and bug fixes for memory backends Hu Tao
                   ` (2 preceding siblings ...)
  2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 3/8] memory: add parameter errp to memory_region_init_ram_ptr Hu Tao
@ 2014-09-09  5:27 ` Hu Tao
  2014-09-09 11:20   ` Paolo Bonzini
  2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 5/8] hostmem-ram: don't exit qemu if size of memory-backend-ram is way too big Hu Tao
                   ` (4 subsequent siblings)
  8 siblings, 1 reply; 17+ messages in thread
From: Hu Tao @ 2014-09-09  5:27 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.

Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
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 593fbc5..4d51bfd 100644
--- a/hw/block/pflash_cfi01.c
+++ b/hw/block/pflash_cfi01.c
@@ -773,7 +773,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 e196f4d..29bb0dc 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 dcb35a2..4921d27 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 ffe24ff..38c29df 100644
--- a/memory.c
+++ b/memory.c
@@ -1202,7 +1202,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;
@@ -1210,7 +1211,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] 17+ messages in thread

* [Qemu-devel] [PATCH v7 RESEND 5/8] hostmem-ram: don't exit qemu if size of memory-backend-ram is way too big
  2014-09-09  5:27 [Qemu-devel] [PATCH v7 RESEND 0/8] memory API improvements and bug fixes for memory backends Hu Tao
                   ` (3 preceding siblings ...)
  2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 4/8] memory: add parameter errp to memory_region_init_rom_device Hu Tao
@ 2014-09-09  5:27 ` Hu Tao
  2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 6/8] exec: file_ram_alloc: don't exit if failed to preallocate memory Hu Tao
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 17+ messages in thread
From: Hu Tao @ 2014-09-09  5:27 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

Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
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] 17+ messages in thread

* [Qemu-devel] [PATCH v7 RESEND 6/8] exec: file_ram_alloc: don't exit if failed to preallocate memory
  2014-09-09  5:27 [Qemu-devel] [PATCH v7 RESEND 0/8] memory API improvements and bug fixes for memory backends Hu Tao
                   ` (4 preceding siblings ...)
  2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 5/8] hostmem-ram: don't exit qemu if size of memory-backend-ram is way too big Hu Tao
@ 2014-09-09  5:27 ` Hu Tao
  2014-09-09 11:23   ` Paolo Bonzini
  2014-09-09  5:28 ` [Qemu-devel] [PATCH v7 RESEND 7/8] exec: report error when memory < hpagesize Hu Tao
                   ` (2 subsequent siblings)
  8 siblings, 1 reply; 17+ messages in thread
From: Hu Tao @ 2014-09-09  5:27 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 file
but failed to preallocate memory for it, qemu exits silently. In
the case we'd better give an error message and keep guest running.

The problem can be reproduced as follows:

1. run qemu with -mem-prealloc
2. (monitor)object_add memory-backend-file,size=100000G,mem-path=/hugepages,id=mem-file0

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

diff --git a/exec.c b/exec.c
index 2b9c4c5..0362cd8 100644
--- a/exec.c
+++ b/exec.c
@@ -1129,8 +1129,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] 17+ messages in thread

* [Qemu-devel] [PATCH v7 RESEND 7/8] exec: report error when memory < hpagesize
  2014-09-09  5:27 [Qemu-devel] [PATCH v7 RESEND 0/8] memory API improvements and bug fixes for memory backends Hu Tao
                   ` (5 preceding siblings ...)
  2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 6/8] exec: file_ram_alloc: don't exit if failed to preallocate memory Hu Tao
@ 2014-09-09  5:28 ` Hu Tao
  2014-09-09  5:28 ` [Qemu-devel] [PATCH v7 RESEND 8/8] exec: add parameter errp to gethugepagesize Hu Tao
  2014-09-09 11:29 ` [Qemu-devel] [PATCH v7 RESEND 0/8] memory API improvements and bug fixes for memory backends Paolo Bonzini
  8 siblings, 0 replies; 17+ messages in thread
From: Hu Tao @ 2014-09-09  5:28 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Crosthwaite, Michael S. Tsirkin, Yasuaki Isimatu,
	Paolo Bonzini, Yasunori Goto

Report an error when memory < hpagesize in file_ram_alloc() so callers
can handle the error.

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)

This patch fixes the problem. 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 must be equal to or larger than huge page size 0x200000

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

diff --git a/exec.c b/exec.c
index 0362cd8..21af6c9 100644
--- a/exec.c
+++ b/exec.c
@@ -1059,9 +1059,9 @@ 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) {
@@ -1069,7 +1069,10 @@ static void *file_ram_alloc(RAMBlock *block,
     }
 
     if (memory < hpagesize) {
-        return NULL;
+        error_setg(errp, "memory size 0x" RAM_ADDR_FMT " must be equal to "
+                   "or larger than huge page size 0x%" PRIx64,
+                   memory, hpagesize);
+        goto error;
     }
 
     if (kvm_enabled() && !kvm_has_sync_mmu()) {
-- 
1.9.3

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

* [Qemu-devel] [PATCH v7 RESEND 8/8] exec: add parameter errp to gethugepagesize
  2014-09-09  5:27 [Qemu-devel] [PATCH v7 RESEND 0/8] memory API improvements and bug fixes for memory backends Hu Tao
                   ` (6 preceding siblings ...)
  2014-09-09  5:28 ` [Qemu-devel] [PATCH v7 RESEND 7/8] exec: report error when memory < hpagesize Hu Tao
@ 2014-09-09  5:28 ` Hu Tao
  2014-09-09 11:29 ` [Qemu-devel] [PATCH v7 RESEND 0/8] memory API improvements and bug fixes for memory backends Paolo Bonzini
  8 siblings, 0 replies; 17+ messages in thread
From: Hu Tao @ 2014-09-09  5:28 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Crosthwaite, Michael S. Tsirkin, Yasuaki Isimatu,
	Paolo Bonzini, Yasunori Goto

Add parameter errp to gethugepagesize thus callers can handle errors.

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)

This patch fixes the problem. With this patch, qemu reports an error
message like:

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

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
---
 exec.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/exec.c b/exec.c
index 21af6c9..0f70c04 100644
--- a/exec.c
+++ b/exec.c
@@ -1031,7 +1031,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;
@@ -1041,7 +1041,8 @@ static long gethugepagesize(const char *path)
     } while (ret != 0 && errno == EINTR);
 
     if (ret != 0) {
-        perror(path);
+        error_setg_errno(errp, errno, "failed to get page size of file %s",
+                         path);
         return 0;
     }
 
@@ -1062,9 +1063,11 @@ static void *file_ram_alloc(RAMBlock *block,
     void *area = NULL;
     int fd;
     uint64_t hpagesize;
+    Error *local_err = NULL;
 
-    hpagesize = gethugepagesize(path);
-    if (!hpagesize) {
+    hpagesize = gethugepagesize(path, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
         goto error;
     }
 
-- 
1.9.3

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

* Re: [Qemu-devel] [PATCH v7 RESEND 3/8] memory: add parameter errp to memory_region_init_ram_ptr
  2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 3/8] memory: add parameter errp to memory_region_init_ram_ptr Hu Tao
@ 2014-09-09 11:18   ` Paolo Bonzini
  0 siblings, 0 replies; 17+ messages in thread
From: Paolo Bonzini @ 2014-09-09 11:18 UTC (permalink / raw)
  To: Hu Tao, qemu-devel
  Cc: Yasunori Goto, Peter Crosthwaite, Yasuaki Isimatu, Michael S. Tsirkin

Il 09/09/2014 07:27, Hu Tao ha scritto:
> Add parameter errp to memory_region_init_ram_ptr and update all call
> sites to pass in &error_abort.
> 
> Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>

Aborting in VFIO would be wrong, since VFIO devices can be hotplugged.  
But actually, ram_block_add can never fail when called from 
qemu_ram_alloc_from_ptr, so let's instead do:

diff --git a/exec.c b/exec.c
index 2b9c4c5..0ca73c8 100644
--- a/exec.c
+++ b/exec.c
@@ -1373,7 +1373,7 @@ ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
 #endif
 
 ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
-                                   MemoryRegion *mr, Error **errp)
+                                   MemoryRegion *mr)
 {
     RAMBlock *new_block;
     ram_addr_t addr;
@@ -1388,13 +1388,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
     if (host) {
         new_block->flags |= RAM_PREALLOC;
     }
-    addr = ram_block_add(new_block, &local_err);
-    if (local_err) {
-        g_free(new_block);
-        error_propagate(errp, local_err);
-        return -1;
-    }
-    return addr;
+    return ram_block_add(new_block, &error_abort);
 }
 
 ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr, Error **errp)
diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h
index cf1d4c7..7c6f80e 100644
--- a/include/exec/ram_addr.h
+++ b/include/exec/ram_addr.h
@@ -26,7 +26,7 @@ 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, Error **errp);
+                                   MemoryRegion *mr);
 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);

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

* Re: [Qemu-devel] [PATCH v7 RESEND 4/8] memory: add parameter errp to memory_region_init_rom_device
  2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 4/8] memory: add parameter errp to memory_region_init_rom_device Hu Tao
@ 2014-09-09 11:20   ` Paolo Bonzini
  2014-09-10  2:05     ` Hu Tao
  0 siblings, 1 reply; 17+ messages in thread
From: Paolo Bonzini @ 2014-09-09 11:20 UTC (permalink / raw)
  To: Hu Tao, qemu-devel
  Cc: Yasunori Goto, Peter Crosthwaite, Yasuaki Isimatu, Michael S. Tsirkin

Il 09/09/2014 07:27, Hu Tao ha scritto:
> Add parameter errp to memory_region_init_rom_device and update all call
> sites to pass in &error_abort.
> 
> Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>

Better not use error_abort if we can avoid it, and here it's particularly
easy...

Paolo

diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c
index f15b4fe..688184e 100644
--- a/hw/block/pflash_cfi01.c
+++ b/hw/block/pflash_cfi01.c
@@ -750,6 +750,7 @@ static void pflash_cfi01_realize(DeviceState *dev, Error **errp)
     int ret;
     uint64_t blocks_per_device, device_len;
     int num_devices;
+    Error *local_err = NULL;
 
     total_len = pfl->sector_len * pfl->nb_blocs;
 
@@ -770,7 +771,12 @@ 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, &error_abort);
+        pfl->name, total_len, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return NULL;
+    }
+
     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 29bb0dc..39b44f3 100644
--- a/hw/block/pflash_cfi02.c
+++ b/hw/block/pflash_cfi02.c
@@ -597,6 +597,7 @@ static void pflash_cfi02_realize(DeviceState *dev, Error **errp)
     pflash_t *pfl = CFI_PFLASH02(dev);
     uint32_t chip_len;
     int ret;
+    Error *local_err = NULL;
 
     chip_len = pfl->sector_len * pfl->nb_blocs;
     /* XXX: to be fixed */
@@ -608,7 +609,12 @@ 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, &error_abort);
+                                  pfl, pfl->name, chip_len, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return NULL;
+    }
+
     vmstate_register_ram(&pfl->orig_mem, DEVICE(pfl));
     pfl->storage = memory_region_get_ram_ptr(&pfl->orig_mem);
     pfl->chip_len = chip_len;

> ---
>  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 593fbc5..4d51bfd 100644
> --- a/hw/block/pflash_cfi01.c
> +++ b/hw/block/pflash_cfi01.c
> @@ -773,7 +773,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 e196f4d..29bb0dc 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 dcb35a2..4921d27 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 ffe24ff..38c29df 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -1202,7 +1202,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;
> @@ -1210,7 +1211,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,
> 

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

* Re: [Qemu-devel] [PATCH v7 RESEND 6/8] exec: file_ram_alloc: don't exit if failed to preallocate memory
  2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 6/8] exec: file_ram_alloc: don't exit if failed to preallocate memory Hu Tao
@ 2014-09-09 11:23   ` Paolo Bonzini
  0 siblings, 0 replies; 17+ messages in thread
From: Paolo Bonzini @ 2014-09-09 11:23 UTC (permalink / raw)
  To: Hu Tao, qemu-devel
  Cc: Yasunori Goto, Peter Crosthwaite, Yasuaki Isimatu, Michael S. Tsirkin

Il 09/09/2014 07:27, Hu Tao ha scritto:
> diff --git a/exec.c b/exec.c
> index 2b9c4c5..0362cd8 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -1129,8 +1129,8 @@ static void *file_ram_alloc(RAMBlock *block,
>      return area;
>  
>  error:
> -    if (mem_prealloc) {
> -        exit(1);
> +    if (area && area != MAP_FAILED) {
> +        munmap(area, memory);
>      }

"area" is being used uninitialized here, and os_mem_prealloc can still
do exit(1).  I'm not sure what this patch is doing...

Paolo

>      return NULL;

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

* Re: [Qemu-devel] [PATCH v7 RESEND 2/8] memory: add parameter errp to memory_region_init_ram
  2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 2/8] memory: add parameter errp to memory_region_init_ram Hu Tao
@ 2014-09-09 11:28   ` Paolo Bonzini
  0 siblings, 0 replies; 17+ messages in thread
From: Paolo Bonzini @ 2014-09-09 11:28 UTC (permalink / raw)
  To: Hu Tao, qemu-devel
  Cc: Yasunori Goto, Peter Crosthwaite, Yasuaki Isimatu, Michael S. Tsirkin

Il 09/09/2014 07:27, Hu Tao ha scritto:
> 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>
> 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(-)

Please modify the init or realize functions to not use error_abort (PCI
devices will have to use qerror_report_err).  A patch on top of this one
will do.

Paolo

> 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 31947d9..5310006 100644
> --- a/hw/alpha/typhoon.c
> +++ b/hw/alpha/typhoon.c
> @@ -844,7 +844,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 aedef13..ef24ca4 100644
> --- a/hw/arm/armv7m.c
> +++ b/hw/arm/armv7m.c
> @@ -210,11 +210,12 @@ qemu_irq *armv7m_init(MemoryRegion *system_memory,
>  #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(system_memory, 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(system_memory, 0x20000000, sram);
>      armv7m_bitband_init();
> @@ -255,7 +256,7 @@ qemu_irq *armv7m_init(MemoryRegion *system_memory,
>      /* 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(system_memory, 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 d6fffc7..89b4ed5 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -510,7 +510,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 597b117..5f3a859 100644
> --- a/hw/core/loader.c
> +++ b/hw/core/loader.c
> @@ -701,7 +701,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 652af99..55d13a7 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);
> @@ -2095,7 +2095,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 62e6243..d5f5a01 100644
> --- a/hw/display/vga.c
> +++ b/hw/display/vga.c
> @@ -2326,7 +2326,8 @@ void vga_common_init(VGACommonState *s, Object *obj, bool global_vmstate)
>      }
>  
>      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 17c7d6dc..13b9de0 100644
> --- a/hw/i386/kvm/pci-assign.c
> +++ b/hw/i386/kvm/pci-assign.c
> @@ -1936,7 +1936,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 b6c9b61..77b6782 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1273,7 +1273,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 6843abf..fcb51bc 100644
> --- a/hw/microblaze/petalogix_ml605_mmu.c
> +++ b/hw/microblaze/petalogix_ml605_mmu.c
> @@ -99,11 +99,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, MEMORY_BASEADDR, 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 d1e9a2a..6ce75aa 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 8453bfa..1626db4 100644
> --- a/hw/ppc/mac_newworld.c
> +++ b/hw/ppc/mac_newworld.c
> @@ -206,7 +206,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 630a9f9..be9a194 100644
> --- a/hw/ppc/mac_oldworld.c
> +++ b/hw/ppc/mac_oldworld.c
> @@ -136,7 +136,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 e538b1f..bc4dc2a 100644
> --- a/hw/s390x/s390-virtio-ccw.c
> +++ b/hw/s390x/s390-virtio-ccw.c
> @@ -131,7 +131,7 @@ static void ccw_init(MachineState *machine)
>      virtio_ccw_register_hcalls();
>  
>      /* allocate RAM for core */
> -    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 4ca52b7..9c61246 100644
> --- a/hw/s390x/s390-virtio.c
> +++ b/hw/s390x/s390-virtio.c
> @@ -260,7 +260,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 b9f3bee..9c77e18 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 ea381d6..fd4131b 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 17cf40d..95fbaf8 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -1142,13 +1142,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 f07149b..3b98135 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 0d09940..38059f3 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);
>  
> 

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

* Re: [Qemu-devel] [PATCH v7 RESEND 0/8] memory API improvements and bug fixes for memory backends
  2014-09-09  5:27 [Qemu-devel] [PATCH v7 RESEND 0/8] memory API improvements and bug fixes for memory backends Hu Tao
                   ` (7 preceding siblings ...)
  2014-09-09  5:28 ` [Qemu-devel] [PATCH v7 RESEND 8/8] exec: add parameter errp to gethugepagesize Hu Tao
@ 2014-09-09 11:29 ` Paolo Bonzini
  2014-09-10  2:09   ` Hu Tao
  8 siblings, 1 reply; 17+ messages in thread
From: Paolo Bonzini @ 2014-09-09 11:29 UTC (permalink / raw)
  To: Hu Tao, qemu-devel
  Cc: Yasunori Goto, Peter Crosthwaite, Yasuaki Isimatu, Michael S. Tsirkin

Il 09/09/2014 07:27, Hu Tao ha scritto:
> This is merely a rebase of v7, and fixes two merge conflicts.
> 
> 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-8, each fixes a bug of memory backend.
>  
> changes:
> 
>   v7:
>   - split the memory-file preallocation fix into its own patch(patch 6)
>   - some commit messages tweaks
> 
>   v6:
>   - split patch 6 in v5 into 2
>   - use local_err instead of errp
>   - typo fixes
> 
>   v5:
>   - 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.
> 
>   v4:
>   - fix build on 32bit host
>   - add memory API renaming
>   - rebase on latest master
> 
>   v3:
>   - introduce memory_region_init_ram_may_fail and
>     memory_region_init_ram_ptr_may_fail
>   - address comments by MST
>   - missing the functions renaming. will send later.
> 
>   v2:
>   - split patch 1 in v1 into 2 patches
>   - don't rely on ram_block_add to return -1
>   - error message tweak in file_ram_alloc
>   - add error messages reported by qemu to commit message of patch 3
> 
>   v1:
>   - initial version
> 
> 
> Hu Tao (8):
>   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: file_ram_alloc: don't exit if failed to preallocate memory
>   exec: report error when memory < hpagesize
>   exec: add parameter errp to gethugepagesize
> 
>  backends/hostmem-ram.c                   |  2 +-
>  exec.c                                   | 60 ++++++++++++++++++++++----------
>  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, 270 insertions(+), 162 deletions(-)
> 

Thanks, all patches except patch 6 are now in the memory branch.

Paolo

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

* Re: [Qemu-devel] [PATCH v7 RESEND 4/8] memory: add parameter errp to memory_region_init_rom_device
  2014-09-09 11:20   ` Paolo Bonzini
@ 2014-09-10  2:05     ` Hu Tao
  2014-09-10  9:11       ` Paolo Bonzini
  0 siblings, 1 reply; 17+ messages in thread
From: Hu Tao @ 2014-09-10  2:05 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: Peter Crosthwaite, Michael S. Tsirkin, qemu-devel,
	Yasuaki Isimatu, Yasunori Goto

On Tue, Sep 09, 2014 at 01:20:57PM +0200, Paolo Bonzini wrote:
> Il 09/09/2014 07:27, Hu Tao ha scritto:
> > Add parameter errp to memory_region_init_rom_device and update all call
> > sites to pass in &error_abort.
> > 
> > Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> > Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> 
> Better not use error_abort if we can avoid it, and here it's particularly
> easy...

Is error_abort deprecated?

Regards,
Hu

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

* Re: [Qemu-devel] [PATCH v7 RESEND 0/8] memory API improvements and bug fixes for memory backends
  2014-09-09 11:29 ` [Qemu-devel] [PATCH v7 RESEND 0/8] memory API improvements and bug fixes for memory backends Paolo Bonzini
@ 2014-09-10  2:09   ` Hu Tao
  0 siblings, 0 replies; 17+ messages in thread
From: Hu Tao @ 2014-09-10  2:09 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: Peter Crosthwaite, Michael S. Tsirkin, qemu-devel,
	Yasuaki Isimatu, Yasunori Goto

On Tue, Sep 09, 2014 at 01:29:21PM +0200, Paolo Bonzini wrote:
> Il 09/09/2014 07:27, Hu Tao ha scritto:
> > This is merely a rebase of v7, and fixes two merge conflicts.
> > 
> > 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-8, each fixes a bug of memory backend.
> >  
> > changes:
> > 
> >   v7:
> >   - split the memory-file preallocation fix into its own patch(patch 6)
> >   - some commit messages tweaks
> > 
> >   v6:
> >   - split patch 6 in v5 into 2
> >   - use local_err instead of errp
> >   - typo fixes
> > 
> >   v5:
> >   - 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.
> > 
> >   v4:
> >   - fix build on 32bit host
> >   - add memory API renaming
> >   - rebase on latest master
> > 
> >   v3:
> >   - introduce memory_region_init_ram_may_fail and
> >     memory_region_init_ram_ptr_may_fail
> >   - address comments by MST
> >   - missing the functions renaming. will send later.
> > 
> >   v2:
> >   - split patch 1 in v1 into 2 patches
> >   - don't rely on ram_block_add to return -1
> >   - error message tweak in file_ram_alloc
> >   - add error messages reported by qemu to commit message of patch 3
> > 
> >   v1:
> >   - initial version
> > 
> > 
> > Hu Tao (8):
> >   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: file_ram_alloc: don't exit if failed to preallocate memory
> >   exec: report error when memory < hpagesize
> >   exec: add parameter errp to gethugepagesize
> > 
> >  backends/hostmem-ram.c                   |  2 +-
> >  exec.c                                   | 60 ++++++++++++++++++++++----------
> >  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, 270 insertions(+), 162 deletions(-)
> > 
> 
> Thanks, all patches except patch 6 are now in the memory branch.

Thanks! After you updating your public repo, I will test with the memory
branch to see if the problem patch 6 fixed exists or not.

Regards,
Hu

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

* Re: [Qemu-devel] [PATCH v7 RESEND 4/8] memory: add parameter errp to memory_region_init_rom_device
  2014-09-10  2:05     ` Hu Tao
@ 2014-09-10  9:11       ` Paolo Bonzini
  0 siblings, 0 replies; 17+ messages in thread
From: Paolo Bonzini @ 2014-09-10  9:11 UTC (permalink / raw)
  To: Hu Tao
  Cc: Peter Crosthwaite, Michael S. Tsirkin, qemu-devel,
	Yasuaki Isimatu, Yasunori Goto

Il 10/09/2014 04:05, Hu Tao ha scritto:
>> > 
>> > Better not use error_abort if we can avoid it, and here it's particularly
>> > easy...
> Is error_abort deprecated?

No, not at at all.  It is useful whenever you know that an error cannot
happen.  However, if it makes sense and it is easy, error propagation is
better.  For every patch today that removes an exit(1), tomorrow we
could have a patch that removes an &error_abort.

Paolo

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

end of thread, other threads:[~2014-09-10  9:11 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-09-09  5:27 [Qemu-devel] [PATCH v7 RESEND 0/8] memory API improvements and bug fixes for memory backends Hu Tao
2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 1/8] exec: add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr Hu Tao
2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 2/8] memory: add parameter errp to memory_region_init_ram Hu Tao
2014-09-09 11:28   ` Paolo Bonzini
2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 3/8] memory: add parameter errp to memory_region_init_ram_ptr Hu Tao
2014-09-09 11:18   ` Paolo Bonzini
2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 4/8] memory: add parameter errp to memory_region_init_rom_device Hu Tao
2014-09-09 11:20   ` Paolo Bonzini
2014-09-10  2:05     ` Hu Tao
2014-09-10  9:11       ` Paolo Bonzini
2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 5/8] hostmem-ram: don't exit qemu if size of memory-backend-ram is way too big Hu Tao
2014-09-09  5:27 ` [Qemu-devel] [PATCH v7 RESEND 6/8] exec: file_ram_alloc: don't exit if failed to preallocate memory Hu Tao
2014-09-09 11:23   ` Paolo Bonzini
2014-09-09  5:28 ` [Qemu-devel] [PATCH v7 RESEND 7/8] exec: report error when memory < hpagesize Hu Tao
2014-09-09  5:28 ` [Qemu-devel] [PATCH v7 RESEND 8/8] exec: add parameter errp to gethugepagesize Hu Tao
2014-09-09 11:29 ` [Qemu-devel] [PATCH v7 RESEND 0/8] memory API improvements and bug fixes for memory backends Paolo Bonzini
2014-09-10  2:09   ` 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.