From: Uri Lublin <[EMAIL PROTECTED]>

In order to be able to turn dirty page logging on/off.

Signed-off-by: Uri Lublin <[EMAIL PROTECTED]>
Signed-off-by: Avi Kivity <[EMAIL PROTECTED]>

diff --git a/libkvm/kvm-common.h b/libkvm/kvm-common.h
index 65d137e..4ea902b 100644
--- a/libkvm/kvm-common.h
+++ b/libkvm/kvm-common.h
@@ -54,7 +54,8 @@ struct kvm_context {
 void init_slots(void);
 int get_free_slot(kvm_context_t kvm);
 void register_slot(int slot, unsigned long phys_addr, unsigned long len,
-                  int user_alloc, unsigned long userspace_addr);
+                  int user_alloc, unsigned long userspace_addr, unsigned 
flags);
+
 void free_slot(int slot);
 int get_slot(unsigned long phys_addr);
 
diff --git a/libkvm/libkvm-x86.c b/libkvm/libkvm-x86.c
index 1ca6c76..ca56adb 100644
--- a/libkvm/libkvm-x86.c
+++ b/libkvm/libkvm-x86.c
@@ -51,7 +51,7 @@ int kvm_alloc_kernel_memory(kvm_context_t kvm, unsigned long 
memory,
                return -1;
        }
        register_slot(low_memory.slot, low_memory.guest_phys_addr,
-                     low_memory.memory_size, 0, 0);
+                     low_memory.memory_size, 0, 0, 0);
 
 
        if (extended_memory.memory_size) {
@@ -66,7 +66,7 @@ int kvm_alloc_kernel_memory(kvm_context_t kvm, unsigned long 
memory,
                }
                register_slot(extended_memory.slot,
                              extended_memory.guest_phys_addr,
-                             extended_memory.memory_size, 0, 0);
+                             extended_memory.memory_size, 0, 0, 0);
        }
 
        if (above_4g_memory.memory_size) {
@@ -78,7 +78,7 @@ int kvm_alloc_kernel_memory(kvm_context_t kvm, unsigned long 
memory,
                }
                register_slot(above_4g_memory.slot,
                              above_4g_memory.guest_phys_addr,
-                             above_4g_memory.memory_size, 0, 0);
+                             above_4g_memory.memory_size, 0, 0, 0);
        }
 
        *vm_mem = mmap(NULL, memory, PROT_READ|PROT_WRITE, MAP_SHARED, 
kvm->vm_fd, 0);
@@ -193,7 +193,7 @@ void *kvm_create_kernel_phys_mem(kvm_context_t kvm, 
unsigned long phys_start,
                return 0;
        }
        register_slot(memory.slot, memory.guest_phys_addr, memory.memory_size,
-                     0, 0);
+                     0, 0, memory.flags);
 
        if (writable)
                prot |= PROT_WRITE;
diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c
index 573a9ab..8844074 100644
--- a/libkvm/libkvm.c
+++ b/libkvm/libkvm.c
@@ -52,6 +52,7 @@ struct slot_info {
        unsigned long len;
        int user_alloc;
        unsigned long userspace_addr;
+       unsigned flags;
 };
 
 struct slot_info slots[KVM_MAX_NUM_MEM_REGIONS];
@@ -92,12 +93,13 @@ int get_free_slot(kvm_context_t kvm)
 }
 
 void register_slot(int slot, unsigned long phys_addr, unsigned long len,
-                  int user_alloc, unsigned long userspace_addr)
+                  int user_alloc, unsigned long userspace_addr, unsigned flags)
 {
        slots[slot].phys_addr = phys_addr;
        slots[slot].len = len;
        slots[slot].user_alloc = user_alloc;
        slots[slot].userspace_addr = userspace_addr;
+        slots[slot].flags = flags;
 }
 
 void free_slot(int slot)
@@ -142,6 +144,7 @@ static int kvm_dirty_pages_log_change(kvm_context_t kvm, 
unsigned long phys_addr
                fprintf(stderr, "BUG: %s: invalid parameters\n", __FUNCTION__);
                return 1;
        }
+       flag |= slots[slot].flags;
 #ifdef KVM_CAP_USER_MEMORY
        if (slots[slot].user_alloc) {
                struct kvm_userspace_memory_region mem = {
@@ -418,7 +421,7 @@ void *kvm_create_userspace_phys_mem(kvm_context_t kvm, 
unsigned long phys_start,
                return 0;
        }
        register_slot(memory.slot, memory.guest_phys_addr, memory.memory_size,
-                     1, memory.userspace_addr);
+                     1, memory.userspace_addr, memory.flags);
 
         return ptr;
 }
@@ -487,6 +490,7 @@ int kvm_create_mem_hole(kvm_context_t kvm, unsigned long 
phys_start,
        newslot1.memory_size = phys_start - slots[slot].phys_addr;
        newslot1.slot = slot;
        newslot1.userspace_addr = slots[slot].userspace_addr;
+       newslot1.flags = slots[slot].flags;
 
        newslot2.guest_phys_addr = newslot1.guest_phys_addr +
                                   newslot1.memory_size + len;
@@ -495,6 +499,7 @@ int kvm_create_mem_hole(kvm_context_t kvm, unsigned long 
phys_start,
        newslot2.userspace_addr = newslot1.userspace_addr +
                                  newslot1.memory_size;
        newslot2.slot = get_free_slot(kvm);
+       newslot2.flags = newslot1.flags;
 
        r = ioctl(kvm->vm_fd, KVM_SET_USER_MEMORY_REGION, &rmslot);
        if (r == -1) {
@@ -509,7 +514,8 @@ int kvm_create_mem_hole(kvm_context_t kvm, unsigned long 
phys_start,
                return -1;
        }
        register_slot(newslot1.slot, newslot1.guest_phys_addr,
-                     newslot1.memory_size, 1, newslot1.userspace_addr);
+                     newslot1.memory_size, 1, newslot1.userspace_addr,
+                     newslot1.flags);
 
        r = ioctl(kvm->vm_fd, KVM_SET_USER_MEMORY_REGION, &newslot2);
        if (r == -1) {
@@ -517,7 +523,8 @@ int kvm_create_mem_hole(kvm_context_t kvm, unsigned long 
phys_start,
                return -1;
        }
        register_slot(newslot2.slot, newslot2.guest_phys_addr,
-                     newslot2.memory_size, 1, newslot2.userspace_addr);
+                     newslot2.memory_size, 1, newslot2.userspace_addr,
+                     newslot2.flags);
 #endif
        return 0;
 }
@@ -526,6 +533,7 @@ int kvm_register_userspace_phys_mem(kvm_context_t kvm,
                        unsigned long phys_start, void *userspace_addr,
                        unsigned long len, int log)
 {
+
 #ifdef KVM_CAP_USER_MEMORY
        struct kvm_userspace_memory_region memory = {
                .memory_size = len,
@@ -545,7 +553,7 @@ int kvm_register_userspace_phys_mem(kvm_context_t kvm,
                return -1;
        }
        register_slot(memory.slot, memory.guest_phys_addr, memory.memory_size,
-                     1, memory.userspace_addr);
+                     1, memory.userspace_addr, memory.flags);
         return 0;
 #else
        return -ENOSYS;

-------------------------------------------------------------------------
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