From 7391ac506ec5c4135bb91b9d53d4db00a57d8808 Mon Sep 17 00:00:00 2001 From: proski Date: Mon, 30 Jun 2008 23:52:24 +0000 Subject: [PATCH] 2008-06-30 Pavel Roskin * util/i386/pc/grub-setup.c (setup): Write install_dos_part and install_bsd_part immediately before core.img is embedded or modified on disk. This fixes core.img verification if core.img cannot be embedded. git-svn-id: svn+ssh://svn.savannah.gnu.org/grub/trunk/grub2@1659 d0de0278-0dc1-4c01-8a07-af38b3205e46 --- ChangeLog | 5 +++++ util/i386/pc/grub-setup.c | 27 ++++++++++++++++++--------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7ff96067..ab079c8d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2008-06-30 Pavel Roskin + * util/i386/pc/grub-setup.c (setup): Write install_dos_part and + install_bsd_part immediately before core.img is embedded or + modified on disk. This fixes core.img verification if core.img + cannot be embedded. + * util/i386/pc/grub-setup.c (setup): Use core_path_dev, not core_path to calculate the blocklist. Patch from Javier Martín diff --git a/util/i386/pc/grub-setup.c b/util/i386/pc/grub-setup.c index a5e3175b..c6f4810e 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,29 @@ 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 = pcdata->dos_part; + bsd_part = 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 = root_dev->disk->partition->index; + bsd_part = -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 = -1; + } + else + { + dos_part = grub_le_to_cpu32 (*install_dos_part); + bsd_part = grub_le_to_cpu32 (*install_bsd_part); } 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)); + dos_part, 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 +319,9 @@ setup (const char *dir, { grub_util_info ("will embed the core image at sector 0x%llx", embed_region.start); + *install_dos_part = grub_cpu_to_le32 (dos_part); + *install_bsd_part = grub_cpu_to_le32 (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 +491,9 @@ setup (const char *dir, the boot device. */ *root_drive = 0xFF; + *install_dos_part = grub_cpu_to_le32 (dos_part); + *install_bsd_part = grub_cpu_to_le32 (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"); -- 2.11.4.GIT