[2074] 2009-04-10 Bean <[email protected]>

Bean <[email protected]>
Newsgroups gmane.comp.boot-loaders.grub.cvs
Message-ID <[email protected]>
Revision: 2074
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2074
Author:   bean
Date:     2009-04-10 15:33:34 +0000 (Fri, 10 Apr 2009)
Log Message:
-----------
2009-04-10  Bean  <[email protected]>

	* include/grub/efi/api.h (grub_efi_configuration_table): Add packed
	attribute, otherwise the size would be wrong for i386 platform.

	* include/grub/pci.h (grub_pci_read_word): New inline function.
	(grub_pci_read_byte): Likewise.
	(grub_pci_write): Likewise.
	(grub_pci_write_word): Likewise.
	(grub_pci_write_byte): Likewise.

	* include/grub/pci.h (grub_pci_iteratefunc_t): Add NESTED_FUNC_ATTR.

	* loader/i386/efi/linux.c (fake_bios_data): Moved to loadbios module.
	(find_framebuf): Scan pci to locate the frame buffer address.

	* commands/efi/fixvideo.c: New file.

	* commands/efi/loadbios.c: Likewise.

	* commands/memrw.c: Likewise.

	* util/grub-dumpbios.in: Likewise.

	* conf/common.rmk (grub-dumpbios): New utility.
	(pkglib_MODULES): New module memrw.mod.
	(memrw_mod_SOURCE): New macro.
	(memrw_mod_CFLAGS): Likewise.
	(memrw_mod_LDFLAGS): Likewise.

	* conf/i386-efi.rmk (pkglig_MODULES): New module loadbios.mod and
	fixvideo.mod.
	(loadbios_mod_SOURCE): New macro.
	(loadbios_mod_CFLAGS): Likewise.
	(loadbios_mod_LDFLAGS): Likewise.
	(fixvideo_mod_SOURCE): Likewise.
	(fixvideo_mod_CFLAGS): Likewise.
	(fixvideo_mod_LDFLAGS): Likewise.

	* conf/x86_64.rmk (pkglig_MODULES): New module loadbios.mod and
	fixvideo.mod.
	(loadbios_mod_SOURCE): New macro.
	(loadbios_mod_CFLAGS): Likewise.
	(loadbios_mod_LDFLAGS): Likewise.
	(fixvideo_mod_SOURCE): Likewise.
	(fixvideo_mod_CFLAGS): Likewise.
	(fixvideo_mod_LDFLAGS): Likewise.

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/DISTLIST
    trunk/grub2/conf/common.mk
    trunk/grub2/conf/common.rmk
    trunk/grub2/conf/i386-efi.mk
    trunk/grub2/conf/i386-efi.rmk
    trunk/grub2/conf/x86_64-efi.mk
    trunk/grub2/conf/x86_64-efi.rmk
    trunk/grub2/include/grub/efi/api.h
    trunk/grub2/include/grub/i386/pci.h
    trunk/grub2/include/grub/pci.h
    trunk/grub2/loader/i386/efi/linux.c

Added Paths:
-----------
    trunk/grub2/commands/efi/
    trunk/grub2/commands/efi/fixvideo.c
    trunk/grub2/commands/efi/loadbios.c
    trunk/grub2/commands/memrw.c
    trunk/grub2/util/grub-dumpbios.in

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog	2009-04-08 15:03:50 UTC (rev 2073)
+++ trunk/grub2/ChangeLog	2009-04-10 15:33:34 UTC (rev 2074)
@@ -1,3 +1,51 @@
+2009-04-10  Bean  <[email protected]>
+
+	* include/grub/efi/api.h (grub_efi_configuration_table): Add packed
+	attribute, otherwise the size would be wrong for i386 platform.
+
+	* include/grub/pci.h (grub_pci_read_word): New inline function.
+	(grub_pci_read_byte): Likewise.
+	(grub_pci_write): Likewise.
+	(grub_pci_write_word): Likewise.
+	(grub_pci_write_byte): Likewise.
+
+	* include/grub/pci.h (grub_pci_iteratefunc_t): Add NESTED_FUNC_ATTR.
+
+	* loader/i386/efi/linux.c (fake_bios_data): Moved to loadbios module.
+	(find_framebuf): Scan pci to locate the frame buffer address.
+
+	* commands/efi/fixvideo.c: New file.
+
+	* commands/efi/loadbios.c: Likewise.
+
+	* commands/memrw.c: Likewise.
+
+	* util/grub-dumpbios.in: Likewise.
+
+	* conf/common.rmk (grub-dumpbios): New utility.
+	(pkglib_MODULES): New module memrw.mod.
+	(memrw_mod_SOURCE): New macro.
+	(memrw_mod_CFLAGS): Likewise.
+	(memrw_mod_LDFLAGS): Likewise.
+
+	* conf/i386-efi.rmk (pkglig_MODULES): New module loadbios.mod and
+	fixvideo.mod.
+	(loadbios_mod_SOURCE): New macro.
+	(loadbios_mod_CFLAGS): Likewise.
+	(loadbios_mod_LDFLAGS): Likewise.
+	(fixvideo_mod_SOURCE): Likewise.
+	(fixvideo_mod_CFLAGS): Likewise.
+	(fixvideo_mod_LDFLAGS): Likewise.
+
+	* conf/x86_64.rmk (pkglig_MODULES): New module loadbios.mod and
+	fixvideo.mod.
+	(loadbios_mod_SOURCE): New macro.
+	(loadbios_mod_CFLAGS): Likewise.
+	(loadbios_mod_LDFLAGS): Likewise.
+	(fixvideo_mod_SOURCE): Likewise.
+	(fixvideo_mod_CFLAGS): Likewise.
+	(fixvideo_mod_LDFLAGS): Likewise.
+
 2009-04-08  Felix Zielcke  <[email protected]>
 
 	* disk/lvm.c (grub_lvm_scan_device): Add a missing NULL check.

Modified: trunk/grub2/DISTLIST
===================================================================
--- trunk/grub2/DISTLIST	2009-04-08 15:03:50 UTC (rev 2073)
+++ trunk/grub2/DISTLIST	2009-04-10 15:33:34 UTC (rev 2074)
@@ -58,6 +58,7 @@
 commands/ls.c
 commands/lsmmap.c
 commands/lspci.c
+commands/memrw.c
 commands/minicmd.c
 commands/parttool.c
 commands/read.c
@@ -67,6 +68,8 @@
 commands/test.c
 commands/usbtest.c
 commands/videotest.c
+commands/efi/fixvideo.c
+commands/efi/loadbios.c
 commands/i386/cpuid.c
 commands/i386/pc/halt.c
 commands/i386/pc/play.c
@@ -446,6 +449,7 @@
 term/ieee1275/ofconsole.c
 util/console.c
 util/getroot.c
+util/grub-dumpbios.in
 util/grub-editenv.c
 util/grub-emu.c
 util/grub-fstest.c

Added: trunk/grub2/commands/efi/fixvideo.c
===================================================================
--- trunk/grub2/commands/efi/fixvideo.c	                        (rev 0)
+++ trunk/grub2/commands/efi/fixvideo.c	2009-04-10 15:33:34 UTC (rev 2074)
@@ -0,0 +1,110 @@
+/* fixvideo.c - fix video problem in efi */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2009  Free Software Foundation, Inc.
+ *
+ *  GRUB is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  GRUB is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/dl.h>
+#include <grub/misc.h>
+#include <grub/file.h>
+#include <grub/pci.h>
+#include <grub/command.h>
+
+static struct grub_video_patch
+{
+  const char *name;
+  grub_uint32_t pci_id;
+  grub_uint32_t mmio_bar;
+  grub_uint32_t mmio_reg;
+  grub_uint32_t mmio_old;
+} video_patches[] =
+  {
+    {"Intel 945GM", 0x27a28086, 0, 0x71184, 0x1000000}, /* DSPBBASE  */
+    {"Intel 965GM", 0x2a028086, 0, 0x7119C, 0x1000000}, /* DSPBSURF  */
+    {0, 0, 0, 0, 0}
+  };
+
+static int NESTED_FUNC_ATTR
+scan_card (int bus, int dev, int func, grub_pci_id_t pciid)
+{
+  grub_pci_address_t addr;
+
+  addr = grub_pci_make_address (bus, dev, func, 2);
+  if (grub_pci_read_byte (addr + 3) == 0x3)
+    {
+      struct grub_video_patch *p = video_patches;
+
+      while (p->name)
+	{
+	  if (p->pci_id == pciid)
+	    {
+	      grub_target_addr_t base;
+
+	      grub_printf ("Found graphic card: %s\n", p->name);
+	      addr += 8 + p->mmio_bar * 4;
+	      base = grub_pci_read (addr);
+	      if ((! base) || (base & GRUB_PCI_ADDR_SPACE_IO) ||
+		  (base & GRUB_PCI_ADDR_MEM_PREFETCH))
+		grub_printf ("Invalid MMIO bar %d\n", p->mmio_bar);
+	      else
+		{
+		  base &= GRUB_PCI_ADDR_MEM_MASK;
+		  base += p->mmio_reg;
+
+		  if (*((volatile grub_uint32_t *) base) != p->mmio_old)
+		    grub_printf ("Old value don't match\n");
+		  else
+		    {
+		      *((volatile grub_uint32_t *) base) = 0;
+		      if (*((volatile grub_uint32_t *) base))
+			grub_printf ("Set MMIO fails\n");
+		    }
+		}
+
+	      return 1;
+	    }
+	  p++;
+	}
+
+      grub_printf ("Unknown graphic card: %x\n", pciid);
+    }
+
+  return 0;
+}
+
+static grub_err_t
+grub_cmd_fixvideo (grub_command_t cmd __attribute__ ((unused)),
+		   int argc __attribute__ ((unused)),
+		   char *argv[] __attribute__ ((unused)))
+{
+  grub_pci_iterate (scan_card);
+  return 0;
+}
+
+static grub_command_t cmd_fixvideo;
+
+GRUB_MOD_INIT(fixvideo)
+{
+  (void) mod;			/* To stop warning. */
+  cmd_fixvideo = grub_register_command ("fix_video", grub_cmd_fixvideo,
+					0, "Fix video problem.");
+
+}
+
+GRUB_MOD_FINI(fixvideo)
+{
+  grub_unregister_command (cmd_fixvideo);
+}

