From: Glauber Costa <[EMAIL PROTECTED]>

Signed-off-by: Glauber Costa <[EMAIL PROTECTED]>
Signed-off-by: Avi Kivity <[EMAIL PROTECTED]>

diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c
index f7a7fdd..88d3f5d 100644
--- a/libkvm/libkvm.c
+++ b/libkvm/libkvm.c
@@ -508,6 +508,18 @@ void kvm_destroy_phys_mem(kvm_context_t kvm, unsigned long 
phys_start,
        free_slot(memory.slot);
 }
 
+void kvm_unregister_memory_area(kvm_context_t kvm, uint64_t phys_addr, 
unsigned long size)
+{
+
+       int slot = get_container_slot(phys_addr, size);
+
+       if (slot != -1) {
+               DPRINTF("Unregistering memory region %llx (%lx)\n", phys_addr, 
size);
+               kvm_destroy_phys_mem(kvm, phys_addr, size);
+               return;
+       }
+}
+
 static int kvm_get_map(kvm_context_t kvm, int ioctl_num, int slot, void *buf)
 {
        int r;
diff --git a/libkvm/libkvm.h b/libkvm/libkvm.h
index cb77c6c..14ea93b 100644
--- a/libkvm/libkvm.h
+++ b/libkvm/libkvm.h
@@ -454,6 +454,9 @@ void *kvm_create_phys_mem(kvm_context_t, unsigned long 
phys_start,
                          unsigned long len, int log, int writable);
 void kvm_destroy_phys_mem(kvm_context_t, unsigned long phys_start, 
                          unsigned long len);
+void kvm_unregister_memory_area(kvm_context_t, uint64_t phys_start,
+                                unsigned long len);
+
 int kvm_is_containing_region(kvm_context_t kvm, unsigned long phys_start, 
unsigned long size);
 int kvm_register_phys_mem(kvm_context_t kvm,
                        unsigned long phys_start, void *userspace_addr,
diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c
index 07cffef..1da253a 100644
--- a/qemu/qemu-kvm.c
+++ b/qemu/qemu-kvm.c
@@ -768,8 +768,15 @@ void kvm_cpu_register_physical_memory(target_phys_addr_t 
start_addr,
                                       unsigned long phys_offset)
 {
     int r = 0;
+    unsigned long area_flags = phys_offset & ~TARGET_PAGE_MASK;
 
     phys_offset &= ~IO_MEM_ROM;
+
+    if (area_flags == IO_MEM_UNASSIGNED) {
+        kvm_unregister_memory_area(kvm_context, start_addr, size);
+        return;
+    }
+
     r = kvm_is_containing_region(kvm_context, start_addr, size);
     if (r)
         return;
--
To unsubscribe from this list: send the line "unsubscribe kvm-commits" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to