diff --git a/ChangeLog b/ChangeLog index 9eb758966..3d47ebf57 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2012-06-07 Vladimir Serbinenko + + Pass PCIINFO on BIOS to OpenBSD since otherwise it fails to boot + on some qemu versions with GRUB. + + * include/grub/i386/openbsd_bootarg.h (OPENBSD_BOOTARG_PCIBIOS): New + define. + (grub_openbsd_bootarg_pcibios): New struct. + * grub-core/loader/i386/bsd.c (grub_openbsd_boot) [GRUB_MACHINE_PCBIOS]: + Add PCIINFO. + 2012-06-07 Vladimir Serbinenko * tests/util/grub-shell.in: Trim firmware output on EFI. diff --git a/grub-core/loader/i386/bsd.c b/grub-core/loader/i386/bsd.c index 299cedc48..0fd4df0ff 100644 --- a/grub-core/loader/i386/bsd.c +++ b/grub-core/loader/i386/bsd.c @@ -35,6 +35,9 @@ #include #include #include +#ifdef GRUB_MACHINE_PCBIOS +#include +#endif GRUB_MOD_LICENSE ("GPLv3+"); @@ -809,6 +812,35 @@ grub_openbsd_boot (void) if (err) return err; +#ifdef GRUB_MACHINE_PCBIOS + { + struct grub_bios_int_registers regs; + + regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; + + regs.ebx = 0; + regs.ecx = 0; + regs.eax = 0xb101; + regs.es = 0; + regs.edi = 0; + regs.edx = 0; + + grub_bios_interrupt (0x1a, ®s); + if (regs.edx == 0x20494350) + { + struct grub_openbsd_bootarg_pcibios pcibios; + + pcibios.characteristics = regs.eax & 0xff; + pcibios.revision = regs.ebx & 0xffff; + pcibios.pm_entry = regs.edi; + pcibios.last_bus = regs.ecx & 0xff; + + grub_bsd_add_meta (OPENBSD_BOOTARG_PCIBIOS, &pcibios, + sizeof (pcibios)); + } + } +#endif + { struct bsd_tag *tag; tag_buf_len = 0; diff --git a/include/grub/i386/openbsd_bootarg.h b/include/grub/i386/openbsd_bootarg.h index 935dfc0c8..75bb9fb88 100644 --- a/include/grub/i386/openbsd_bootarg.h +++ b/include/grub/i386/openbsd_bootarg.h @@ -61,6 +61,7 @@ #define OPENBSD_BOOTARG_END -1 #define OPENBSD_BOOTARG_MMAP 0 +#define OPENBSD_BOOTARG_PCIBIOS 4 #define OPENBSD_BOOTARG_CONSOLE 5 struct grub_openbsd_bootargs @@ -76,6 +77,14 @@ struct grub_openbsd_bootarg_console grub_uint32_t speed; }; +struct grub_openbsd_bootarg_pcibios +{ + grub_uint32_t characteristics; + grub_uint32_t revision; + grub_uint32_t pm_entry; + grub_uint32_t last_bus; +}; + #define GRUB_OPENBSD_COM_MAJOR 8 #define GRUB_OPENBSD_VGA_MAJOR 12