memory_region_set_address is mostly just a function that deletes and re-adds a memory region. Factor this generic functionality out into a re-usable function. This prepares support for further QOMification of MemoryRegion.
Signed-off-by: Peter Crosthwaite <peter.crosthwa...@xilinx.com> --- memory.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/memory.c b/memory.c index 4a70920..9b9cfad 100644 --- a/memory.c +++ b/memory.c @@ -829,6 +829,20 @@ static void memory_region_destructor_rom_device(MemoryRegion *mr) qemu_ram_free(mr->ram_addr & TARGET_PAGE_MASK); } +static void do_memory_region_add_subregion_common(MemoryRegion *subregion); + +static void memory_region_readd_subregion(MemoryRegion *mr) +{ + if (mr->contained) { + memory_region_transaction_begin(); + memory_region_ref(mr); + memory_region_del_subregion(mr->parent, mr); + do_memory_region_add_subregion_common(mr); + memory_region_unref(mr); + memory_region_transaction_commit(); + } +} + void memory_region_init(MemoryRegion *mr, Object *owner, const char *name, @@ -845,7 +859,6 @@ void memory_region_init(MemoryRegion *mr, mr->name = g_strdup(name); } -static void do_memory_region_add_subregion_common(MemoryRegion *subregion); static void memory_region_get_addr(Object *obj, Visitor *v, void *opaque, const char *name, Error **errp) @@ -1563,19 +1576,10 @@ void memory_region_set_enabled(MemoryRegion *mr, bool enabled) void memory_region_set_address(MemoryRegion *mr, hwaddr addr) { - MemoryRegion *parent = mr->parent; - - if (addr == mr->addr || !mr->contained) { + if (addr != mr->addr) { mr->addr = addr; - return; + memory_region_readd_subregion(mr); } - - memory_region_transaction_begin(); - memory_region_ref(mr); - memory_region_del_subregion(parent, mr); - do_memory_region_add_subregion_common(mr); - memory_region_unref(mr); - memory_region_transaction_commit(); } void memory_region_set_alias_offset(MemoryRegion *mr, hwaddr offset) -- 1.9.3.1.ga73a6ad