grub-devel
[Top][All Lists]
Advanced

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

[PATCH v2] Support to disable reed-solomon codes


From: Jon McCune
Subject: [PATCH v2] Support to disable reed-solomon codes
Date: Mon, 25 Nov 2013 14:37:18 -0800

 [v0] new grub-*-setup flag to disable insertion of reed solomon codes
 [v0] grub-install support for option --no-rs-codes
 [v1] bugfix: also change the maxsec value in util/setup.c
 [v2] Modified to support new C-language install utilities, added documentation

Signed-off-by: Jon McCune <address@hidden>
---
 docs/grub.texi              | 12 +++++++++-
 include/grub/util/install.h |  4 ++--
 util/grub-install.c         | 20 ++++++++++++-----
 util/grub-setup.c           | 11 ++++++++--
 util/setup.c                | 53 +++++++++++++++++++++++++--------------------
 5 files changed, 66 insertions(+), 34 deletions(-)

diff --git a/docs/grub.texi b/docs/grub.texi
index 6aee292..29547cd 100644
--- a/docs/grub.texi
+++ b/docs/grub.texi
@@ -5937,8 +5937,18 @@ mounted on
 Recheck the device map, even if @file{/boot/grub/device.map} already
 exists. You should use this option whenever you add/remove a disk
 into/from your computer.
address@hidden table
 
address@hidden --no-rs-codes
+By default, @command{grub-install} will use some extra space in the
+bootloader embedding area for Reed-Solomon error-correcting
+codes. This enables GRUB to still boot successfully if one single
+block is corrupted.  This redundancy may be cumbersome if attempting
+to cryptographically validate the contents of the bootloader embedding
+area, or in more modern systems with GPT-style partition tables
+(@pxref{BIOS installation}) where GRUB does not reside in any
+unpartitioned space outside of the MBR.  Disable the Reed-Solomon
+codes with this option.
address@hidden table
 
 @node Invoking grub-mkconfig
 @chapter Invoking grub-mkconfig
diff --git a/include/grub/util/install.h b/include/grub/util/install.h
index 5cb33fc..2bfd2ec 100644
--- a/include/grub/util/install.h
+++ b/include/grub/util/install.h
@@ -176,12 +176,12 @@ void
 grub_util_bios_setup (const char *dir,
                      const char *boot_file, const char *core_file,
                      const char *dest, int force,
-                     int fs_probe, int allow_floppy);
+                     int fs_probe, int allow_floppy, int no_rs_codes);
 void
 grub_util_sparc_setup (const char *dir,
                       const char *boot_file, const char *core_file,
                       const char *dest, int force,
-                      int fs_probe, int allow_floppy);
+                      int fs_probe, int allow_floppy, int no_rs_codes);
 
 char *
 grub_install_get_image_targets_string (void);
diff --git a/util/grub-install.c b/util/grub-install.c
index 5354a6d..12d0bc2 100644
--- a/util/grub-install.c
+++ b/util/grub-install.c
@@ -68,6 +68,7 @@ static int have_load_cfg = 0;
 static FILE * load_cfg_f = NULL;
 static char *load_cfg;
 static int install_bootsector = 1;
+static int no_rs_codes = 0;
 
 enum
   {
@@ -93,7 +94,8 @@ enum
     OPTION_DEBUG_IMAGE,
     OPTION_NO_FLOPPY,
     OPTION_DISK_MODULE,
-    OPTION_NO_BOOTSECTOR
+    OPTION_NO_BOOTSECTOR,
+    OPTION_NO_RS_CODES,
   };
 
 static int fs_probe = 1;
@@ -180,6 +182,10 @@ argp_parser (int key, char *arg, struct argp_state *state)
       install_bootsector = 0;
       return 0;
 
+    case OPTION_NO_RS_CODES:
+      no_rs_codes = 1;
+      return 0;
+
     case OPTION_DEBUG:
       verbosity++;
       return 0;
@@ -238,6 +244,8 @@ static struct argp_option options[] = {
    N_("do not probe for filesystems in DEVICE"), 0},
   {"no-bootsector", OPTION_NO_BOOTSECTOR, 0, 0,
    N_("do not install bootsector"), 0},
