qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 1/3] Add PhysicalMemoryRegion type


From: Avi Kivity
Subject: [Qemu-devel] [PATCH 1/3] Add PhysicalMemoryRegion type
Date: Sun, 24 May 2009 12:29:33 +0300

A PhysicalMemoryRegion represents a region in the physical address space.
Cuurently supported operations include creation and destruction.

Signed-off-by: Avi Kivity <address@hidden>
---
 cpu-all.h |   13 +++++++++++++
 exec.c    |   42 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+), 0 deletions(-)

diff --git a/cpu-all.h b/cpu-all.h
index 0df54b6..dc9c8b7 100644
--- a/cpu-all.h
+++ b/cpu-all.h
@@ -893,6 +893,19 @@ extern ram_addr_t last_ram_offset;
 typedef void CPUWriteMemoryFunc(void *opaque, target_phys_addr_t addr, 
uint32_t value);
 typedef uint32_t CPUReadMemoryFunc(void *opaque, target_phys_addr_t addr);
 
+typedef struct PhysicalMemoryRegion PhysicalMemoryRegion;
+
+PhysicalMemoryRegion *physical_memory_region_register(
+    target_phys_addr_t start_addr,
+    target_phys_addr_t size,
+    ram_addr_t ram_addr);
+PhysicalMemoryRegion *physical_memory_region_register_offset(
+    target_phys_addr_t start_addr,
+    target_phys_addr_t size,
+    ram_addr_t ram_addr,
+    ram_addr_t region_offset);
+void physical_memory_region_unregister(PhysicalMemoryRegion *pmr);
+
 void cpu_register_physical_memory_offset(target_phys_addr_t start_addr,
                                          ram_addr_t size,
                                          ram_addr_t phys_offset,
diff --git a/exec.c b/exec.c
index c5c9280..03c03dc 100644
--- a/exec.c
+++ b/exec.c
@@ -2418,6 +2418,48 @@ void 
cpu_register_physical_memory_offset(target_phys_addr_t start_addr,
     }
 }
 
+struct PhysicalMemoryRegion {
+    target_phys_addr_t start_addr;
+    target_phys_addr_t size;
+    ram_addr_t ram_addr;
+    ram_addr_t region_offset;
+};
+
+PhysicalMemoryRegion *physical_memory_region_register(
+    target_phys_addr_t start_addr,
+    target_phys_addr_t size,
+    ram_addr_t ram_addr)
+{
+    return physical_memory_region_register_offset(start_addr, size, ram_addr, 
0);
+}
+
+PhysicalMemoryRegion *physical_memory_region_register_offset(
+    target_phys_addr_t start_addr,
+    target_phys_addr_t size,
+    ram_addr_t ram_addr,
+    ram_addr_t region_offset)
+{
+    PhysicalMemoryRegion *pmr = (PhysicalMemoryRegion 
*)qemu_malloc(sizeof(*pmr));
+
+    pmr->start_addr = start_addr;
+    pmr->size = size;
+    pmr->ram_addr = ram_addr;
+    pmr->region_offset = region_offset;
+
+    cpu_register_physical_memory_offset(start_addr, size, ram_addr, 
region_offset);
+
+    return pmr;
+}
+
+void physical_memory_region_unregister(PhysicalMemoryRegion *pmr)
+{
+    if (kvm_enabled()) {
+        kvm_uncoalesce_mmio_region(pmr->start_addr, pmr->size);
+    }
+    cpu_register_physical_memory(pmr->start_addr, pmr->size, 
IO_MEM_UNASSIGNED);
+    qemu_free(pmr);
+}
+
 /* XXX: temporary until new memory mapping API */
 ram_addr_t cpu_get_physical_page_desc(target_phys_addr_t addr)
 {
-- 
1.6.0.6





reply via email to

[Prev in Thread] Current Thread [Next in Thread]