]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2008-11-07 Robert Millan <rmh@aybabtu.com>
authorrobertmh <robertmh@localhost>
Fri, 7 Nov 2008 19:53:25 +0000 (19:53 +0000)
committerrobertmh <robertmh@localhost>
Fri, 7 Nov 2008 19:53:25 +0000 (19:53 +0000)
        * include/multiboot2.h (struct multiboot_header): Add `flags' member as
        per specification.
        * loader/multiboot2.c (grub_multiboot2): Fix Multiboot2 header check.
        * loader/multiboot_loader.c (find_multi_boot2_header): New function
        (based on find_multi_boot1_header).
        (grub_rescue_cmd_multiboot_loader): Check for Multiboot2 header,
        using find_multi_boot2_header(), and abort if neither Multiboot or
        Multiboot headers were found.

ChangeLog
include/multiboot2.h
loader/multiboot2.c
loader/multiboot_loader.c

index 481446c45026e2e6749155509a740eae9873bd46..c00a0026e3125ff15338f2524e8246697cfc63ad 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2008-11-07  Robert Millan  <rmh@aybabtu.com>
+
+       * include/multiboot2.h (struct multiboot_header): Add `flags' member as
+       per specification.
+       * loader/multiboot2.c (grub_multiboot2): Fix Multiboot2 header check.
+       * loader/multiboot_loader.c (find_multi_boot2_header): New function
+       (based on find_multi_boot1_header).
+       (grub_rescue_cmd_multiboot_loader): Check for Multiboot2 header,
+       using find_multi_boot2_header(), and abort if neither Multiboot or
+       Multiboot headers were found.
+
 2008-11-07  Robert Millan  <rmh@aybabtu.com>
 
        Modularize at_keyboard.mod:
index f720dc3ea9fe0d6e7616eb6d536a0f85b18265d7..0f2b0cf2d1363175d78ca21258b3bf0ec8df25af 100644 (file)
@@ -46,6 +46,7 @@ typedef uint32_t multiboot_word;
 struct multiboot_header
 {
   uint32_t magic;
+  uint32_t flags;
 };
 
 struct multiboot_tag_header
index 42c6fadfe65c0928b30e21a2a7373502e42984f7..2fb56bfdfba314c74c04e3e3bb647d88f1654c5e 100644 (file)
@@ -342,8 +342,8 @@ grub_multiboot2 (int argc, char *argv[])
     }
 
   /* Look for the multiboot header in the buffer.  The header should
-     be at least 12 bytes and aligned on a 4-byte boundary.  */
-  for (p = buffer; p <= buffer + len - 12; p += 4)
+     be at least 8 bytes and aligned on a 8-byte boundary.  */
+  for (p = buffer; p <= buffer + len - 8; p += 8)
     {
       header = (struct multiboot_header *) p;
       if (header->magic == MULTIBOOT2_HEADER_MAGIC)
index d56b42c205adbb60073b48b06aaf1281380a13e4..53971dfeabb25d1edf27be79e8a870434d8e7275 100644 (file)
@@ -71,6 +71,34 @@ find_multi_boot1_header (grub_file_t file)
    return found_status;
 }
 
+static int
+find_multi_boot2_header (grub_file_t file)
+{
+  struct multiboot_header *header;
+  char buffer[MULTIBOOT_SEARCH];
+  int found_status = 0;
+  grub_ssize_t len;
+  len = grub_file_read (file, buffer, MULTIBOOT_SEARCH);
+  if (len < 32)
+    return found_status;
+
+  /* Look for the multiboot header in the buffer.  The header should
+     be at least 8 bytes and aligned on a 8-byte boundary.  */
+  for (header = (struct multiboot_header *) buffer;
+      ((char *) header <= buffer + len - 8) || (header = 0);
+      header = (struct multiboot_header *) ((char *) header + 8))
+    {
+      if (header->magic == MULTIBOOT2_HEADER_MAGIC)
+        {
+           found_status = 1;
+           break;
+        }
+     }
+
+   return found_status;
+}
+
 void
 grub_rescue_cmd_multiboot_loader (int argc, char *argv[])
 {
@@ -94,16 +122,14 @@ grub_rescue_cmd_multiboot_loader (int argc, char *argv[])
     }
 
   /* find which header is in the file */
-  if (find_multi_boot1_header(file))
+  if (find_multi_boot1_header (file))
     header_multi_ver_found = 1;
+  else if (find_multi_boot2_header (file))
+    header_multi_ver_found = 2;
   else
     {
-      /* The behavior is that if you don't find a multiboot 1 header
-         use multiboot 2 loader (as you do not have to have a header
-         to use multiboot 2 */
-      grub_dprintf ("multiboot_loader", "No multiboot 1 header found. \n \
-                       Using multiboot 2 loader\n");
-      header_multi_ver_found = 0;
+      grub_error (GRUB_ERR_BAD_OS, "Multiboot header not found");
+      goto fail;
     }
 
    /* close file before calling functions */