]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Add support for loading flat binaries
authorPekka Enberg <penberg@cs.helsinki.fi>
Fri, 26 Mar 2010 19:51:55 +0000 (21:51 +0200)
committerPekka Enberg <penberg@cs.helsinki.fi>
Fri, 26 Mar 2010 19:51:55 +0000 (21:51 +0200)
Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
tools/kvm/kvm.c

index ee581428992bd66f2d356b640253caef659984f8..f47a1f802b1c90217a97e6c8d2538d49e9a4b484 100644 (file)
@@ -148,8 +148,31 @@ void kvm__enable_singlestep(struct kvm *self)
                warning("KVM_SET_GUEST_DEBUG failed");
 }
 
+static inline uint32_t segment_to_flat(uint16_t selector, uint16_t offset)
+{
+       return ((uint32_t)selector << 4) + (uint32_t) offset;
+}
+
+#define KERNEL_BIN_START_ADDR  segment_to_flat(0xf000, 0xfff0)
+
+static uint32_t load_flat_binary(struct kvm *kvm, int fd)
+{
+       void *p;
+       int nr;
+
+       if (lseek(fd, 0, SEEK_SET) < 0)
+               die_perror("lseek");
+
+       p = guest_addr_to_host(kvm, KERNEL_BIN_START_ADDR);
+
+       while ((nr = read(fd, p, 65536)) > 0)
+               p += nr;
+
+       return KERNEL_BIN_START_ADDR;
+}
+
 /* bzImages are loaded at 1 MB by default.  */
-#define KERNEL_START_ADDR      (1024ULL * 1024ULL)
+#define KERNEL_BZ_START_ADDR   (1024ULL * 1024ULL)
 
 static const char *BZIMAGE_MAGIC       = "HdrS";
 
@@ -159,6 +182,9 @@ static uint32_t load_bzimage(struct kvm *kvm, int fd)
        void *p;
        int nr;
 
+       if (lseek(fd, 0, SEEK_SET) < 0)
+               die_perror("lseek");
+
        read(fd, &boot, sizeof(boot));
 
         if (memcmp(&boot.hdr.header, BZIMAGE_MAGIC, strlen(BZIMAGE_MAGIC)) != 0)
@@ -166,7 +192,7 @@ static uint32_t load_bzimage(struct kvm *kvm, int fd)
 
        lseek(fd, (boot.hdr.setup_sects+1) * 512, SEEK_SET);
 
-       p = guest_addr_to_host(kvm, KERNEL_START_ADDR);
+       p = guest_addr_to_host(kvm, KERNEL_BZ_START_ADDR);
 
        while ((nr = read(fd, p, 65536)) > 0)
                p += nr;
@@ -184,9 +210,16 @@ uint32_t kvm__load_kernel(struct kvm *kvm, const char *kernel_filename)
                die("unable to open kernel");
 
        ret = load_bzimage(kvm, fd);
-       if (!ret)
-               die("%s is not a valid bzImage", kernel_filename);
+       if (ret)
+               goto found_kernel;
+
+       ret = load_flat_binary(kvm, fd);
+       if (ret)
+               goto found_kernel;
+
+       die("%s is not a valid bzImage or flat binary", kernel_filename);
 
+found_kernel:
        return ret;
 }
 
@@ -214,7 +247,7 @@ void kvm__reset_vcpu(struct kvm *self, uint64_t rip)
        self->sregs = (struct kvm_sregs) {
                .cr0            = 0x60000010ULL,
                .cs             = (struct kvm_segment) {
-                       .selector       = 0xfff0UL,
+                       .selector       = 0xf000UL,
                        .base           = 0xffff0000UL,
                        .limit          = 0xffffU,
                        .type           = 0x0bU,