]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Initialize guest memory region properly
authorPekka Enberg <penberg@cs.helsinki.fi>
Wed, 24 Mar 2010 15:19:28 +0000 (17:19 +0200)
committerPekka Enberg <penberg@cs.helsinki.fi>
Wed, 24 Mar 2010 15:19:28 +0000 (17:19 +0200)
Use posix_memalign() to allocate memory for the guest and register the region
to KVM.

Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
tools/kvm/kvm.c

index 39765071541238337966e952d3c3fd1d6f562236..e6a8ae812843cb865a109bc68892d4533a9f106f 100644 (file)
@@ -8,6 +8,7 @@
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 #include <stdio.h>
 #include <fcntl.h>
 
@@ -23,6 +24,9 @@ struct kvm {
        int                     vm_fd;          /* For VM ioctls() */
        int                     vcpu_fd;        /* For VCPU ioctls() */
        struct kvm_run          *kvm_run;
+
+       uint64_t                ram_size;
+       void                    *ram_start;
 };
 
 static void die_perror(const char *s)
@@ -68,6 +72,7 @@ static struct kvm *kvm__init(void)
 {
        struct kvm_userspace_memory_region mem;
        struct kvm *self;
+       long page_size;
        int mmap_size;
        int ret;
 
@@ -88,10 +93,17 @@ static struct kvm *kvm__init(void)
        if (!kvm__supports_extension(self, KVM_CAP_USER_MEMORY))
                die("KVM_CAP_USER_MEMORY is not supported");
 
+       self->ram_size          = 64UL * 1024UL * 1024UL;
+
+       page_size       = sysconf(_SC_PAGESIZE);
+       if (posix_memalign(&self->ram_start, page_size, self->ram_size) != 0)
+               die("out of memory");
+
        mem = (struct kvm_userspace_memory_region) {
                .slot                   = 0,
                .guest_phys_addr        = 0x0UL,
-               .memory_size            = 64UL * 1024UL * 1024UL,
+               .memory_size            = self->ram_size,
+               .userspace_addr         = (unsigned long) self->ram_start,
        };
 
        ret = ioctl(self->vm_fd, KVM_SET_USER_MEMORY_REGION, &mem, 1);