From: Uri Lublin <[EMAIL PROTECTED]> Same as with dirty-page-bitmap.
Signed-off-by: Izik Eidus <[EMAIL PROTECTED]> Signed-off-by: Avi Kivity <[EMAIL PROTECTED]> diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c index ad90e0b..93d7b6b 100644 --- a/libkvm/libkvm.c +++ b/libkvm/libkvm.c @@ -662,6 +662,29 @@ int kvm_get_mem_map(kvm_context_t kvm, unsigned long phys_addr, void *buf) #endif /* KVM_GET_MEM_MAP */ } +int kvm_get_mem_map_range(kvm_context_t kvm, unsigned long phys_addr, + unsigned long len, void *buf, void *opaque, + int (*cb)(unsigned long addr,unsigned long len, + void* bitmap, void* opaque)) +{ + int i; + int r; + unsigned long end_addr = phys_addr + len; + + 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) <= end_addr) { + r = kvm_get_mem_map(kvm, slots[i].phys_addr, buf); + if (r) + return r; + r = cb(slots[i].phys_addr, slots[i].len, buf, opaque); + if (r) + return r; + } + } + return 0; +} + #ifdef KVM_CAP_IRQCHIP int kvm_set_irq_level(kvm_context_t kvm, int irq, int level) diff --git a/libkvm/libkvm.h b/libkvm/libkvm.h index d999ce9..110912a 100644 --- a/libkvm/libkvm.h +++ b/libkvm/libkvm.h @@ -454,6 +454,10 @@ int kvm_destroy_memory_alias(kvm_context_t, uint64_t phys_addr); * \param bitmap Long aligned address of a big enough bitmap (one bit per page) */ int kvm_get_mem_map(kvm_context_t kvm, unsigned long phys_addr, void *bitmap); +int kvm_get_mem_map_range(kvm_context_t kvm, unsigned long phys_addr, + unsigned long len, void *buf, void *opaque, + int (*cb)(unsigned long start,unsigned long len, + void* bitmap, void* opaque)); int kvm_set_irq_level(kvm_context_t kvm, int irq, int level); /*! diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c index 5580bb4..cc47ca2 100644 --- a/qemu/qemu-kvm.c +++ b/qemu/qemu-kvm.c @@ -759,21 +759,34 @@ int kvm_update_dirty_pages_log(void) return r; } +int kvm_get_phys_ram_bitmap_cb(unsigned long start, unsigned long len, + void *local_bitmap, void *qemu_bitmap) +{ + unsigned int bsize = ((len/TARGET_PAGE_SIZE) + 7) / 8; + unsigned int offset = ((start/TARGET_PAGE_SIZE) + 7) / 8; + + memcpy(qemu_bitmap + offset, local_bitmap, bsize); + + return 0; +} + int kvm_get_phys_ram_page_bitmap(unsigned char *bitmap) { - int r=0, len, offset; - - len = BITMAP_SIZE(phys_ram_size); - memset(bitmap, 0, len); + int r=0; + void *local_bitmap; + unsigned int bsize = BITMAP_SIZE(phys_ram_size); - r = kvm_get_mem_map(kvm_context, 0, bitmap); - if (r) - goto out; + local_bitmap = qemu_malloc(bsize); + if (!local_bitmap) { + fprintf(stderr, "could not allocate memory for phys_page bitmap\n"); + return 1; + } - offset = BITMAP_SIZE(0xc0000); - r = kvm_get_mem_map(kvm_context, 0xc0000, bitmap + offset); + r = kvm_get_mem_map_range(kvm_context, 0, phys_ram_size, + local_bitmap, bitmap, + kvm_get_phys_ram_bitmap_cb); - out: + qemu_free(local_bitmap); return r; } ------------------------------------------------------------------------- SF.Net email is sponsored by: Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://sourceforge.net/services/buy/index.php _______________________________________________ kvm-commits mailing list kvm-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-commits