[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC v5 08/86] memory: late initialization of ram_addr
From: |
Avi Kivity |
Subject: |
[Qemu-devel] [RFC v5 08/86] memory: late initialization of ram_addr |
Date: |
Wed, 20 Jul 2011 19:49:18 +0300 |
For non-RAM memory regions, we cannot tell whether this is an I/O region
or an MMIO region. Since the qemu backing registration is different for
the two, we have to defer initialization until we know which address
space we are in.
These shenanigans will be removed once the backing registration is unified
with the memory API.
Signed-off-by: Avi Kivity <address@hidden>
---
memory.c | 24 ++++++++++++++++++++----
memory.h | 1 +
2 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/memory.c b/memory.c
index 5fda4a0..bc8bfa2 100644
--- a/memory.c
+++ b/memory.c
@@ -158,10 +158,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
@@ -512,6 +516,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,
@@ -522,10 +539,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,
@@ -536,6 +550,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,
@@ -547,6 +562,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,
diff --git a/memory.h b/memory.h
index 2ad7202..0994b18 100644
--- a/memory.h
+++ b/memory.h
@@ -76,6 +76,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;
--
1.7.5.3
- [Qemu-devel] [RFC v5 76/86] stellaris_enet: convert to memory API, (continued)
- [Qemu-devel] [RFC v5 76/86] stellaris_enet: convert to memory API, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 72/86] onenand: convert to memory API, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 32/86] exec.c: fix initialization of system I/O memory region, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 60/86] pci: rename pci_register_bar_region() to pci_register_bar(), Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 06/86] memory: abstract address space operations, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 49/86] i6300esb: convert to memory API, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 85/86] vga: drop get_system_memory() from vga devices and derivatives, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 27/86] cirrus: simplify bitblt BAR access functions, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 71/86] omap_gpmc/nseries/tusb6010: convert to memory API, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 40/86] ide: convert to memory API, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 08/86] memory: late initialization of ram_addr,
Avi Kivity <=
- [Qemu-devel] [RFC v5 80/86] versatile_pci: convert to memory API, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 50/86] isa-mmio: concert to memory API, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 39/86] es1370: convert to memory API, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 46/86] ppc: convert to memory API, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 44/86] intel-hda: convert to memory API, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 51/86] sun4u: convert to memory API, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 75/86] ppc4xx_sdram: convert to memory API, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 81/86] ppce500_pci: convert to sysbus_init_mmio_cb2(), Avi Kivity, 2011/07/20
- Re: [Qemu-devel] [RFC v5 00/86] Memory API, Jan Kiszka, 2011/07/20