diff options
-rw-r--r-- | memory.c | 24 | ||||
-rw-r--r-- | memory.h | 1 |
2 files changed, 21 insertions, 4 deletions
@@ -165,10 +165,14 @@ static void flatview_simplify(FlatView *view) } } +static void memory_region_prepare_ram_addr(MemoryRegion *mr); + static void as_memory_range_add(AddressSpace *as, FlatRange *fr) { ram_addr_t phys_offset, region_offset; + memory_region_prepare_ram_addr(fr->mr); + phys_offset = fr->mr->ram_addr; region_offset = fr->offset_in_region; /* cpu_register_physical_memory_log() wants region_offset for @@ -519,6 +523,19 @@ static CPUWriteMemoryFunc * const memory_region_write_thunk[] = { memory_region_write_thunk_l, }; +static void memory_region_prepare_ram_addr(MemoryRegion *mr) +{ + if (mr->backend_registered) { + return; + } + + mr->ram_addr = cpu_register_io_memory(memory_region_read_thunk, + memory_region_write_thunk, + mr, + mr->ops->endianness); + mr->backend_registered = true; +} + void memory_region_init_io(MemoryRegion *mr, const MemoryRegionOps *ops, void *opaque, @@ -529,10 +546,7 @@ void memory_region_init_io(MemoryRegion *mr, mr->ops = ops; mr->opaque = opaque; mr->terminates = true; - mr->ram_addr = cpu_register_io_memory(memory_region_read_thunk, - memory_region_write_thunk, - mr, - mr->ops->endianness); + mr->backend_registered = false; } void memory_region_init_ram(MemoryRegion *mr, @@ -543,6 +557,7 @@ void memory_region_init_ram(MemoryRegion *mr, memory_region_init(mr, name, size); mr->terminates = true; mr->ram_addr = qemu_ram_alloc(dev, name, size); + mr->backend_registered = true; } void memory_region_init_ram_ptr(MemoryRegion *mr, @@ -554,6 +569,7 @@ void memory_region_init_ram_ptr(MemoryRegion *mr, memory_region_init(mr, name, size); mr->terminates = true; mr->ram_addr = qemu_ram_alloc_from_ptr(dev, name, size, ptr); + mr->backend_registered = true; } void memory_region_init_alias(MemoryRegion *mr, @@ -89,6 +89,7 @@ struct MemoryRegion { uint64_t size; target_phys_addr_t addr; target_phys_addr_t offset; + bool backend_registered; ram_addr_t ram_addr; bool terminates; MemoryRegion *alias; |