commit-grub
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[2010] 2009-03-01 Bean <address@hidden>


From: Bean
Subject: [2010] 2009-03-01 Bean <address@hidden>
Date: Sun, 01 Mar 2009 17:57:57 +0000

Revision: 2010
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2010
Author:   bean
Date:     2009-03-01 17:57:57 +0000 (Sun, 01 Mar 2009)
Log Message:
-----------
2009-03-01  Bean  <address@hidden>

        * include/grub/efi/api.h (GRUB_EFI_MPS_TABALE_GUID): New constant.
        (GRUB_EFI_ACPI_TABLE_GUID): Likewise.
        (GRUB_EFI_ACPI_20_TABLE_GUID): Likewise.
        (GRUB_EFI_SMBIOS_TABLE_GUID): Likewise.

        * loader/i386/efi/linux.c (acpi_guid): New variable.
        (acpi_guid): Likewise.
        (EBDA_SEG_ADDR): New constant.
        (LOW_MEM_ADDR): Likewise.
        (FAKE_EBDA_SEG): Likewise.
        (fake_bios_data): New function.
        (grub_linux_boot): Call fake_bios_data.

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/include/grub/efi/api.h
    trunk/grub2/loader/i386/efi/linux.c

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog       2009-03-01 17:51:44 UTC (rev 2009)
+++ trunk/grub2/ChangeLog       2009-03-01 17:57:57 UTC (rev 2010)
@@ -1,5 +1,20 @@
 2009-03-01  Bean  <address@hidden>
 
+       * include/grub/efi/api.h (GRUB_EFI_MPS_TABALE_GUID): New constant.
+       (GRUB_EFI_ACPI_TABLE_GUID): Likewise.
+       (GRUB_EFI_ACPI_20_TABLE_GUID): Likewise.
+       (GRUB_EFI_SMBIOS_TABLE_GUID): Likewise.
+
+       * loader/i386/efi/linux.c (acpi_guid): New variable.
+       (acpi_guid): Likewise.
+       (EBDA_SEG_ADDR): New constant.
+       (LOW_MEM_ADDR): Likewise.
+       (FAKE_EBDA_SEG): Likewise.
+       (fake_bios_data): New function.
+       (grub_linux_boot): Call fake_bios_data.
+
+2009-03-01  Bean  <address@hidden>
+
        * commands/terminal.c: Removed.
 
        * commands/handler.c: New file.

Modified: trunk/grub2/include/grub/efi/api.h
===================================================================
--- trunk/grub2/include/grub/efi/api.h  2009-03-01 17:51:44 UTC (rev 2009)
+++ trunk/grub2/include/grub/efi/api.h  2009-03-01 17:57:57 UTC (rev 2010)
@@ -88,6 +88,26 @@
     { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \
   }
 
+#define GRUB_EFI_MPS_TABLE_GUID        \
+  { 0xeb9d2d2f, 0x2d88, 0x11d3, \
+    { 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
+  }
+
+#define GRUB_EFI_ACPI_TABLE_GUID       \
+  { 0xeb9d2d30, 0x2d88, 0x11d3, \
+    { 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
+  }
+
+#define GRUB_EFI_ACPI_20_TABLE_GUID    \
+  { 0x8868e871, 0xe4f1, 0x11d3, \
+    { 0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
+  }
+
+#define GRUB_EFI_SMBIOS_TABLE_GUID     \
+  { 0xeb9d2d31, 0x2d88, 0x11d3, \
+    { 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
+  }
+
 /* Enumerations.  */
 enum grub_efi_timer_delay
   {

Modified: trunk/grub2/loader/i386/efi/linux.c
===================================================================
--- trunk/grub2/loader/i386/efi/linux.c 2009-03-01 17:51:44 UTC (rev 2009)
+++ trunk/grub2/loader/i386/efi/linux.c 2009-03-01 17:57:57 UTC (rev 2010)
@@ -283,6 +283,57 @@
     }
 }
 
+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_printf ("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_printf ("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
 {
@@ -302,6 +353,8 @@
   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",
@@ -522,8 +575,8 @@
 
   grub_efi_set_text_mode (0);
   pixel = RGB_MAGIC;
-  efi_call_10 (c->blt, c, &pixel, GRUB_EFI_UGA_VIDEO_FILL,
-              0, 0, 0, 0, 1, height, 0);
+  efi_call_10 (c->blt, c, (struct grub_efi_uga_pixel *) &pixel,
+              GRUB_EFI_UGA_VIDEO_FILL, 0, 0, 0, 0, 1, height, 0);
   ret = find_framebuf (&fb_base, &line_len);
   grub_efi_set_text_mode (1);
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]