Added: trunk/grub2/commands/efi/loadbios.c
===================================================================
--- trunk/grub2/commands/efi/loadbios.c	                        (rev 0)
+++ trunk/grub2/commands/efi/loadbios.c	2009-04-10 15:33:34 UTC (rev 2074)
@@ -0,0 +1,212 @@
+/* loadbios.c - command to load a bios dump  */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2009  Free Software Foundation, Inc.
+ *
+ *  GRUB is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  GRUB is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/dl.h>
+#include <grub/misc.h>
+#include <grub/file.h>
+#include <grub/efi/efi.h>
+#include <grub/pci.h>
+#include <grub/command.h>
+
+static grub_efi_guid_t acpi_guid = GRUB_EFI_ACPI_TABLE_GUID;
+static grub_efi_guid_t acpi2_guid = GRUB_EFI_ACPI_20_TABLE_GUID;
+static grub_efi_guid_t smbios_guid = GRUB_EFI_SMBIOS_TABLE_GUID;
+
+#define EBDA_SEG_ADDR	0x40e
+#define LOW_MEM_ADDR	0x413
+#define FAKE_EBDA_SEG	0x9fc0
+
+#define BLANK_MEM	0xffffffff
+#define VBIOS_ADDR	0xc0000
+#define SBIOS_ADDR	0xf0000
+
+static int
+enable_rom_area (void)
+{
+  grub_pci_address_t addr;
+  grub_uint32_t *rom_ptr;
+
+  rom_ptr = (grub_uint32_t *) VBIOS_ADDR;
+  if (*rom_ptr != BLANK_MEM)
+    {
+      grub_printf ("ROM image present.\n");
+      return 0;
+    }
+
+  addr = grub_pci_make_address (0, 0, 0, 36);
+  grub_pci_write_byte (addr++, 0x30);
+  grub_pci_write_byte (addr++, 0x33);
+  grub_pci_write_byte (addr++, 0x33);
+  grub_pci_write_byte (addr++, 0x33);
+  grub_pci_write_byte (addr++, 0x33);
+  grub_pci_write_byte (addr++, 0x33);
+  grub_pci_write_byte (addr++, 0x33);
+  grub_pci_write_byte (addr, 0);
+
+  *rom_ptr = 0;
+  if (*rom_ptr != 0)
+    {
+      grub_printf ("Can\'t enable rom area.\n");
+      return 0;
+    }
+
+  return 1;
+}
+
+static void
+lock_rom_area (void)
+{
+  grub_pci_address_t addr;
+
+  addr = grub_pci_make_address (0, 0, 0, 36);
+  grub_pci_write_byte (addr++, 0x10);
+  grub_pci_write_byte (addr++, 0x11);
+  grub_pci_write_byte (addr++, 0x11);
+  grub_pci_write_byte (addr++, 0x11);
+  grub_pci_write_byte (addr, 0x11);
+}
+
+static void
+fake_bios_data (int use_rom)
+{
+  unsigned i;
+  void *acpi, *smbios;
+  grub_uint16_t *ebda_seg_ptr, *low_mem_ptr;
+
+  ebda_seg_ptr = (grub_uint16_t *) EBDA_SEG_ADDR;
+  low_mem_ptr = (grub_uint16_t *) LOW_MEM_ADDR;
+  if ((*ebda_seg_ptr) || (*low_mem_ptr))
+    return;
+
+  acpi = 0;
+  smbios = 0;
+  for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
+    {
+      grub_efi_guid_t *guid =
+	&grub_efi_system_table->configuration_table[i].vendor_guid;
+
+      if (! grub_memcmp (guid, &acpi2_guid, sizeof (grub_efi_guid_t)))
+	{
+	  acpi = grub_efi_system_table->configuration_table[i].vendor_table;
+	  grub_dprintf ("efi", "ACPI2: %p\n", acpi);
+	}
+      else if (! grub_memcmp (guid, &acpi_guid, sizeof (grub_efi_guid_t)))
+	{
+	  void *t;
+
+	  t = grub_efi_system_table->configuration_table[i].vendor_table;
+	  if (! acpi)
+	    acpi = t;
+	  grub_dprintf ("efi", "ACPI: %p\n", t);
+	}
+      else if (! grub_memcmp (guid, &smbios_guid, sizeof (grub_efi_guid_t)))
+	{
+	  smbios = grub_efi_system_table->configuration_table[i].vendor_table;
+	  grub_dprintf ("efi", "SMBIOS: %p\n", smbios);
+	}
+    }
+
+  *ebda_seg_ptr = FAKE_EBDA_SEG;
+  *low_mem_ptr = (FAKE_EBDA_SEG >> 6);
+
+  *((grub_uint16_t *) (FAKE_EBDA_SEG << 4)) = 640 - *low_mem_ptr;
+
+  if (acpi)
+    grub_memcpy ((char *) ((FAKE_EBDA_SEG << 4) + 16), acpi, 1024 - 16);
+
+  if ((use_rom) && (smbios))
+    grub_memcpy ((char *) SBIOS_ADDR, (char *) smbios + 16, 16);
+}
+
+static grub_err_t
+grub_cmd_fakebios (struct grub_command *cmd __attribute__ ((unused)),
+		   int argc __attribute__ ((unused)),
+		   char *argv[] __attribute__ ((unused)))
+{
+  if (enable_rom_area ())
+    {
+      fake_bios_data (1);
+      lock_rom_area ();
+    }
+  else
+    fake_bios_data (0);
+}
+
+static grub_err_t
+grub_cmd_loadbios (grub_command_t cmd __attribute__ ((unused)),
+		   int argc, char *argv[])
+{
+  grub_file_t file;
+  int size;
+
+  if (argc == 0)
+    return grub_error (GRUB_ERR_BAD_ARGUMENT, "No rom image specified");
+
+  if (argc > 1)
+    {
+      file = grub_file_open (argv[1]);
+      if (! file)
+	return grub_errno;
+
+      if (file->size != 4)
+	grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid int10 dump size");
+      else
+	grub_file_read (file, (char *) 0x40, 4);
+
+      grub_file_close (file);
+      if (grub_errno)
+	return grub_errno;
+    }
+
+  file = grub_file_open (argv[0]);
+  if (! file)
+    return grub_errno;
+
+  size = file->size;
+  if ((size < 0x10000) || (size > 0x40000))
+    grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid bios dump size");
+  else if (enable_rom_area ())
+    {
+      grub_file_read (file, (char *) VBIOS_ADDR, size);
+      fake_bios_data (size <= 0x40000);
+      lock_rom_area ();
+    }
+
+  grub_file_close (file);
+  return grub_errno;
+}
+
+static grub_command_t cmd_fakebios, cmd_loadbios;
+
+GRUB_MOD_INIT(loadbios)
+{
+  (void) mod;			/* To stop warning. */
+  cmd_fakebios = grub_register_command ("fakebios", grub_cmd_fakebios,
+					0, "fake bios.");
+
+  cmd_loadbios = grub_register_command ("loadbios", grub_cmd_loadbios,
+					"loadbios BIOS_DUMP [INT10_DUMP]",
+					"Load bios dump.");
+}
+
+GRUB_MOD_FINI(loadbios)
+{
+  grub_unregister_command (cmd_fakebios);
+  grub_unregister_command (cmd_loadbios);
+}