+  {"no-rs-codes", OPTION_NO_RS_CODES, 0, 0,
+   N_("Do not apply any reed-solomon codes when embedding core.img, even if 
there is enough space."), 0},
 
   {"debug", OPTION_DEBUG, 0, OPTION_HIDDEN, 0, 2},
   {"no-floppy", OPTION_NO_FLOPPY, 0, OPTION_HIDDEN, 0, 2},
@@ -1412,12 +1420,13 @@ main (int argc, char *argv[])
                                              "boot.img");
        grub_install_copy_file (boot_img_src, boot_img, 1);
 
-       grub_util_info ("%sgrub-bios-setup %s %s %s %s --directory='%s' 
--device-map='%s' '%s'",
+       grub_util_info ("%sgrub-bios-setup %s %s %s %s %s --directory='%s' 
--device-map='%s' '%s'",
                        install_bootsector ? "" : "NOT RUNNING: ",
                        allow_floppy ? "--allow-floppy " : "",
                        verbosity ? "--verbose " : "",
                        force ? "--force " : "",
                        !fs_probe ? "--skip-fs-probe" : "",
+                       no_rs_codes ? "--no-rs-codes" : "",
                        platdir,
                        device_map,
                        install_device);
@@ -1426,7 +1435,7 @@ main (int argc, char *argv[])
        if (install_bootsector)
          grub_util_bios_setup (platdir, "boot.img", "core.img",
                                install_drive, force,
-                               fs_probe, allow_floppy);
+                               fs_probe, allow_floppy, no_rs_codes);
        break;
       }
     case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
@@ -1438,12 +1447,13 @@ main (int argc, char *argv[])
                                              "boot.img");
        grub_install_copy_file (boot_img_src, boot_img, 1);
 
-       grub_util_info ("%sgrub-sparc64-setup %s %s %s %s --directory='%s' 
--device-map='%s' '%s'",
+       grub_util_info ("%sgrub-sparc64-setup %s %s %s %s %s --directory='%s' 
--device-map='%s' '%s'",
                        install_bootsector ? "" : "NOT RUNNING: ",
                        allow_floppy ? "--allow-floppy " : "",
                        verbosity ? "--verbose " : "",
                        force ? "--force " : "",
                        !fs_probe ? "--skip-fs-probe" : "",
+                       no_rs_codes ? "--no-rs-codes" : "",
                        platdir,
                        device_map,
                        install_drive);
@@ -1452,7 +1462,7 @@ main (int argc, char *argv[])
        if (install_bootsector)
          grub_util_sparc_setup (platdir, "boot.img", "core.img",
                                 install_device, force,
-                                fs_probe, allow_floppy);
+                                fs_probe, allow_floppy, no_rs_codes);
        break;
       }
 
diff --git a/util/grub-setup.c b/util/grub-setup.c
index 90b9de0..41344d2 100644
--- a/util/grub-setup.c
+++ b/util/grub-setup.c
@@ -82,7 +82,8 @@ static struct argp_option options[] = {
    /* TRANSLATORS: The potential breakage isn't limited to floppies but it's
       likely to make the install unbootable from HDD.  */
    N_("make the drive also bootable as floppy (default for fdX devices). May 
break on some BIOSes."), 0},
-
+  {"no-rs-codes", 'n', 0,      0,
+   N_("Do not apply any reed-solomon codes when embedding core.img, even if 
there is enough space."), 0},
   { 0, 0, 0, 0, 0, 0 }
 };
 
@@ -118,6 +119,7 @@ struct arguments
   int  fs_probe;
   int allow_floppy;
   char *device;
+  int no_rs_codes;
 };
 
 static error_t
@@ -173,6 +175,10 @@ argp_parser (int key, char *arg, struct argp_state *state)
         verbosity++;
         break;
 
+      case 'n':
+        arguments->no_rs_codes = 1;
+        break;
+
       case ARGP_KEY_ARG:
         if (state->arg_num == 0)
           arguments->device = xstrdup(arg);
@@ -292,7 +298,8 @@ main (int argc, char *argv[])
                   arguments.boot_file ? : DEFAULT_BOOT_FILE,
                   arguments.core_file ? : DEFAULT_CORE_FILE,
                   dest_dev, arguments.force,
-                  arguments.fs_probe, arguments.allow_floppy);
+                  arguments.fs_probe, arguments.allow_floppy,
+                  arguments.no_rs_codes);
 
   /* Free resources.  */
   grub_fini_all ();
