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";
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)
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;
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;
}
self->sregs = (struct kvm_sregs) {
.cr0 = 0x60000010ULL,
.cs = (struct kvm_segment) {
- .selector = 0xfff0UL,
+ .selector = 0xf000UL,
.base = 0xffff0000UL,
.limit = 0xffffU,
.type = 0x0bU,