From: Glauber Costa <[EMAIL PROTECTED]>

is_allocated_mem is a function that checks if every relevant aspect of the
memory slot match (start and size). Replace it with a more generic function
that checks if a memory region is totally contained into another. The former
case is also covered.

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 c261053..11a9529 100644
--- a/libkvm/libkvm.c
+++ b/libkvm/libkvm.c
@@ -125,17 +125,27 @@ int get_slot(unsigned long phys_addr)
        return -1;
 }
 
-int get_intersecting_slot(unsigned long phys_addr)
+/* Returns -1 if this slot is not totally contained on any other,
+ * and the number of the slot otherwise */
+int get_container_slot(uint64_t phys_addr, unsigned long size)
 {
        int i;
 
        for (i = 0; i < KVM_MAX_NUM_MEM_REGIONS ; ++i)
-               if (slots[i].len && slots[i].phys_addr < phys_addr &&
-                   (slots[i].phys_addr + slots[i].len) > phys_addr)
+               if (slots[i].len && slots[i].phys_addr <= phys_addr &&
+                   (slots[i].phys_addr + slots[i].len) >= phys_addr + size)
                        return i;
        return -1;
 }
 
+int kvm_is_containing_region(kvm_context_t kvm, unsigned long phys_addr, 
unsigned long size)
+{
+       int slot = get_container_slot(phys_addr, size);
+       if (slot == -1)
+               return 0;
+       return 1;
+}
+
 /* 
  * dirty pages logging control 
  */
@@ -421,24 +431,6 @@ void *kvm_create_phys_mem(kvm_context_t kvm, unsigned long 
phys_start,
         return ptr;
 }
 
-int kvm_is_intersecting_mem(kvm_context_t kvm, unsigned long phys_start)
-{
-       return get_intersecting_slot(phys_start) != -1;
-}
-
-int kvm_is_allocated_mem(kvm_context_t kvm, unsigned long phys_start,
-                        unsigned long len)
-{
-       int slot;
-
-       slot = get_slot(phys_start);
-       if (slot == -1)
-               return 0;
-       if (slots[slot].len == len)
-               return 1;
-       return 0;
-}
-
 int kvm_register_phys_mem(kvm_context_t kvm,
                          unsigned long phys_start, void *userspace_addr,
                          unsigned long len, int log)
diff --git a/libkvm/libkvm.h b/libkvm/libkvm.h
index 77fd903..cb77c6c 100644
--- a/libkvm/libkvm.h
+++ b/libkvm/libkvm.h
@@ -454,9 +454,7 @@ 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);
-int kvm_is_intersecting_mem(kvm_context_t kvm, unsigned long phys_start);
-int kvm_is_allocated_mem(kvm_context_t kvm, unsigned long 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,
                        unsigned long len, int log);
diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c
index 3663d38..07cffef 100644
--- a/qemu/qemu-kvm.c
+++ b/qemu/qemu-kvm.c
@@ -770,16 +770,12 @@ void kvm_cpu_register_physical_memory(target_phys_addr_t 
start_addr,
     int r = 0;
 
     phys_offset &= ~IO_MEM_ROM;
-    r = kvm_is_allocated_mem(kvm_context, start_addr, size);
+    r = kvm_is_containing_region(kvm_context, start_addr, size);
     if (r)
         return;
-        r = kvm_is_intersecting_mem(kvm_context, start_addr);
-    if (r) {
-        printf("Ignoring intersecting memory %llx (%lx)\n", start_addr, size);
-    } else
-        r = kvm_register_phys_mem(kvm_context, start_addr,
-                                  phys_ram_base + phys_offset,
-                                  size, 0);
+    r = kvm_register_phys_mem(kvm_context, start_addr,
+                              phys_ram_base + phys_offset,
+                              size, 0);
     if (r < 0) {
         printf("kvm_cpu_register_physical_memory: failed\n");
         exit(1);
--
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