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