2009-06-27 Robert Millan * kern/i386/coreboot/init.c (QEMU_CMOS_BOOT_DEVICE_01) (QEMU_CMOS_BOOT_DEVICE_2, QEMU_CMOS_BOOT_FLOPPY) (QEMU_CMOS_BOOT_HDD, QEMU_CMOS_BOOT_CDROM) (QEMU_CMOS_BOOT_NETWORK): New macros. [GRUB_MACHINE_QEMU] (grub_machine_init): Initialize `qemu_bootX' variables using the CMOS values corresponding to `-boot' parameter in QEMU command-line. Index: kern/i386/coreboot/init.c =================================================================== --- kern/i386/coreboot/init.c (revision 2367) +++ kern/i386/coreboot/init.c (working copy) @@ -36,6 +36,15 @@ #include #include #include +#include + +#define QEMU_CMOS_BOOT_DEVICE_01 0x3d +#define QEMU_CMOS_BOOT_DEVICE_2 0x38 + +#define QEMU_CMOS_BOOT_FLOPPY 0x01 +#define QEMU_CMOS_BOOT_HDD 0x02 +#define QEMU_CMOS_BOOT_CDROM 0x03 +#define QEMU_CMOS_BOOT_NETWORK 0x04 #define GRUB_FLOPPY_REG_DIGITAL_OUTPUT 0x3f2 @@ -125,6 +134,45 @@ grub_machine_init (void) grub_machine_mmap_iterate (heap_init); grub_tsc_init (); + +#ifdef GRUB_MACHINE_QEMU + { + grub_uint8_t device[3]; + unsigned int i, j; + + device[0] = grub_cmos_read (QEMU_CMOS_BOOT_DEVICE_01) & 0x0f; + device[1] = grub_cmos_read (QEMU_CMOS_BOOT_DEVICE_01) >> 4; + device[2] = grub_cmos_read (QEMU_CMOS_BOOT_DEVICE_2) >> 4; + + auto void qemu_boot_ata (int n, int ata); + void qemu_boot_ata (int n, int ata) + { + char ata_device[] = "ataX"; + char qemu_boot[] = "qemu_bootX"; + + qemu_boot[9] = n + '0'; + ata_device[3] = ata + '0'; + + grub_env_set (qemu_boot, ata_device); + } + + j = 0; + for (i = 0; i < sizeof (device) / sizeof (device[0]); i++) + switch (device[i]) + { + case QEMU_CMOS_BOOT_HDD: + qemu_boot_ata (j++, 0); + break; + case QEMU_CMOS_BOOT_CDROM: + qemu_boot_ata (j++, 2); + break; + case QEMU_CMOS_BOOT_FLOPPY: + case QEMU_CMOS_BOOT_NETWORK: + default: + break; + } + } +#endif } void