Added: trunk/grub2/commands/memrw.c
===================================================================
--- trunk/grub2/commands/memrw.c	                        (rev 0)
+++ trunk/grub2/commands/memrw.c	2009-04-10 15:33:34 UTC (rev 2074)
@@ -0,0 +1,101 @@
+/* memrw.c - command to read / write physical memory  */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2009  Free Software Foundation, Inc.
+ *
+ *  GRUB is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  GRUB is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/dl.h>
+#include <grub/misc.h>
+#include <grub/command.h>
+
+static grub_command_t cmd_read_byte, cmd_read_word, cmd_read_dword;
+static grub_command_t cmd_write_byte, cmd_write_word, cmd_write_dword;
+
+static grub_err_t
+grub_cmd_read (grub_command_t cmd, int argc, char **argv)
+{
+  grub_target_addr_t addr;
+  grub_uint32_t value;
+
+  if (argc != 1)
+    return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid number of arguments");
+
+  addr = grub_strtoul (argv[0], 0, 0);
+  if (cmd->name[5] == 'd')
+    value = *((grub_uint32_t *) addr);
+  else if (cmd->name[5] == 'w')
+    value = *((grub_uint16_t *) addr);
+  else
+    value = *((grub_uint8_t *) addr);
+
+  grub_printf ("0x%x\n", value);
+
+  return 0;
+}
+
+static grub_err_t
+grub_cmd_write (grub_command_t cmd, int argc, char **argv)
+{
+  grub_target_addr_t addr;
+  grub_uint32_t value;
+
+  if (argc != 2)
+    return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid number of arguments");
+
+  addr = grub_strtoul (argv[0], 0, 0);
+  value = grub_strtoul (argv[1], 0, 0);
+  if (cmd->name[6] == 'd')
+    *((grub_uint32_t *) addr) = value;
+  else if (cmd->name[6] == 'w')
+    *((grub_uint16_t *) addr) = (grub_uint16_t) value;
+  else
+    *((grub_uint8_t *) addr) = (grub_uint8_t) value;
+
+  return 0;
+}
+
+GRUB_MOD_INIT(memrw)
+{
+  (void) mod;			/* To stop warning. */
+  cmd_read_byte =
+    grub_register_command ("read_byte", grub_cmd_read,
+			   "read_byte ADDR", "read byte.");
+  cmd_read_word =
+    grub_register_command ("read_word", grub_cmd_read,
+			   "read_word ADDR", "read word.");
+  cmd_read_dword =
+    grub_register_command ("read_dword", grub_cmd_read,
+			   "read_dword ADDR", "read dword.");
+  cmd_write_byte =
+    grub_register_command ("write_byte", grub_cmd_write,
+			   "write_byte ADDR VALUE", "write byte.");
+  cmd_write_word =
+    grub_register_command ("write_word", grub_cmd_write,
+			   "write_word ADDR VALUE", "write word.");
+  cmd_write_dword =
+    grub_register_command ("write_dword", grub_cmd_write,
+			   "write_dword ADDR VALUE", "write dword.");
+}
+
+GRUB_MOD_FINI(memrw)
+{
+  grub_unregister_command (cmd_read_byte);
+  grub_unregister_command (cmd_read_word);
+  grub_unregister_command (cmd_read_dword);
+  grub_unregister_command (cmd_write_byte);
+  grub_unregister_command (cmd_write_word);
+  grub_unregister_command (cmd_write_dword);
+}

Modified: trunk/grub2/conf/common.mk
===================================================================
--- trunk/grub2/conf/common.mk	2009-04-08 15:03:50 UTC (rev 2073)
+++ trunk/grub2/conf/common.mk	2009-04-10 15:33:34 UTC (rev 2074)
@@ -600,6 +600,12 @@
 
 grub-mkconfig_DATA += util/grub.d/README
 
+# For grub-dumpbios
+grub-dumpbios: util/grub-dumpbios.in config.status
+	./config.status --file=$@:$<
+	chmod +x $@
+sbin_SCRIPTS += grub-dumpbios
+CLEANFILES += grub-dumpbios
 
 # Filing systems.
 pkglib_MODULES += fshelp.mod fat.mod ufs.mod ext2.mod ntfs.mod		\
@@ -2444,7 +2450,8 @@
 	 ls.mod	cmp.mod cat.mod help.mod search.mod		\
 	loopback.mod fs_uuid.mod configfile.mod echo.mod	\
 	terminfo.mod test.mod blocklist.mod hexdump.mod		\
-	read.mod sleep.mod loadenv.mod crc.mod parttool.mod pcpart.mod
+	read.mod sleep.mod loadenv.mod crc.mod parttool.mod	\
+	pcpart.mod memrw.mod
 
 # For minicmd.mod.
 minicmd_mod_SOURCES = commands/minicmd.c
@@ -3852,6 +3859,63 @@
 crc_mod_CFLAGS = $(COMMON_CFLAGS)
 crc_mod_LDFLAGS = $(COMMON_LDFLAGS)
 
