repository: /home/avi/kvm
branch: (no branch)
commit ee05127e6a6c6d7eba0e4b463da9711ceacad100
Author: Izik Eidus <[EMAIL PROTECTED]>
Date:   Wed Nov 7 18:46:53 2007 +0200

    kvm: libkvm: track more memory slot fields
    
    Signed-off-by: Izik Eidus <[EMAIL PROTECTED]>

diff --git a/libkvm/kvm-common.h b/libkvm/kvm-common.h
index d183a23..625860e 100644
--- a/libkvm/kvm-common.h
+++ b/libkvm/kvm-common.h
@@ -53,7 +53,9 @@ struct kvm_context {
 
 void init_slots(void);
 int get_free_slot(kvm_context_t kvm);
-void register_slot(int slot, unsigned long phys_addr);
+void register_slot(int slot, unsigned long phys_addr, unsigned long len,
+                  int user_alloc, unsigned long userspace_addr);
+void free_slot(int slot);
 int get_slot(unsigned long phys_addr);
 void kvm_memory_region_save_params(kvm_context_t kvm,
                                         struct kvm_memory_region *mem);
diff --git a/libkvm/libkvm-x86.c b/libkvm/libkvm-x86.c
index df4c02d..5593e97 100644
--- a/libkvm/libkvm-x86.c
+++ b/libkvm/libkvm-x86.c
@@ -51,7 +51,9 @@ int kvm_alloc_kernel_memory(kvm_context_t kvm, unsigned long 
memory,
                fprintf(stderr, "kvm_create_memory_region: %m\n");
                return -1;
        }
-       register_slot(low_memory.slot, low_memory.guest_phys_addr);
+       register_slot(low_memory.slot, low_memory.guest_phys_addr,
+                     low_memory.memory_size, 0, 0);
+
 
        if (extended_memory.memory_size) {
                if (tss_ext > 0)
@@ -63,8 +65,9 @@ int kvm_alloc_kernel_memory(kvm_context_t kvm, unsigned long 
memory,
                        fprintf(stderr, "kvm_create_memory_region: %m\n");
                        return -1;
                }
-               register_slot(extended_memory.slot,
-                             extended_memory.guest_phys_addr);
+               register_slot(extended_memory.slot,
+                             extended_memory.guest_phys_addr,
+                             extended_memory.memory_size, 0, 0);
        }
 
        if (above_4g_memory.memory_size) {
@@ -74,8 +77,9 @@ int kvm_alloc_kernel_memory(kvm_context_t kvm, unsigned long 
memory,
                        fprintf(stderr, "kvm_create_memory_region: %m\n");
                        return -1;
                }
-               register_slot(above_4g_memory.slot,
-                             above_4g_memory.guest_phys_addr);
+               register_slot(above_4g_memory.slot,
+                             above_4g_memory.guest_phys_addr,
+                             above_4g_memory.memory_size, 0, 0);
        }
 
        kvm_memory_region_save_params(kvm, &low_memory);
@@ -141,7 +145,8 @@ int kvm_alloc_userspace_memory(kvm_context_t kvm, unsigned 
long memory,
                fprintf(stderr, "kvm_create_memory_region: %m\n");
                return -1;
        }
-       register_slot(low_memory.slot, low_memory.guest_phys_addr);
+       register_slot(low_memory.slot, low_memory.guest_phys_addr,
+                     low_memory.memory_size, 1, low_memory.userspace_addr);
 
        if (extended_memory.memory_size) {
                r = munmap(*vm_mem + dosmem, exmem - dosmem);
@@ -161,7 +166,9 @@ int kvm_alloc_userspace_memory(kvm_context_t kvm, unsigned 
long memory,
                        return -1;
                }
                register_slot(extended_memory.slot,
-                             extended_memory.guest_phys_addr);
+                             extended_memory.guest_phys_addr,
+                             extended_memory.memory_size, 1,
+                             extended_memory.userspace_addr);
        }
 
        if (above_4g_memory.memory_size) {
@@ -179,7 +186,9 @@ int kvm_alloc_userspace_memory(kvm_context_t kvm, unsigned 
long memory,
                        return -1;
                }
                register_slot(above_4g_memory.slot,
-                             above_4g_memory.guest_phys_addr);
+                             above_4g_memory.guest_phys_addr,
+                             above_4g_memory.memory_size, 1,
+                             above_4g_memory.userspace_addr);
        }
 
        kvm_userspace_memory_region_save_params(kvm, &low_memory);
