Index: qemu/hw/pc.c =================================================================== --- qemu.orig/hw/pc.c 2007-12-05 15:53:35.000000000 -0600 +++ qemu/hw/pc.c 2007-12-05 15:59:32.000000000 -0600 @@ -383,20 +383,26 @@ static void generate_bootsect(uint32_t gpr[8], uint16_t segs[6], uint16_t ip) { uint8_t bootsect[512], *p; - int i; - int hda; + BlockDriverState *bs; + int i, cyls, heads, secs; - hda = drive_get_index(IF_IDE, 0, 0); - if (hda == -1) { - fprintf(stderr, "A disk image must be given for 'hda' when booting " - "a Linux kernel\n"); + /* Create a device with at least one cylinder */ + bs = bdrv_new("mem"); + if (bdrv_mem_open(bs, 63 * 512) == -1) { + fprintf(stderr, "Error initializing memory block device\n"); exit(1); } - memset(bootsect, 0, sizeof(bootsect)); - /* Copy the MSDOS partition table if possible */ - bdrv_read(drives_table[hda].bdrv, 0, bootsect, 1); + bdrv_read(bs, 0, bootsect, 1); + + /* Setup extboot to boot from the memory block device */ + bdrv_guess_geometry(bs, &cyls, &heads, &secs); + bdrv_set_geometry_hint(bs, cyls, heads, secs); + extboot_init(bs, 1); + + /* Prevent double initialization */ + extboot_drive = -1; /* Make sure we have a partition signature */ bootsect[510] = 0x55; @@ -433,7 +439,7 @@ *p++ = segs[1]; /* CS */ *p++ = segs[1] >> 8; - bdrv_set_boot_sector(drives_table[hda].bdrv, bootsect, sizeof(bootsect)); + bdrv_write(bs, 0, bootsect, 1); } static int load_kernel(const char *filename, uint8_t *addr, @@ -834,7 +840,7 @@ for (i = 0; i < nb_option_roms; i++) opt_rom_offset += load_option_rom(option_rom[i], opt_rom_offset); - if (extboot_drive != -1) { + if (extboot_drive != -1 || linux_boot) { snprintf(buf, sizeof(buf), "%s/%s", bios_dir, EXTBOOT_FILENAME); opt_rom_offset += load_option_rom(buf, opt_rom_offset); }