+# For memrw.mod.
+memrw_mod_SOURCES = commands/memrw.c
+CLEANFILES += memrw.mod mod-memrw.o mod-memrw.c pre-memrw.o memrw_mod-commands_memrw.o und-memrw.lst
+ifneq ($(memrw_mod_EXPORTS),no)
+CLEANFILES += def-memrw.lst
+DEFSYMFILES += def-memrw.lst
+endif
+MOSTLYCLEANFILES += memrw_mod-commands_memrw.d
+UNDSYMFILES += und-memrw.lst
+
+memrw.mod: pre-memrw.o mod-memrw.o $(TARGET_OBJ2ELF)
+	-rm -f $@
+	$(TARGET_CC) $(memrw_mod_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ pre-memrw.o mod-memrw.o
+	if test ! -z $(TARGET_OBJ2ELF); then ./$(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi
+	$(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -K _grub_mod_init -K _grub_mod_fini -R .note -R .comment $@
+
+pre-memrw.o: $(memrw_mod_DEPENDENCIES) memrw_mod-commands_memrw.o
+	-rm -f $@
+	$(TARGET_CC) $(memrw_mod_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ memrw_mod-commands_memrw.o
+
+mod-memrw.o: mod-memrw.c
+	$(TARGET_CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(memrw_mod_CFLAGS) -c -o $@ $<
+
+mod-memrw.c: $(builddir)/moddep.lst $(srcdir)/genmodsrc.sh
+	sh $(srcdir)/genmodsrc.sh 'memrw' $< > $@ || (rm -f $@; exit 1)
+
+ifneq ($(memrw_mod_EXPORTS),no)
+def-memrw.lst: pre-memrw.o
+	$(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 memrw/' > $@
+endif
+
+und-memrw.lst: pre-memrw.o
+	echo 'memrw' > $@
+	$(NM) -u -P -p $< | cut -f1 -d' ' >> $@
+
+memrw_mod-commands_memrw.o: commands/memrw.c $(commands/memrw.c_DEPENDENCIES)
+	$(TARGET_CC) -Icommands -I$(srcdir)/commands $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(memrw_mod_CFLAGS) -MD -c -o $@ $<
+-include memrw_mod-commands_memrw.d
+
+CLEANFILES += cmd-memrw_mod-commands_memrw.lst fs-memrw_mod-commands_memrw.lst partmap-memrw_mod-commands_memrw.lst
+COMMANDFILES += cmd-memrw_mod-commands_memrw.lst
+FSFILES += fs-memrw_mod-commands_memrw.lst
+PARTMAPFILES += partmap-memrw_mod-commands_memrw.lst
+
+cmd-memrw_mod-commands_memrw.lst: commands/memrw.c $(commands/memrw.c_DEPENDENCIES) gencmdlist.sh
+	set -e; 	  $(TARGET_CC) -Icommands -I$(srcdir)/commands $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(memrw_mod_CFLAGS) -E $< 	  | sh $(srcdir)/gencmdlist.sh memrw > $@ || (rm -f $@; exit 1)
+
+fs-memrw_mod-commands_memrw.lst: commands/memrw.c $(commands/memrw.c_DEPENDENCIES) genfslist.sh
+	set -e; 	  $(TARGET_CC) -Icommands -I$(srcdir)/commands $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(memrw_mod_CFLAGS) -E $< 	  | sh $(srcdir)/genfslist.sh memrw > $@ || (rm -f $@; exit 1)
+
+partmap-memrw_mod-commands_memrw.lst: commands/memrw.c $(commands/memrw.c_DEPENDENCIES) genpartmaplist.sh
+	set -e; 	  $(TARGET_CC) -Icommands -I$(srcdir)/commands $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(memrw_mod_CFLAGS) -E $< 	  | sh $(srcdir)/genpartmaplist.sh memrw > $@ || (rm -f $@; exit 1)
+
+
+memrw_mod_CFLAGS = $(COMMON_CFLAGS)
+memrw_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
 # Common Video Subsystem specific modules.
 pkglib_MODULES += video.mod videotest.mod bitmap.mod tga.mod jpeg.mod	\
 	png.mod	font.mod gfxterm.mod

Modified: trunk/grub2/conf/common.rmk
===================================================================
--- trunk/grub2/conf/common.rmk	2009-04-08 15:03:50 UTC (rev 2073)
+++ trunk/grub2/conf/common.rmk	2009-04-10 15:33:34 UTC (rev 2074)
@@ -155,6 +155,12 @@
 
 grub-mkconfig_DATA += util/grub.d/README
 
+# For grub-dumpbios
+grub-dumpbios: util/grub-dumpbios.in config.status
+	./config.status --file=$@:$<
+	chmod +x $@
+sbin_SCRIPTS += grub-dumpbios
+CLEANFILES += grub-dumpbios
 
 # Filing systems.
 pkglib_MODULES += fshelp.mod fat.mod ufs.mod ext2.mod ntfs.mod		\
@@ -335,7 +341,8 @@
 	 ls.mod	cmp.mod cat.mod help.mod search.mod		\
 	loopback.mod fs_uuid.mod configfile.mod echo.mod	\
 	terminfo.mod test.mod blocklist.mod hexdump.mod		\
-	read.mod sleep.mod loadenv.mod crc.mod parttool.mod pcpart.mod
+	read.mod sleep.mod loadenv.mod crc.mod parttool.mod	\
+	pcpart.mod memrw.mod
 
 # For minicmd.mod.
 minicmd_mod_SOURCES = commands/minicmd.c
@@ -452,6 +459,11 @@
 crc_mod_CFLAGS = $(COMMON_CFLAGS)
 crc_mod_LDFLAGS = $(COMMON_LDFLAGS)
 
+# For memrw.mod.
+memrw_mod_SOURCES = commands/memrw.c
+memrw_mod_CFLAGS = $(COMMON_CFLAGS)
+memrw_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
 # Common Video Subsystem specific modules.
 pkglib_MODULES += video.mod videotest.mod bitmap.mod tga.mod jpeg.mod	\
 	png.mod	font.mod gfxterm.mod

Modified: trunk/grub2/conf/i386-efi.mk
===================================================================
--- trunk/grub2/conf/i386-efi.mk	2009-04-08 15:03:50 UTC (rev 2073)
+++ trunk/grub2/conf/i386-efi.mk	2009-04-10 15:33:34 UTC (rev 2074)
@@ -120,7 +120,7 @@
 # Modules.
 pkglib_MODULES = kernel.mod normal.mod chain.mod appleldr.mod \
 	linux.mod halt.mod reboot.mod pci.mod lspci.mod \
-	datetime.mod date.mod datehook.mod
+	datetime.mod date.mod datehook.mod loadbios.mod fixvideo.mod
 
 # For kernel.mod.
 kernel_mod_EXPORTS = no
@@ -1759,5 +1759,119 @@
 datehook_mod_CFLAGS = $(COMMON_CFLAGS)
 datehook_mod_LDFLAGS = $(COMMON_LDFLAGS)
 
+# For loadbios.mod
+loadbios_mod_SOURCES = commands/efi/loadbios.c
+CLEANFILES += loadbios.mod mod-loadbios.o mod-loadbios.c pre-loadbios.o loadbios_mod-commands_efi_loadbios.o und-loadbios.lst
+ifneq ($(loadbios_mod_EXPORTS),no)
+CLEANFILES += def-loadbios.lst
+DEFSYMFILES += def-loadbios.lst
+endif
+MOSTLYCLEANFILES += loadbios_mod-commands_efi_loadbios.d
+UNDSYMFILES += und-loadbios.lst
+
+loadbios.mod: pre-loadbios.o mod-loadbios.o $(TARGET_OBJ2ELF)
+	-rm -f $@
+	$(TARGET_CC) $(loadbios_mod_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ pre-loadbios.o mod-loadbios.o
+	if test ! -z $(TARGET_OBJ2ELF); then ./$(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi
+	$(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -K _grub_mod_init -K _grub_mod_fini -R .note -R .comment $@
+
+pre-loadbios.o: $(loadbios_mod_DEPENDENCIES) loadbios_mod-commands_efi_loadbios.o
+	-rm -f $@
+	$(TARGET_CC) $(loadbios_mod_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ loadbios_mod-commands_efi_loadbios.o
+
+mod-loadbios.o: mod-loadbios.c
+	$(TARGET_CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(loadbios_mod_CFLAGS) -c -o $@ $<
+
+mod-loadbios.c: $(builddir)/moddep.lst $(srcdir)/genmodsrc.sh
+	sh $(srcdir)/genmodsrc.sh 'loadbios' $< > $@ || (rm -f $@; exit 1)
+
+ifneq ($(loadbios_mod_EXPORTS),no)
+def-loadbios.lst: pre-loadbios.o
+	$(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 loadbios/' > $@
+endif
+
+und-loadbios.lst: pre-loadbios.o
+	echo 'loadbios' > $@
+	$(NM) -u -P -p $< | cut -f1 -d' ' >> $@
+
+loadbios_mod-commands_efi_loadbios.o: commands/efi/loadbios.c $(commands/efi/loadbios.c_DEPENDENCIES)
+	$(TARGET_CC) -Icommands/efi -I$(srcdir)/commands/efi $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(loadbios_mod_CFLAGS) -MD -c -o $@ $<
+-include loadbios_mod-commands_efi_loadbios.d
+
+CLEANFILES += cmd-loadbios_mod-commands_efi_loadbios.lst fs-loadbios_mod-commands_efi_loadbios.lst partmap-loadbios_mod-commands_efi_loadbios.lst
+COMMANDFILES += cmd-loadbios_mod-commands_efi_loadbios.lst
+FSFILES += fs-loadbios_mod-commands_efi_loadbios.lst
+PARTMAPFILES += partmap-loadbios_mod-commands_efi_loadbios.lst
+
+cmd-loadbios_mod-commands_efi_loadbios.lst: commands/efi/loadbios.c $(commands/efi/loadbios.c_DEPENDENCIES) gencmdlist.sh
+	set -e; 	  $(TARGET_CC) -Icommands/efi -I$(srcdir)/commands/efi $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(loadbios_mod_CFLAGS) -E $< 	  | sh $(srcdir)/gencmdlist.sh loadbios > $@ || (rm -f $@; exit 1)
+
+fs-loadbios_mod-commands_efi_loadbios.lst: commands/efi/loadbios.c $(commands/efi/loadbios.c_DEPENDENCIES) genfslist.sh
+	set -e; 	  $(TARGET_CC) -Icommands/efi -I$(srcdir)/commands/efi $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(loadbios_mod_CFLAGS) -E $< 	  | sh $(srcdir)/genfslist.sh loadbios > $@ || (rm -f $@; exit 1)
+
+partmap-loadbios_mod-commands_efi_loadbios.lst: commands/efi/loadbios.c $(commands/efi/loadbios.c_DEPENDENCIES) genpartmaplist.sh
+	set -e; 	  $(TARGET_CC) -Icommands/efi -I$(srcdir)/commands/efi $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(loadbios_mod_CFLAGS) -E $< 	  | sh $(srcdir)/genpartmaplist.sh loadbios > $@ || (rm -f $@; exit 1)
+
+
+loadbios_mod_CFLAGS = $(COMMON_CFLAGS)
+loadbios_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
+# For fixvideo.mod
+fixvideo_mod_SOURCES = commands/efi/fixvideo.c
+CLEANFILES += fixvideo.mod mod-fixvideo.o mod-fixvideo.c pre-fixvideo.o fixvideo_mod-commands_efi_fixvideo.o und-fixvideo.lst
+ifneq ($(fixvideo_mod_EXPORTS),no)
+CLEANFILES += def-fixvideo.lst
+DEFSYMFILES += def-fixvideo.lst
+endif
+MOSTLYCLEANFILES += fixvideo_mod-commands_efi_fixvideo.d
+UNDSYMFILES += und-fixvideo.lst
+
+fixvideo.mod: pre-fixvideo.o mod-fixvideo.o $(TARGET_OBJ2ELF)
+	-rm -f $@
+	$(TARGET_CC) $(fixvideo_mod_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ pre-fixvideo.o mod-fixvideo.o
+	if test ! -z $(TARGET_OBJ2ELF); then ./$(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi
+	$(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -K _grub_mod_init -K _grub_mod_fini -R .note -R .comment $@
+
+pre-fixvideo.o: $(fixvideo_mod_DEPENDENCIES) fixvideo_mod-commands_efi_fixvideo.o
+	-rm -f $@
+	$(TARGET_CC) $(fixvideo_mod_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ fixvideo_mod-commands_efi_fixvideo.o
+
+mod-fixvideo.o: mod-fixvideo.c
+	$(TARGET_CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(fixvideo_mod_CFLAGS) -c -o $@ $<
+
+mod-fixvideo.c: $(builddir)/moddep.lst $(srcdir)/genmodsrc.sh
+	sh $(srcdir)/genmodsrc.sh 'fixvideo' $< > $@ || (rm -f $@; exit 1)
+
+ifneq ($(fixvideo_mod_EXPORTS),no)
+def-fixvideo.lst: pre-fixvideo.o
+	$(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 fixvideo/' > $@
+endif
+
+und-fixvideo.lst: pre-fixvideo.o
+	echo 'fixvideo' > $@
+	$(NM) -u -P -p $< | cut -f1 -d' ' >> $@
+
+fixvideo_mod-commands_efi_fixvideo.o: commands/efi/fixvideo.c $(commands/efi/fixvideo.c_DEPENDENCIES)
+	$(TARGET_CC) -Icommands/efi -I$(srcdir)/commands/efi $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(fixvideo_mod_CFLAGS) -MD -c -o $@ $<
+-include fixvideo_mod-commands_efi_fixvideo.d
+
+CLEANFILES += cmd-fixvideo_mod-commands_efi_fixvideo.lst fs-fixvideo_mod-commands_efi_fixvideo.lst partmap-fixvideo_mod-commands_efi_fixvideo.lst
+COMMANDFILES += cmd-fixvideo_mod-commands_efi_fixvideo.lst
+FSFILES += fs-fixvideo_mod-commands_efi_fixvideo.lst
+PARTMAPFILES += partmap-fixvideo_mod-commands_efi_fixvideo.lst
+
+cmd-fixvideo_mod-commands_efi_fixvideo.lst: commands/efi/fixvideo.c $(commands/efi/fixvideo.c_DEPENDENCIES) gencmdlist.sh
+	set -e; 	  $(TARGET_CC) -Icommands/efi -I$(srcdir)/commands/efi $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(fixvideo_mod_CFLAGS) -E $< 	  | sh $(srcdir)/gencmdlist.sh fixvideo > $@ || (rm -f $@; exit 1)
+
+fs-fixvideo_mod-commands_efi_fixvideo.lst: commands/efi/fixvideo.c $(commands/efi/fixvideo.c_DEPENDENCIES) genfslist.sh
+	set -e; 	  $(TARGET_CC) -Icommands/efi -I$(srcdir)/commands/efi $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(fixvideo_mod_CFLAGS) -E $< 	  | sh $(srcdir)/genfslist.sh fixvideo > $@ || (rm -f $@; exit 1)
+
+partmap-fixvideo_mod-commands_efi_fixvideo.lst: commands/efi/fixvideo.c $(commands/efi/fixvideo.c_DEPENDENCIES) genpartmaplist.sh
+	set -e; 	  $(TARGET_CC) -Icommands/efi -I$(srcdir)/commands/efi $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(fixvideo_mod_CFLAGS) -E $< 	  | sh $(srcdir)/genpartmaplist.sh fixvideo > $@ || (rm -f $@; exit 1)
+
+
+fixvideo_mod_CFLAGS = $(COMMON_CFLAGS)
+fixvideo_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
 include $(srcdir)/conf/i386.mk
 include $(srcdir)/conf/common.mk

Modified: trunk/grub2/conf/i386-efi.rmk
===================================================================
--- trunk/grub2/conf/i386-efi.rmk	2009-04-08 15:03:50 UTC (rev 2073)
+++ trunk/grub2/conf/i386-efi.rmk	2009-04-10 15:33:34 UTC (rev 2074)
@@ -81,7 +81,7 @@
 # Modules.
 pkglib_MODULES = kernel.mod normal.mod chain.mod appleldr.mod \
 	linux.mod halt.mod reboot.mod pci.mod lspci.mod \
-	datetime.mod date.mod datehook.mod
+	datetime.mod date.mod datehook.mod loadbios.mod fixvideo.mod
 
 # For kernel.mod.
 kernel_mod_EXPORTS = no
@@ -184,5 +184,15 @@
 datehook_mod_CFLAGS = $(COMMON_CFLAGS)
 datehook_mod_LDFLAGS = $(COMMON_LDFLAGS)
 
+# For loadbios.mod
+loadbios_mod_SOURCES = commands/efi/loadbios.c
+loadbios_mod_CFLAGS = $(COMMON_CFLAGS)
+loadbios_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
+# For fixvideo.mod
+fixvideo_mod_SOURCES = commands/efi/fixvideo.c
+fixvideo_mod_CFLAGS = $(COMMON_CFLAGS)
+fixvideo_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
 include $(srcdir)/conf/i386.mk
 include $(srcdir)/conf/common.mk

Modified: trunk/grub2/conf/x86_64-efi.mk
===================================================================
--- trunk/grub2/conf/x86_64-efi.mk	2009-04-08 15:03:50 UTC (rev 2073)
+++ trunk/grub2/conf/x86_64-efi.mk	2009-04-10 15:33:34 UTC (rev 2074)
@@ -108,7 +108,7 @@
 # Modules.
 pkglib_MODULES = kernel.mod normal.mod chain.mod appleldr.mod \
 	halt.mod reboot.mod linux.mod pci.mod lspci.mod \
-	datetime.mod date.mod datehook.mod
+	datetime.mod date.mod datehook.mod loadbios.mod fixvideo.mod
 
 # For kernel.mod.
 kernel_mod_EXPORTS = no
@@ -1767,5 +1767,119 @@
 datehook_mod_CFLAGS = $(COMMON_CFLAGS)
 datehook_mod_LDFLAGS = $(COMMON_LDFLAGS)
 
+# For loadbios.mod
+loadbios_mod_SOURCES = commands/efi/loadbios.c
+CLEANFILES += loadbios.mod mod-loadbios.o mod-loadbios.c pre-loadbios.o loadbios_mod-commands_efi_loadbios.o und-loadbios.lst
+ifneq ($(loadbios_mod_EXPORTS),no)
+CLEANFILES += def-loadbios.lst
+DEFSYMFILES += def-loadbios.lst
+endif
+MOSTLYCLEANFILES += loadbios_mod-commands_efi_loadbios.d
+UNDSYMFILES += und-loadbios.lst
+
+loadbios.mod: pre-loadbios.o mod-loadbios.o $(TARGET_OBJ2ELF)
+	-rm -f $@
+	$(TARGET_CC) $(loadbios_mod_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ pre-loadbios.o mod-loadbios.o
+	if test ! -z $(TARGET_OBJ2ELF); then ./$(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi
+	$(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -K _grub_mod_init -K _grub_mod_fini -R .note -R .comment $@
+
+pre-loadbios.o: $(loadbios_mod_DEPENDENCIES) loadbios_mod-commands_efi_loadbios.o
+	-rm -f $@
+	$(TARGET_CC) $(loadbios_mod_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ loadbios_mod-commands_efi_loadbios.o
+
+mod-loadbios.o: mod-loadbios.c
+	$(TARGET_CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(loadbios_mod_CFLAGS) -c -o $@ $<
+
+mod-loadbios.c: $(builddir)/moddep.lst $(srcdir)/genmodsrc.sh
+	sh $(srcdir)/genmodsrc.sh 'loadbios' $< > $@ || (rm -f $@; exit 1)
+
+ifneq ($(loadbios_mod_EXPORTS),no)
+def-loadbios.lst: pre-loadbios.o
+	$(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 loadbios/' > $@
+endif
+
+und-loadbios.lst: pre-loadbios.o
+	echo 'loadbios' > $@
+	$(NM) -u -P -p $< | cut -f1 -d' ' >> $@
+
+loadbios_mod-commands_efi_loadbios.o: commands/efi/loadbios.c $(commands/efi/loadbios.c_DEPENDENCIES)
+	$(TARGET_CC) -Icommands/efi -I$(srcdir)/commands/efi $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(loadbios_mod_CFLAGS) -MD -c -o $@ $<
+-include loadbios_mod-commands_efi_loadbios.d
+
+CLEANFILES += cmd-loadbios_mod-commands_efi_loadbios.lst fs-loadbios_mod-commands_efi_loadbios.lst partmap-loadbios_mod-commands_efi_loadbios.lst
+COMMANDFILES += cmd-loadbios_mod-commands_efi_loadbios.lst
+FSFILES += fs-loadbios_mod-commands_efi_loadbios.lst
+PARTMAPFILES += partmap-loadbios_mod-commands_efi_loadbios.lst
+
+cmd-loadbios_mod-commands_efi_loadbios.lst: commands/efi/loadbios.c $(commands/efi/loadbios.c_DEPENDENCIES) gencmdlist.sh
+	set -e; 	  $(TARGET_CC) -Icommands/efi -I$(srcdir)/commands/efi $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(loadbios_mod_CFLAGS) -E $< 	  | sh $(srcdir)/gencmdlist.sh loadbios > $@ || (rm -f $@; exit 1)
+
+fs-loadbios_mod-commands_efi_loadbios.lst: commands/efi/loadbios.c $(commands/efi/loadbios.c_DEPENDENCIES) genfslist.sh
+	set -e; 	  $(TARGET_CC) -Icommands/efi -I$(srcdir)/commands/efi $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(loadbios_mod_CFLAGS) -E $< 	  | sh $(srcdir)/genfslist.sh loadbios > $@ || (rm -f $@; exit 1)
+
+partmap-loadbios_mod-commands_efi_loadbios.lst: commands/efi/loadbios.c $(commands/efi/loadbios.c_DEPENDENCIES) genpartmaplist.sh
+	set -e; 	  $(TARGET_CC) -Icommands/efi -I$(srcdir)/commands/efi $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(loadbios_mod_CFLAGS) -E $< 	  | sh $(srcdir)/genpartmaplist.sh loadbios > $@ || (rm -f $@; exit 1)
+
+
+loadbios_mod_CFLAGS = $(COMMON_CFLAGS)
+loadbios_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
+# For fixvideo.mod
+fixvideo_mod_SOURCES = commands/efi/fixvideo.c
+CLEANFILES += fixvideo.mod mod-fixvideo.o mod-fixvideo.c pre-fixvideo.o fixvideo_mod-commands_efi_fixvideo.o und-fixvideo.lst
+ifneq ($(fixvideo_mod_EXPORTS),no)
+CLEANFILES += def-fixvideo.lst
+DEFSYMFILES += def-fixvideo.lst
+endif
+MOSTLYCLEANFILES += fixvideo_mod-commands_efi_fixvideo.d
+UNDSYMFILES += und-fixvideo.lst
+
+fixvideo.mod: pre-fixvideo.o mod-fixvideo.o $(TARGET_OBJ2ELF)
+	-rm -f $@
+	$(TARGET_CC) $(fixvideo_mod_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ pre-fixvideo.o mod-fixvideo.o
+	if test ! -z $(TARGET_OBJ2ELF); then ./$(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi
+	$(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -K _grub_mod_init -K _grub_mod_fini -R .note -R .comment $@
+
+pre-fixvideo.o: $(fixvideo_mod_DEPENDENCIES) fixvideo_mod-commands_efi_fixvideo.o
+	-rm -f $@
+	$(TARGET_CC) $(fixvideo_mod_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ fixvideo_mod-commands_efi_fixvideo.o
+
+mod-fixvideo.o: mod-fixvideo.c
+	$(TARGET_CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(fixvideo_mod_CFLAGS) -c -o $@ $<
+
+mod-fixvideo.c: $(builddir)/moddep.lst $(srcdir)/genmodsrc.sh
+	sh $(srcdir)/genmodsrc.sh 'fixvideo' $< > $@ || (rm -f $@; exit 1)
+
+ifneq ($(fixvideo_mod_EXPORTS),no)
+def-fixvideo.lst: pre-fixvideo.o
+	$(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 fixvideo/' > $@
+endif
+
+und-fixvideo.lst: pre-fixvideo.o
+	echo 'fixvideo' > $@
+	$(NM) -u -P -p $< | cut -f1 -d' ' >> $@
+
+fixvideo_mod-commands_efi_fixvideo.o: commands/efi/fixvideo.c $(commands/efi/fixvideo.c_DEPENDENCIES)
+	$(TARGET_CC) -Icommands/efi -I$(srcdir)/commands/efi $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(fixvideo_mod_CFLAGS) -MD -c -o $@ $<
+-include fixvideo_mod-commands_efi_fixvideo.d
+
+CLEANFILES += cmd-fixvideo_mod-commands_efi_fixvideo.lst fs-fixvideo_mod-commands_efi_fixvideo.lst partmap-fixvideo_mod-commands_efi_fixvideo.lst
+COMMANDFILES += cmd-fixvideo_mod-commands_efi_fixvideo.lst
+FSFILES += fs-fixvideo_mod-commands_efi_fixvideo.lst
+PARTMAPFILES += partmap-fixvideo_mod-commands_efi_fixvideo.lst
+
+cmd-fixvideo_mod-commands_efi_fixvideo.lst: commands/efi/fixvideo.c $(commands/efi/fixvideo.c_DEPENDENCIES) gencmdlist.sh
+	set -e; 	  $(TARGET_CC) -Icommands/efi -I$(srcdir)/commands/efi $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(fixvideo_mod_CFLAGS) -E $< 	  | sh $(srcdir)/gencmdlist.sh fixvideo > $@ || (rm -f $@; exit 1)
+
+fs-fixvideo_mod-commands_efi_fixvideo.lst: commands/efi/fixvideo.c $(commands/efi/fixvideo.c_DEPENDENCIES) genfslist.sh
+	set -e; 	  $(TARGET_CC) -Icommands/efi -I$(srcdir)/commands/efi $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(fixvideo_mod_CFLAGS) -E $< 	  | sh $(srcdir)/genfslist.sh fixvideo > $@ || (rm -f $@; exit 1)
+
+partmap-fixvideo_mod-commands_efi_fixvideo.lst: commands/efi/fixvideo.c $(commands/efi/fixvideo.c_DEPENDENCIES) genpartmaplist.sh
+	set -e; 	  $(TARGET_CC) -Icommands/efi -I$(srcdir)/commands/efi $(TARGET_CPPFLAGS)  $(TARGET_CFLAGS) $(fixvideo_mod_CFLAGS) -E $< 	  | sh $(srcdir)/genpartmaplist.sh fixvideo > $@ || (rm -f $@; exit 1)
+
+
+fixvideo_mod_CFLAGS = $(COMMON_CFLAGS)
+fixvideo_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
 include $(srcdir)/conf/i386.mk
 include $(srcdir)/conf/common.mk

Modified: trunk/grub2/conf/x86_64-efi.rmk
===================================================================
--- trunk/grub2/conf/x86_64-efi.rmk	2009-04-08 15:03:50 UTC (rev 2073)
+++ trunk/grub2/conf/x86_64-efi.rmk	2009-04-10 15:33:34 UTC (rev 2074)
@@ -83,7 +83,7 @@
 # Modules.
 pkglib_MODULES = kernel.mod normal.mod chain.mod appleldr.mod \
 	halt.mod reboot.mod linux.mod pci.mod lspci.mod \
-	datetime.mod date.mod datehook.mod
+	datetime.mod date.mod datehook.mod loadbios.mod fixvideo.mod
 
 # For kernel.mod.
 kernel_mod_EXPORTS = no
@@ -187,5 +187,15 @@
 datehook_mod_CFLAGS = $(COMMON_CFLAGS)
 datehook_mod_LDFLAGS = $(COMMON_LDFLAGS)
 
+# For loadbios.mod
+loadbios_mod_SOURCES = commands/efi/loadbios.c
+loadbios_mod_CFLAGS = $(COMMON_CFLAGS)
+loadbios_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
+# For fixvideo.mod
+fixvideo_mod_SOURCES = commands/efi/fixvideo.c
+fixvideo_mod_CFLAGS = $(COMMON_CFLAGS)
+fixvideo_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
 include $(srcdir)/conf/i386.mk
 include $(srcdir)/conf/common.mk

Modified: trunk/grub2/include/grub/efi/api.h
===================================================================
--- trunk/grub2/include/grub/efi/api.h	2009-04-08 15:03:50 UTC (rev 2073)
+++ trunk/grub2/include/grub/efi/api.h	2009-04-10 15:33:34 UTC (rev 2074)
@@ -933,7 +933,7 @@
 {
   grub_efi_guid_t vendor_guid;
   void *vendor_table;
-};
+} __attribute__ ((packed));
 typedef struct grub_efi_configuration_table grub_efi_configuration_table_t;
 
 struct grub_efi_simple_input_interface

Modified: trunk/grub2/include/grub/i386/pci.h
===================================================================
--- trunk/grub2/include/grub/i386/pci.h	2009-04-08 15:03:50 UTC (rev 2073)
+++ trunk/grub2/include/grub/i386/pci.h	2009-04-10 15:33:34 UTC (rev 2074)
@@ -32,4 +32,39 @@
   return grub_inl (GRUB_PCI_DATA_REG);
 }
 
+static inline grub_uint16_t
+grub_pci_read_word (grub_pci_address_t addr)
+{
+  grub_outl (addr & ~3, GRUB_PCI_ADDR_REG);
+  return grub_inw (GRUB_PCI_DATA_REG + (addr & 3));
+}
+
+static inline grub_uint8_t
+grub_pci_read_byte (grub_pci_address_t addr)
+{
+  grub_outl (addr & ~3, GRUB_PCI_ADDR_REG);
+  return grub_inb (GRUB_PCI_DATA_REG + (addr & 3));
+}
+
+static inline void
+grub_pci_write (grub_pci_address_t addr, grub_uint32_t data)
+{
+  grub_outl (addr, GRUB_PCI_ADDR_REG);
+  grub_outl (data, GRUB_PCI_DATA_REG);
+}
+
+static inline void
+grub_pci_write_word (grub_pci_address_t addr, grub_uint16_t data)
+{
+  grub_outl (addr & ~3, GRUB_PCI_ADDR_REG);
+  grub_outw (data, GRUB_PCI_DATA_REG + (addr & 3));
+}
+
+static inline void
+grub_pci_write_byte (grub_pci_address_t addr, grub_uint8_t data)
+{
+  grub_outl (addr & ~3, GRUB_PCI_ADDR_REG);
+  grub_outb (data, GRUB_PCI_DATA_REG + (addr & 3));
+}
+
 #endif /* GRUB_CPU_PCI_H */

Modified: trunk/grub2/include/grub/pci.h
===================================================================
--- trunk/grub2/include/grub/pci.h	2009-04-08 15:03:50 UTC (rev 2073)
+++ trunk/grub2/include/grub/pci.h	2009-04-10 15:33:34 UTC (rev 2074)
@@ -36,8 +36,8 @@
 #define  GRUB_PCI_ADDR_IO_MASK		~0x03
 
 typedef grub_uint32_t grub_pci_id_t;
-typedef int (*grub_pci_iteratefunc_t) (int bus, int device, int func,
-				       grub_pci_id_t pciid);
+typedef int NESTED_FUNC_ATTR (*grub_pci_iteratefunc_t)
+     (int bus, int device, int func, grub_pci_id_t pciid);
 typedef grub_uint32_t grub_pci_address_t;
 
 grub_pci_address_t EXPORT_FUNC(grub_pci_make_address) (int bus, int device,

Modified: trunk/grub2/loader/i386/efi/linux.c
===================================================================
--- trunk/grub2/loader/i386/efi/linux.c	2009-04-08 15:03:50 UTC (rev 2073)
+++ trunk/grub2/loader/i386/efi/linux.c	2009-04-10 15:33:34 UTC (rev 2074)
@@ -30,6 +30,7 @@
 #include <grub/efi/api.h>
 #include <grub/efi/efi.h>
 #include <grub/efi/uga_draw.h>
+#include <grub/pci.h>
 #include <grub/command.h>
 
 #define GRUB_LINUX_CL_OFFSET		0x1000
@@ -248,9 +249,9 @@
     }
 
   grub_dprintf ("linux", "real_mode_mem = %lx, real_mode_pages = %x, "
-                "prot_mode_mem = %lx, prot_mode_pages = %x\n",
-                (unsigned long) real_mode_mem, (unsigned) real_mode_pages,
-                (unsigned long) prot_mode_mem, (unsigned) prot_mode_pages);
+		"prot_mode_mem = %lx, prot_mode_pages = %x\n",
+		(unsigned long) real_mode_mem, (unsigned) real_mode_pages,
+		(unsigned long) prot_mode_mem, (unsigned) prot_mode_pages);
 
   grub_free (mmap);
   return 1;
@@ -263,8 +264,8 @@
 
 static void
 grub_e820_add_region (struct grub_e820_mmap *e820_map, int *e820_num,
-                      grub_uint64_t start, grub_uint64_t size,
-                      grub_uint32_t type)
+		      grub_uint64_t start, grub_uint64_t size,
+		      grub_uint32_t type)
 {
   int n = *e820_num;
 
@@ -283,57 +284,6 @@
     }
 }
 
-static grub_efi_guid_t acpi_guid = GRUB_EFI_ACPI_TABLE_GUID;
-static grub_efi_guid_t acpi2_guid = GRUB_EFI_ACPI_20_TABLE_GUID;
-
-#define EBDA_SEG_ADDR	0x40e
-#define LOW_MEM_ADDR	0x413
-#define FAKE_EBDA_SEG	0x9fc0
-
-static void
-fake_bios_data (void)
-{
-  unsigned i;
-  void *acpi;
-  grub_uint16_t *ebda_seg_ptr, *low_mem_ptr;
-
-  acpi = 0;
-  for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
-    {
-      grub_efi_guid_t *guid =
-	&grub_efi_system_table->configuration_table[i].vendor_guid;
-
-      if (! grub_memcmp (guid, &acpi2_guid, sizeof (grub_efi_guid_t)))
-	{
-	  acpi = grub_efi_system_table->configuration_table[i].vendor_table;
-	  grub_dprintf ("linux", "ACPI2: %p\n", acpi);
-	}
-      else if (! grub_memcmp (guid, &acpi_guid, sizeof (grub_efi_guid_t)))
-	{
-	  void *t;
-
-	  t = grub_efi_system_table->configuration_table[i].vendor_table;
-	  if (! acpi)
-	    acpi = t;
-	  grub_dprintf ("linux", "ACPI: %p\n", t);
-	}
-    }
-
-  if (acpi == 0)
-    return;
-
-  ebda_seg_ptr = (grub_uint16_t *) EBDA_SEG_ADDR;
-  low_mem_ptr = (grub_uint16_t *) LOW_MEM_ADDR;
-
-  if ((*ebda_seg_ptr) || (*low_mem_ptr))
-    return;
-
-  *ebda_seg_ptr = FAKE_EBDA_SEG;
-  *low_mem_ptr = FAKE_EBDA_SEG >> 6;
-
-  grub_memcpy ((char *) (FAKE_EBDA_SEG << 4), acpi, 1024);
-}
-
 #ifdef __x86_64__
 struct
 {
@@ -353,13 +303,11 @@
   grub_efi_memory_descriptor_t *desc;
   int e820_num;
   
-  fake_bios_data ();
-
   params = real_mode_mem;
 
   grub_dprintf ("linux", "code32_start = %x, idt_desc = %lx, gdt_desc = %lx\n",
 		(unsigned) params->code32_start,
-                (unsigned long) &(idt_desc.limit),
+		(unsigned long) &(idt_desc.limit),
 		(unsigned long) &(gdt_desc.limit));
   grub_dprintf ("linux", "idt = %x:%lx, gdt = %x:%lx\n",
 		(unsigned) idt_desc.limit, (unsigned long) idt_desc.base,
@@ -376,69 +324,69 @@
        desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size))
     {
       switch (desc->type)
-        {
-        case GRUB_EFI_ACPI_RECLAIM_MEMORY:
-          grub_e820_add_region (params->e820_map, &e820_num,
-                                desc->physical_start,
-                                desc->num_pages << 12,
-                                GRUB_E820_ACPI);
-          break;
+	{
+	case GRUB_EFI_ACPI_RECLAIM_MEMORY:
+	  grub_e820_add_region (params->e820_map, &e820_num,
+				desc->physical_start,
+				desc->num_pages << 12,
+				GRUB_E820_ACPI);
+	  break;
 
-        case GRUB_EFI_ACPI_MEMORY_NVS:
-          grub_e820_add_region (params->e820_map, &e820_num,
-                                desc->physical_start,
-                                desc->num_pages << 12,
-                                GRUB_E820_NVS);
-          break;
+	case GRUB_EFI_ACPI_MEMORY_NVS:
+	  grub_e820_add_region (params->e820_map, &e820_num,
+				desc->physical_start,
+				desc->num_pages << 12,
+				GRUB_E820_NVS);
+	  break;
 
-        case GRUB_EFI_RUNTIME_SERVICES_CODE:
-          grub_e820_add_region (params->e820_map, &e820_num,
-                                desc->physical_start,
-                                desc->num_pages << 12,
-                                GRUB_E820_EXEC_CODE);
-          break;
+	case GRUB_EFI_RUNTIME_SERVICES_CODE:
+	  grub_e820_add_region (params->e820_map, &e820_num,
+				desc->physical_start,
+				desc->num_pages << 12,
+				GRUB_E820_EXEC_CODE);
+	  break;
 
-        case GRUB_EFI_LOADER_CODE:
-        case GRUB_EFI_LOADER_DATA:
-        case GRUB_EFI_BOOT_SERVICES_CODE:
-        case GRUB_EFI_BOOT_SERVICES_DATA:
-        case GRUB_EFI_CONVENTIONAL_MEMORY:
-          {
-            grub_uint64_t start, size, end;
+	case GRUB_EFI_LOADER_CODE:
+	case GRUB_EFI_LOADER_DATA:
+	case GRUB_EFI_BOOT_SERVICES_CODE:
+	case GRUB_EFI_BOOT_SERVICES_DATA:
+	case GRUB_EFI_CONVENTIONAL_MEMORY:
+	  {
+	    grub_uint64_t start, size, end;
 
-            start = desc->physical_start;
-            size = desc->num_pages << 12;
-            end = start + size;
+	    start = desc->physical_start;
+	    size = desc->num_pages << 12;
+	    end = start + size;
 
-            /* Skip A0000 - 100000 region.  */
-            if ((start < 0x100000ULL) && (end > 0xA0000ULL))
-              {
-                if (start < 0xA0000ULL)
-                  {
-                    grub_e820_add_region (params->e820_map, &e820_num,
-                                          start,
-                                          0xA0000ULL - start,
-                                          GRUB_E820_RAM);
-                  }
+	    /* Skip A0000 - 100000 region.  */
+	    if ((start < 0x100000ULL) && (end > 0xA0000ULL))
+	      {
+		if (start < 0xA0000ULL)
+		  {
+		    grub_e820_add_region (params->e820_map, &e820_num,
+					  start,
+					  0xA0000ULL - start,
+					  GRUB_E820_RAM);
+		  }
 
-                if (end <= 0x100000ULL)
-                  continue;
+		if (end <= 0x100000ULL)
+		  continue;
 
-                start = 0x100000ULL;
-                size = end - start;
-              }
+		start = 0x100000ULL;
+		size = end - start;
+	      }
 
-            grub_e820_add_region (params->e820_map, &e820_num,
-                                  start, size, GRUB_E820_RAM);
-            break;
-          }
+	    grub_e820_add_region (params->e820_map, &e820_num,
+				  start, size, GRUB_E820_RAM);
+	    break;
+	  }
 
-        default:
-          grub_e820_add_region (params->e820_map, &e820_num,
-                                desc->physical_start,
-                                desc->num_pages << 12,
-                                GRUB_E820_RESERVED);
-        }
+	default:
+	  grub_e820_add_region (params->e820_map, &e820_num,
+				desc->physical_start,
+				desc->num_pages << 12,
+				GRUB_E820_RESERVED);
+	}
     }
 
   params->mmap_size = e820_num;
@@ -520,41 +468,106 @@
 #define FBTEST_STEP	(0x10000 >> 2)
 #define FBTEST_COUNT	8
 
-static grub_uint32_t fb_list[]=
-  {0x40000000, 0x80000000, 0xc0000000, 0};
+static int
+find_line_len (grub_uint32_t *fb_base, grub_uint32_t *line_len)
+{
+  grub_uint32_t *base = (grub_uint32_t *) (grub_target_addr_t) *fb_base;
+  int i;
 
+  for (i = 0; i < FBTEST_COUNT; i++, base += FBTEST_STEP)
+    {
+      if ((*base & RGB_MASK) == RGB_MAGIC)
+	{
+	  int j;
+
+	  for (j = LINE_MIN; j <= LINE_MAX; j++)
+	    {
+	      if ((base[j] & RGB_MASK) == RGB_MAGIC)
+		{
+		  *fb_base = (grub_uint32_t) (grub_target_addr_t) base;
+		  *line_len = j << 2;
+
+		  return 1;
+		}
+	    }
+
+	  break;
+	}
+    }
+
+  return 0;
+}
+
 static int
 find_framebuf (grub_uint32_t *fb_base, grub_uint32_t *line_len)
 {
-  grub_uint32_t *fb;
+  int found = 0;
 
-  for (fb = fb_list; *fb; fb++)
+  auto int NESTED_FUNC_ATTR find_card (int bus, int dev, int func,
+				       grub_pci_id_t pciid);
+
+  int NESTED_FUNC_ATTR find_card (int bus, int dev, int func,
+				  grub_pci_id_t pciid)
     {
-      grub_uint32_t *base = (grub_uint32_t *) (grub_target_addr_t) *fb;
-      int i;
+      grub_pci_address_t addr;
 
-      for (i = 0; i < FBTEST_COUNT; i++, base += FBTEST_STEP)
-        {
-	  if ((*base & RGB_MASK) == RGB_MAGIC)
+      addr = grub_pci_make_address (bus, dev, func, 2);
+      if (grub_pci_read (addr) >> 24 == 0x3)
+	{
+	  int i;
+
+	  grub_printf ("Display controller: %d:%d.%d\nDevice id: %x\n",
+		       bus, dev, func, pciid);
+	  addr += 8;
+	  for (i = 0; i < 6; i++, addr += 4)
 	    {
-	      int j;
+	      grub_uint32_t old_bar1, old_bar2, type;
+	      grub_uint64_t base64;
 
-	      for (j = LINE_MIN; j <= LINE_MAX; j++)
-            {
-		  if ((base[j] & RGB_MASK) == RGB_MAGIC)
-                {
-		      *fb_base = (grub_uint32_t) (grub_target_addr_t) base;
-		      *line_len = j << 2;
+	      old_bar1 = grub_pci_read (addr);
+	      if ((! old_bar1) || (old_bar1 & GRUB_PCI_ADDR_SPACE_IO))
+		continue;
 
-		      return 0;
-                }
-            }
+	      type = old_bar1 & GRUB_PCI_ADDR_MEM_TYPE_MASK;
+	      if (type == GRUB_PCI_ADDR_MEM_TYPE_64)
+		{
+		  if (i == 5)
+		    break;
 
-                break;
-            }
-        }
+		  old_bar2 = grub_pci_read (addr + 4);
+		}
+	      else
+		old_bar2 = 0;
+
+	      base64 = old_bar2;
+	      base64 <<= 32;
+	      base64 |= (old_bar1 & GRUB_PCI_ADDR_MEM_MASK);
+
+	      grub_printf ("%s(%d): 0x%llx\n",
+			   ((old_bar1 & GRUB_PCI_ADDR_MEM_PREFETCH) ?
+			    "VMEM" : "MMIO"), i,
+			   (unsigned long long) base64);
+
+	      if ((old_bar1 & GRUB_PCI_ADDR_MEM_PREFETCH) && (! found))
+		{
+		  *fb_base = base64;
+		  if (find_line_len (fb_base, line_len))
+		    found++;
+		}
+
+	      if (type == GRUB_PCI_ADDR_MEM_TYPE_64)
+		{
+		  i++;
+		  addr += 4;
+		}
+	    }
+	}
+
+      return found;
     }
-  return 1;
+
+  grub_pci_iterate (find_card);
+  return found;
 }
 
 static int
@@ -580,13 +593,13 @@
   ret = find_framebuf (&fb_base, &line_len);
   grub_efi_set_text_mode (1);
 
-  if (ret)
+  if (! ret)
     {
       grub_printf ("Can\'t find frame buffer address\n");
       return 1;
     }
 
-  grub_printf ("Video frame buffer: 0x%x\n", fb_base);
+  grub_printf ("Frame buffer base: 0x%x\n", fb_base);
   grub_printf ("Video line length: %d\n", line_len);
 
   params->lfb_width = width;
@@ -606,6 +619,9 @@
   params->reserved_mask_size = 8;
   params->reserved_field_pos = 24;
 
+  params->have_vga = GRUB_VIDEO_TYPE_VLFB;
+  params->vid_mode = 0x338;  /* 1024x768x32  */
+
   return 0;
 }
 
@@ -621,7 +637,6 @@
   grub_ssize_t len;
   int i;
   char *dest;
-  int video_type;
 
   grub_dl_ref (my_mod);
   
@@ -808,9 +823,10 @@
   grub_printf ("   [Linux-bzImage, setup=0x%x, size=0x%x]\n",
 	       (unsigned) real_size, (unsigned) prot_size);
 
+  grub_linux_setup_video (params);
+
   /* Detect explicitly specified memory size, if any.  */
   linux_mem_size = 0;
-  video_type = 0;
   for (i = 1; i < argc; i++)
     if (grub_memcmp (argv[i], "mem=", 4) == 0)
       {
@@ -846,20 +862,12 @@
 	      linux_mem_size <<= shift;
 	  }
       }
-    else if (grub_memcmp (argv[i], "video=", 6) == 0)
+    else if (grub_memcmp (argv[i], "video=efifb", 11) == 0)
       {
-        if (grub_memcmp (&argv[i][6], "vesafb", 6) == 0)
-          video_type = GRUB_VIDEO_TYPE_VLFB;
-        else if (grub_memcmp (&argv[i][6], "efifb", 5) == 0)
-          video_type = GRUB_VIDEO_TYPE_EFI;
+	if (params->have_vga)
+	  params->have_vga = GRUB_VIDEO_TYPE_EFI;
       }
 
-  if (video_type)
-    {
-      if (!  grub_linux_setup_video (params))
-        params->have_vga = video_type;
-    }
-
   /* Specify the boot file.  */
   dest = grub_stpcpy ((char *) real_mode_mem + GRUB_LINUX_CL_OFFSET,
 		      "BOOT_IMAGE=");
@@ -946,7 +954,7 @@
 
   /* Usually, the compression ratio is about 50%.  */
   addr_min = (grub_addr_t) prot_mode_mem + ((prot_mode_pages * 3) << 12)
-             + page_align (size);
+	     + page_align (size);
   
   /* Find the highest address to put the initrd.  */
   mmap_size = find_mmap_size ();
@@ -968,7 +976,7 @@
 	    physical_end = addr_max;
 
 	  if (physical_end < page_align (size))
-            continue;
+	    continue;
 
 	  physical_end -= page_align (size);
 

Added: trunk/grub2/util/grub-dumpbios.in
===================================================================
--- trunk/grub2/util/grub-dumpbios.in	                        (rev 0)
+++ trunk/grub2/util/grub-dumpbios.in	2009-04-10 15:33:34 UTC (rev 2074)
@@ -0,0 +1,58 @@
+#! /bin/sh
+#
+# Copyright (C) 2009  Free Software Foundation, Inc.
+#
+# GRUB is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# GRUB is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+
+# Usage: usage
+# Print the usage.
+usage () {
+    cat <<EOF
+Usage: $0 [OPTION]
+Create vbios and int10 dump
+
+  -o, --output=DIR        set output directory
+  -h, --help              print this message and exit
+  -v, --version           print the version information and exit
+
+Report bugs to <[email protected]>.
+EOF
+}
+
+# Check the arguments.
+for option in "$@"; do
+    case "$option" in
+    -h | --help)
+	usage
+	exit 0 ;;
+    -v | --version)
+	echo "$0 (GNU GRUB @PACKAGE_VERSION@)"
+	exit 0 ;;
+    -o)
+	shift
+	output_dir=$1
+	;;
+    --output=)
+	output_dir=`echo "$option" | sed 's/--output=//'`
+	;;
+    -*)
+	echo "Unrecognized option \`$option'" 1>&2
+	usage
+	exit 1
+	;;
+    esac
+done
+
+dd if=/dev/mem of=${output_dir}vbios.bin bs=65536 skip=12 count=1
+dd if=/dev/mem of=${output_dir}int10.bin bs=4 skip=16 count=1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.