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