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

Reply via email to