From 67ea5d69397611a007a8c9f303ce809bb979c87f Mon Sep 17 00:00:00 2001 From: Pekka Enberg Date: Fri, 26 Mar 2010 21:51:55 +0200 Subject: [PATCH] Add support for loading flat binaries Signed-off-by: Pekka Enberg --- tools/kvm/kvm.c | 43 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/tools/kvm/kvm.c b/tools/kvm/kvm.c index ee581428992b..f47a1f802b1c 100644 --- a/tools/kvm/kvm.c +++ b/tools/kvm/kvm.c @@ -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, -- 2.39.5