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