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]>
---
libkvm/libkvm.c | 34 +++++++++++++---------------------
libkvm/libkvm.h | 4 +---
qemu/qemu-kvm.c | 12 ++++--------
3 files changed, 18 insertions(+), 32 deletions(-)
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);
--
1.5.5.1
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html