[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 08/23] memory: late initialization of ram_addr
From: |
Avi Kivity |
Subject: |
[Qemu-devel] [PATCH v2 08/23] memory: late initialization of ram_addr |
Date: |
Tue, 26 Jul 2011 14:26:07 +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 9e1a838..e839c9e 100644
--- a/memory.c
+++ b/memory.c
@@ -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,
diff --git a/memory.h b/memory.h
index 47d6b9d..c481038 100644
--- a/memory.h
+++ b/memory.h
@@ -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;
--
1.7.5.3
- [Qemu-devel] [PATCH v2 04/23] memory: merge adjacent segments of a single memory region, (continued)
[Qemu-devel] [PATCH v2 03/23] memory: implement dirty tracking, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 10/23] memory: add backward compatibility for old portio registration, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 17/23] pc: grab system_memory, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 08/23] memory: late initialization of ram_addr,
Avi Kivity <=
[Qemu-devel] [PATCH v2 11/23] memory: add backward compatibility for old mmio registration, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 13/23] memory: separate building the final memory map into two steps, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 06/23] memory: abstract address space operations, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 14/23] memory: transaction API, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 09/23] memory: I/O address space support, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 15/23] exec.c: initialize memory map, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 05/23] Internal interfaces for memory API, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 19/23] pc: move global memory map out of pc_init1() and into its callers, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 02/23] Hierarchical memory region API, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 07/23] memory: rename MemoryRegion::has_ram_addr to ::terminates, Avi Kivity, 2011/07/26