diff --git a/util/setup.c b/util/setup.c
index 337c304..b60a109 100644
--- a/util/setup.c
+++ b/util/setup.c
@@ -248,7 +248,7 @@ void
 SETUP (const char *dir,
        const char *boot_file, const char *core_file,
        const char *dest, int force,
-       int fs_probe, int allow_floppy)
+       int fs_probe, int allow_floppy, int no_rs_codes)
 {
   char *core_path;
   char *boot_img, *core_img, *boot_path;
@@ -486,7 +486,11 @@ SETUP (const char *dir,
 
     nsec = core_sectors;
 
-    maxsec = 2 * core_sectors;
+    if (!no_rs_codes)
+      maxsec = 2 * core_sectors;
+    else
+      maxsec = core_sectors;
+
     if (maxsec > ((0x78000 - GRUB_KERNEL_I386_PC_LINK_ADDR)
                >> GRUB_DISK_SECTOR_BITS))
       maxsec = ((0x78000 - GRUB_KERNEL_I386_PC_LINK_ADDR)
@@ -547,27 +551,29 @@ SETUP (const char *dir,
     bl.first_block = (struct grub_boot_blocklist *) (core_img
                                                     + GRUB_DISK_SECTOR_SIZE
                                                     - sizeof (*bl.block));
-
-    grub_size_t no_rs_length;
-    grub_set_unaligned32 ((core_img + GRUB_DISK_SECTOR_SIZE
-                          + GRUB_KERNEL_I386_PC_REED_SOLOMON_REDUNDANCY),
-                         grub_host_to_target32 (nsec * GRUB_DISK_SECTOR_SIZE - 
core_size));
-    no_rs_length = grub_target_to_host16 
-      (grub_get_unaligned16 (core_img
-                            + GRUB_DISK_SECTOR_SIZE
-                            + GRUB_KERNEL_I386_PC_NO_REED_SOLOMON_LENGTH));
-
-    if (no_rs_length == 0xffff)
-      grub_util_error ("%s", _("core.img version mismatch"));
-
-    void *tmp = xmalloc (core_size);
-    grub_memcpy (tmp, core_img, core_size);
-    grub_reed_solomon_add_redundancy (core_img + no_rs_length + 
GRUB_DISK_SECTOR_SIZE,
-                                     core_size - no_rs_length - 
GRUB_DISK_SECTOR_SIZE,
-                                     nsec * GRUB_DISK_SECTOR_SIZE
-                                     - core_size);
-    assert (grub_memcmp (tmp, core_img, core_size) == 0);
-    free (tmp);
+    if (!no_rs_codes)
+      {
+        grub_size_t no_rs_length;
+        grub_set_unaligned32 ((core_img + GRUB_DISK_SECTOR_SIZE
+                               + GRUB_KERNEL_I386_PC_REED_SOLOMON_REDUNDANCY),
+                              grub_host_to_target32 (nsec * 
GRUB_DISK_SECTOR_SIZE - core_size));
+        no_rs_length = grub_target_to_host16
+            (grub_get_unaligned16 (core_img
+                                   + GRUB_DISK_SECTOR_SIZE
+                                   + 
GRUB_KERNEL_I386_PC_NO_REED_SOLOMON_LENGTH));
+
+        if (no_rs_length == 0xffff)
+          grub_util_error ("%s", _("core.img version mismatch"));
+
+        void *tmp = xmalloc (core_size);
+        grub_memcpy (tmp, core_img, core_size);
+        grub_reed_solomon_add_redundancy (core_img + no_rs_length + 
GRUB_DISK_SECTOR_SIZE,
+                                          core_size - no_rs_length - 
GRUB_DISK_SECTOR_SIZE,
+                                          nsec * GRUB_DISK_SECTOR_SIZE
+                                          - core_size);
+        assert (grub_memcmp (tmp, core_img, core_size) == 0);
+        free (tmp);
+      }
 
     /* Write the core image onto the disk.  */
     for (i = 0; i < nsec; i++)
@@ -762,4 +768,3 @@ unable_to_embed:
   grub_device_close (dest_dev);
   grub_device_close (root_dev);
 }
-
-- 
1.8.4.1




reply via email to

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