# HG changeset patch # User Jerone Young <[EMAIL PROTECTED]> # Date 1194367646 21600 # Node ID e82588d0a81df7955c12bf18c27d095f46545b6e # Parent e564a557782efc23428705de12cd3e8b9517e11c Move fuction kvm_alloc_kernel_memory to libkvm-x86.c
Signed-off-by: Jerone Young <[EMAIL PROTECTED]> diff --git a/libkvm/Makefile b/libkvm/Makefile --- a/libkvm/Makefile +++ b/libkvm/Makefile @@ -21,7 +21,7 @@ autodepend-flags = -MMD -MF $(dir $*).$( all: libkvm.a -libkvm.a: libkvm.o +libkvm.a: libkvm.o $(libkvm-$(ARCH)-objs) $(AR) rcs $@ $^ install: diff --git a/libkvm/config-i386.mak b/libkvm/config-i386.mak --- a/libkvm/config-i386.mak +++ b/libkvm/config-i386.mak @@ -2,3 +2,5 @@ LIBDIR := /lib LIBDIR := /lib CFLAGS += -m32 CFLAGS += -D__i386__ + +libkvm-$(ARCH)-objs := libkvm-x86.o diff --git a/libkvm/config-x86_64.mak b/libkvm/config-x86_64.mak --- a/libkvm/config-x86_64.mak +++ b/libkvm/config-x86_64.mak @@ -2,3 +2,5 @@ LIBDIR := /lib64 LIBDIR := /lib64 CFLAGS += -m64 CFLAGS += -D__x86_64__ + +libkvm-$(ARCH)-objs := libkvm-x86.o diff --git a/libkvm/kvm-x86.h b/libkvm/kvm-x86.h --- a/libkvm/kvm-x86.h +++ b/libkvm/kvm-x86.h @@ -23,4 +23,8 @@ #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-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 "kvm-x86.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.c b/libkvm/libkvm.c --- a/libkvm/libkvm.c +++ b/libkvm/libkvm.c @@ -317,79 +317,6 @@ int kvm_get_shadow_pages(kvm_context_t k 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 ------------------------------------------------------------------------- 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