]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* util/grub-mkimage.c (generate_image): Clean multiboot header to avoid
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Thu, 15 Dec 2011 19:29:30 +0000 (20:29 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Thu, 15 Dec 2011 19:29:30 +0000 (20:29 +0100)
confusing ipxe.

ChangeLog
util/grub-mkimage.c

index e3eee32c4371f4629890c02b5826014864873e1a..d7c458d1548f826404b2a043e6535f28d75c3365 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2011-12-15  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * util/grub-mkimage.c (generate_image): Clean multiboot header to avoid
+       confusing ipxe.
+
 2011-12-15  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/lib/libgcrypt/cipher/md4.c (transform) [WORDS_BIGENDIAN]:
index de43c44937007e55b4cc1a4199f53d5fccb4d321..ca8047df6cb22f64d870ecce8c3b8034c733b41a 100644 (file)
@@ -32,6 +32,7 @@
 #include <grub/crypto.h>
 #include <grub/dl.h>
 #include <time.h>
+#include <multiboot.h>
 
 #include <stdio.h>
 #include <unistd.h>
@@ -971,6 +972,7 @@ generate_image (const char *dir, char *prefix, FILE *out, char *mods[],
          {
            char *pxeboot_path, *pxeboot_img;
            size_t pxeboot_size;
+           grub_uint32_t *ptr;
            
            pxeboot_path = grub_util_get_path (dir, "pxeboot.img");
            pxeboot_size = grub_util_get_image_size (pxeboot_path);
@@ -979,6 +981,18 @@ generate_image (const char *dir, char *prefix, FILE *out, char *mods[],
            grub_util_write_image (pxeboot_img, pxeboot_size, out);
            free (pxeboot_img);
            free (pxeboot_path);
+
+           /* Remove Multiboot header to avoid confusing ipxe.  */
+           for (ptr = (grub_uint32_t *) core_img;
+                ptr < (grub_uint32_t *) (core_img + MULTIBOOT_SEARCH); ptr++)
+             if (*ptr == grub_host_to_target32 (MULTIBOOT_HEADER_MAGIC)
+                 && grub_target_to_host32 (ptr[0])
+                 + grub_target_to_host32 (ptr[1])
+                 + grub_target_to_host32 (ptr[2]) == 0)
+               {
+                 *ptr = 0;
+                 break;
+               }
          }
 
        boot_path = grub_util_get_path (dir, "diskboot.img");