grub-devel
[Top][All Lists]
Advanced

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

Re: Failure to embed core.img is fatal now


From: Pavel Roskin
Subject: Re: Failure to embed core.img is fatal now
Date: Thu, 26 Jun 2008 12:54:54 -0400

On Thu, 2008-06-26 at 10:48 -0400, Pavel Roskin wrote:

> Anyway, I think there is a much simpler approach.  Changes to the memory
> image of core.img should be applied after the image is tested for
> readability.  Until then, they should be in temporary variables.

Here's the patch.  It's an alternative to writing the second sector
first.  Now GRUB would modify core_img immediately before writing it.

diff --git a/util/i386/pc/grub-setup.c b/util/i386/pc/grub-setup.c
index 62c1bf1..3e9b4b5 100644
--- a/util/i386/pc/grub-setup.c
+++ b/util/i386/pc/grub-setup.c
@@ -101,6 +101,7 @@ setup (const char *dir,
   grub_uint16_t *boot_drive_check;
   struct boot_blocklist *first_block, *block;
   grub_int32_t *install_dos_part, *install_bsd_part;
+  grub_int32_t dos_part, bsd_part;
   char *tmp_img;
   int i;
   grub_disk_addr_t first_sector;
@@ -283,27 +284,24 @@ setup (const char *dir,
            {
              struct grub_pc_partition *pcdata =
                root_dev->disk->partition->data;
-             *install_dos_part
-               = grub_cpu_to_le32 (pcdata->dos_part);
-             *install_bsd_part
-               = grub_cpu_to_le32 (pcdata->bsd_part);
+             dos_part = grub_cpu_to_le32 (pcdata->dos_part);
+             bsd_part = grub_cpu_to_le32 (pcdata->bsd_part);
            }
          else if (strcmp (root_dev->disk->partition->partmap->name,
                           "gpt_partition_map") == 0)
            {
-             *install_dos_part = grub_cpu_to_le32 
(root_dev->disk->partition->index);
-             *install_bsd_part = grub_cpu_to_le32 (-1);
+             dos_part = grub_cpu_to_le32 (root_dev->disk->partition->index);
+             bsd_part = grub_cpu_to_le32 (-1);
            }
          else
            grub_util_error ("No PC style partitions found");
        }
       else
-       *install_dos_part = *install_bsd_part = grub_cpu_to_le32 (-1);
+       dos_part = bsd_part = grub_cpu_to_le32 (-1);
     }
   
   grub_util_info ("dos partition is %d, bsd partition is %d",
-                 grub_le_to_cpu32 (*install_dos_part),
-                 grub_le_to_cpu32 (*install_bsd_part));
+                 grub_le_to_cpu32 (dos_part), grub_le_to_cpu32 (bsd_part));
   
   /* If the destination device can have partitions and it is the MBR,
      try to embed the core image into after the MBR.  */
@@ -316,6 +314,9 @@ setup (const char *dir,
        {
          grub_util_info ("will embed the core image at sector 0x%llx", 
embed_region.start);
 
+         *install_dos_part = dos_part;
+         *install_bsd_part = bsd_part;
+
          /* The first blocklist contains the whole sectors.  */
          first_block->start = grub_cpu_to_le64 (embed_region.start + 1);
          first_block->len = grub_cpu_to_le16 (core_sectors - 1);
@@ -485,6 +486,9 @@ setup (const char *dir,
      the boot device.  */
   *root_drive = 0xFF;
 
+  *install_dos_part = dos_part;
+  *install_bsd_part = bsd_part;
+
   /* Write the first two sectors of the core image onto the disk.  */
   grub_util_info ("opening the core image `%s'", core_path);
   fp = fopen (core_path, "r+b");


-- 
Regards,
Pavel Roskin




reply via email to

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