aboutsummaryrefslogtreecommitdiff
path: root/memory-internal.h
diff options
context:
space:
mode:
authorAvi Kivity <avi@redhat.com>2012-10-03 16:22:53 +0200
committerAvi Kivity <avi@redhat.com>2012-10-22 14:50:08 +0200
commitac1970fbe8ad5a70174f462109ac0f6c7bf1bc43 (patch)
treeaa2f9702bfd593515b6fb7ee438f6cc5bacef74e /memory-internal.h
parent0e8a6d47afcc88564079387928f2da45736d36e8 (diff)
memory: per-AddressSpace dispatch
Currently we use a global radix tree to dispatch memory access. This only works with a single address space; to support multiple address spaces we make the radix tree a member of AddressSpace (via an intermediate structure AddressSpaceDispatch to avoid exposing too many internals). A side effect is that address_space_io also gains a dispatch table. When we remove all the pre-memory-API I/O registrations, we can use that for dispatching I/O and get rid of the original I/O dispatch. Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'memory-internal.h')
-rw-r--r--memory-internal.h22
1 files changed, 20 insertions, 2 deletions
diff --git a/memory-internal.h b/memory-internal.h
index 43fa886264..6d8711bb1f 100644
--- a/memory-internal.h
+++ b/memory-internal.h
@@ -22,6 +22,26 @@
#ifndef CONFIG_USER_ONLY
#include "hw/xen.h"
+typedef struct PhysPageEntry PhysPageEntry;
+
+struct PhysPageEntry {
+ uint16_t is_leaf : 1;
+ /* index into phys_sections (is_leaf) or phys_map_nodes (!is_leaf) */
+ uint16_t ptr : 15;
+};
+
+typedef struct AddressSpaceDispatch AddressSpaceDispatch;
+
+struct AddressSpaceDispatch {
+ /* This is a multi-level map on the physical address space.
+ * The bottom level has pointers to MemoryRegionSections.
+ */
+ PhysPageEntry phys_map;
+ MemoryListener listener;
+};
+
+void address_space_init_dispatch(AddressSpace *as);
+
ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
MemoryRegion *mr);
ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr);
@@ -30,8 +50,6 @@ void qemu_ram_free_from_ptr(ram_addr_t addr);
struct MemoryRegion;
struct MemoryRegionSection;
-void cpu_register_physical_memory_log(struct MemoryRegionSection *section,
- bool readonly);
void qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);