@@ -281,7 +290,8 @@ void *kvm_create_kernel_phys_mem(kvm_context_t kvm, 
unsigned long phys_start,
                fprintf(stderr, "create_kernel_phys_mem: %s", strerror(errno));
                return 0;
        }
-       register_slot(memory.slot, memory.guest_phys_addr);
+       register_slot(memory.slot, memory.guest_phys_addr, memory.memory_size,
+                     0, 0);
        kvm_memory_region_save_params(kvm, &memory);
 
        if (writable)
diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c
index 5c8352e..564d17f 100644
--- a/libkvm/libkvm.c
+++ b/libkvm/libkvm.c
@@ -43,15 +43,21 @@
 
 int kvm_abi = EXPECTED_KVM_API_VERSION;
 
-int free_slots[KVM_MAX_NUM_MEM_REGIONS];
-unsigned long phys_addr_slots[KVM_MAX_NUM_MEM_REGIONS];
+struct slot_info {
+       unsigned long phys_addr;
+       unsigned long len;
+       int user_alloc;
+       unsigned long userspace_addr;
+};
+
+struct slot_info slots[KVM_MAX_NUM_MEM_REGIONS];
 
 void init_slots(void)
 {
        int i;
 
        for (i = 0; i < KVM_MAX_NUM_MEM_REGIONS; ++i)
-               free_slots[i] = 0;
+               slots[i].len = 0;
 }
 
 int get_free_slot(kvm_context_t kvm)
@@ -76,24 +82,34 @@ int get_free_slot(kvm_context_t kvm)
                i = 1;
 
        for (; i < KVM_MAX_NUM_MEM_REGIONS; ++i)
-               if (!free_slots[i])
+               if (!slots[i].len)
                        return i;
        return -1;
 }
 
-void register_slot(int slot, unsigned long phys_addr)
+void register_slot(int slot, unsigned long phys_addr, unsigned long len,
+                  int user_alloc, unsigned long userspace_addr)
+{
+       slots[slot].phys_addr = phys_addr;
+       slots[slot].len = len;
+       slots[slot].user_alloc = user_alloc;
+       slots[slot].userspace_addr = userspace_addr;
+}
+
+void free_slot(int slot)
 {
-       free_slots[slot] = 1;
-       phys_addr_slots[slot] = phys_addr;
+       slots[slot].len = 0;
 }
 
 int get_slot(unsigned long phys_addr)
 {
        int i;
 
-       for (i = 0; i < KVM_MAX_NUM_MEM_REGIONS; ++i)
-               if (free_slots[i] && phys_addr_slots[i] == phys_addr)
+       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)
                        return i;
+       }
        return -1;
 }
 
@@ -432,7 +448,8 @@ void *kvm_create_userspace_phys_mem(kvm_context_t kvm, 
unsigned long phys_start,
                fprintf(stderr, "create_userspace_phys_mem: %s", 
strerror(errno));
                return 0;
        }
-       register_slot(memory.slot, memory.guest_phys_addr);
+       register_slot(memory.slot, memory.guest_phys_addr, memory.memory_size,
+                     1, memory.userspace_addr);
 
        kvm_userspace_memory_region_save_params(kvm, &memory);
 
@@ -479,7 +496,8 @@ int kvm_register_userspace_phys_mem(kvm_context_t kvm,
                fprintf(stderr, "create_userspace_phys_mem: %s\n", 
strerror(errno));
                return -1;
        }
-       register_slot(memory.slot, memory.guest_phys_addr);
+       register_slot(memory.slot, memory.guest_phys_addr, memory.memory_size,
+                     1, memory.userspace_addr);
 
        kvm_userspace_memory_region_save_params(kvm, &memory);
         return 0;

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
kvm-commits mailing list
kvm-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-commits

Reply via email to