# HG changeset patch # User Jerone Young <[EMAIL PROTECTED]> # Date 1193849564 18000 # Node ID c2ae34bff407fe7e3cfc695efdd1cfd4e2242403 # Parent 9c74b8e493e67f544c017b6bef8dd047c128c8d3 Move fuction kvm_alloc_kernel_memory to kvmctl-x86.c
Signed-off-by: Jerone Young <[EMAIL PROTECTED]> diff --git a/libkvm/libkvm-x86.c b/libkvm/libkvm-x86.c new file mode 100644 --- /dev/null +++ b/libkvm/libkvm-x86.c @@ -0,0 +1,81 @@ +#include "libkvm.h" +#include <unistd.h> +#include <stropts.h> +#include <sys/mman.h> +#include <stdio.h> + +int kvm_alloc_kernel_memory(kvm_context_t kvm, unsigned long memory, + void **vm_mem) +{ + unsigned long dosmem = 0xa0000; + unsigned long exmem = 0xc0000; + unsigned long pcimem = 0xe0000000; + int r; + int tss_ext; + struct kvm_memory_region low_memory = { + .memory_size = memory < dosmem ? memory : dosmem, + .guest_phys_addr = 0, + }; + struct kvm_memory_region extended_memory = { + .memory_size = memory < exmem ? 0 : memory - exmem, + .guest_phys_addr = exmem, + }; + struct kvm_memory_region above_4g_memory = { + .memory_size = memory < pcimem ? 0 : memory - pcimem, + .guest_phys_addr = 0x100000000ULL, + }; + +#ifdef KVM_CAP_SET_TSS_ADDR + tss_ext = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_SET_TSS_ADDR); +#else + tss_ext = 0; +#endif + + if (memory >= pcimem) + extended_memory.memory_size = pcimem - exmem; + + /* 640K should be enough. */ + low_memory.slot = get_free_slot(kvm); + r = ioctl(kvm->vm_fd, KVM_SET_MEMORY_REGION, &low_memory); + if (r == -1) { + fprintf(stderr, "kvm_create_memory_region: %m\n"); + return -1; + } + register_slot(low_memory.slot, low_memory.guest_phys_addr); + + if (extended_memory.memory_size) { + if (tss_ext > 0) + extended_memory.slot = get_free_slot(kvm); + else + extended_memory.slot = 0; + r = ioctl(kvm->vm_fd, KVM_SET_MEMORY_REGION, &extended_memory); + if (r == -1) { + fprintf(stderr, "kvm_create_memory_region: %m\n"); + return -1; + } + register_slot(extended_memory.slot, + extended_memory.guest_phys_addr); + } + + if (above_4g_memory.memory_size) { + above_4g_memory.slot = get_free_slot(kvm); + r = ioctl(kvm->vm_fd, KVM_SET_MEMORY_REGION, &above_4g_memory); + if (r == -1) { + fprintf(stderr, "kvm_create_memory_region: %m\n"); + return -1; + } + register_slot(above_4g_memory.slot, + above_4g_memory.guest_phys_addr); + } + + kvm_memory_region_save_params(kvm, &low_memory); + kvm_memory_region_save_params(kvm, &extended_memory); + kvm_memory_region_save_params(kvm, &above_4g_memory); + if (above_4g_memory.memory_size) + kvm_memory_region_save_params(kvm, &above_4g_memory); + + *vm_mem = mmap(NULL, memory, PROT_READ|PROT_WRITE, MAP_SHARED, kvm->vm_fd, 0); + + return 0; +} + diff --git a/libkvm/libkvm-x86.h b/libkvm/libkvm-x86.h --- a/libkvm/libkvm-x86.h +++ b/libkvm/libkvm-x86.h @@ -1,7 +1,15 @@ #ifndef KVMCTL_X86_H #define KVMCTL_X86_H +/* FIXME: share this number with kvm */ +/* FIXME: or dynamically alloc/realloc regions */ #define KVM_MAX_NUM_MEM_REGIONS 8u #define MAX_VCPUS 4 +#define PAGE_SIZE 4096ul +#define PAGE_MASK (~(PAGE_SIZE - 1)) + +int kvm_alloc_kernel_memory(kvm_context_t kvm, unsigned long memory, + void **vm_mem); + #endif diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c --- a/libkvm/libkvm.c +++ b/libkvm/libkvm.c @@ -39,11 +39,6 @@ static int kvm_abi = EXPECTED_KVM_API_VERSION; -#define PAGE_SIZE 4096ul -#define PAGE_MASK (~(PAGE_SIZE - 1)) - -/* FIXME: share this number with kvm */ -/* FIXME: or dynamically alloc/realloc regions */ int free_slots[KVM_MAX_NUM_MEM_REGIONS]; unsigned long phys_addr_slots[KVM_MAX_NUM_MEM_REGIONS]; @@ -317,82 +312,6 @@ int kvm_get_shadow_pages(kvm_context_t k #endif return -1; } - -int kvm_alloc_kernel_memory(kvm_context_t kvm, unsigned long memory, - void **vm_mem) -{ - unsigned long dosmem = 0xa0000; - unsigned long exmem = 0xc0000; - unsigned long pcimem = 0xe0000000; - int r; - int tss_ext; - struct kvm_memory_region low_memory = { - .memory_size = memory < dosmem ? memory : dosmem, - .guest_phys_addr = 0, - }; - struct kvm_memory_region extended_memory = { - .memory_size = memory < exmem ? 0 : memory - exmem, - .guest_phys_addr = exmem, - }; - struct kvm_memory_region above_4g_memory = { - .memory_size = memory < pcimem ? 0 : memory - pcimem, - .guest_phys_addr = 0x100000000ULL, - }; - -#ifdef KVM_CAP_SET_TSS_ADDR - tss_ext = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_SET_TSS_ADDR); -#else - tss_ext = 0; -#endif - - if (memory >= pcimem) - extended_memory.memory_size = pcimem - exmem; - - /* 640K should be enough. */ - low_memory.slot = get_free_slot(kvm); - r = ioctl(kvm->vm_fd, KVM_SET_MEMORY_REGION, &low_memory); - if (r == -1) { - fprintf(stderr, "kvm_create_memory_region: %m\n"); - return -1; - } - register_slot(low_memory.slot, low_memory.guest_phys_addr); - - if (extended_memory.memory_size) { - if (tss_ext > 0) - extended_memory.slot = get_free_slot(kvm); - else - extended_memory.slot = 0; - r = ioctl(kvm->vm_fd, KVM_SET_MEMORY_REGION, &extended_memory); - if (r == -1) { - fprintf(stderr, "kvm_create_memory_region: %m\n"); - return -1; - } - register_slot(extended_memory.slot, - extended_memory.guest_phys_addr); - } - - if (above_4g_memory.memory_size) { - above_4g_memory.slot = get_free_slot(kvm); - r = ioctl(kvm->vm_fd, KVM_SET_MEMORY_REGION, &above_4g_memory); - if (r == -1) { - fprintf(stderr, "kvm_create_memory_region: %m\n"); - return -1; - } - register_slot(above_4g_memory.slot, - above_4g_memory.guest_phys_addr); - } - - kvm_memory_region_save_params(kvm, &low_memory); - kvm_memory_region_save_params(kvm, &extended_memory); - if (above_4g_memory.memory_size) - kvm_memory_region_save_params(kvm, &above_4g_memory); - - *vm_mem = mmap(NULL, memory, PROT_READ|PROT_WRITE, MAP_SHARED, kvm->vm_fd, 0); - - return 0; -} - -#ifdef KVM_CAP_USER_MEMORY int kvm_alloc_userspace_memory(kvm_context_t kvm, unsigned long memory, void **vm_mem) ------------------------------------------------------------------------- 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-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel