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 | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/memory.c b/memory.c index f9b9745..7135299 100644 --- a/memory.c +++ b/memory.c @@ -828,6 +828,23 @@ 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) +{ + MemoryRegion *parent = mr->parent; + + if (parent) { + memory_region_transaction_begin(); + memory_region_ref(mr); + memory_region_del_subregion(parent, mr); + mr->parent = parent; + 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, @@ -1506,19 +1523,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 || !parent) { + 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); - memory_region_add_subregion_common(parent, addr, mr); - memory_region_unref(mr); - memory_region_transaction_commit(); } void memory_region_set_alias_offset(MemoryRegion *mr, hwaddr offset) -- 2.0.0