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