grub-devel.gnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] Support to disable reed-solomon codes
@ 2013-11-25 22:37 Jon McCune
  2013-11-26  0:47 ` Vladimir 'φ-coder/phcoder' Serbinenko
  0 siblings, 1 reply; 4+ messages in thread
From: Jon McCune @ 2013-11-25 22:37 UTC (permalink / raw)
  To: grub-devel; +Cc: Jon McCune

 [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 <jonmccune@google.com>
---
 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.
-@end table
 
+@item --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.
+@end 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



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] Support to disable reed-solomon codes
  2013-11-25 22:37 [PATCH v2] Support to disable reed-solomon codes Jon McCune
@ 2013-11-26  0:47 ` Vladimir 'φ-coder/phcoder' Serbinenko
  2013-11-26 15:48   ` Jonathan McCune
  0 siblings, 1 reply; 4+ messages in thread
From: Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-11-26  0:47 UTC (permalink / raw)
  To: The development of GNU GRUB

[-- Attachment #1: Type: text/plain, Size: 11301 bytes --]

On 25.11.2013 23:37, Jon McCune wrote:
>  [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 <jonmccune@google.com>
> ---
>  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.
> -@end table
>  
> +@item --no-rs-codes
> +By default, @command{grub-install} will use some extra space in the
It must be clear that you speak about BIOS only.
> +bootloader embedding area for Reed-Solomon error-correcting
> +codes. This enables GRUB to still boot successfully if one single
> +block is corrupted.
We can survive more than one defective sector. If we have r sectors of
redundancy we can survive up to r/2 corrupted ones
>  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
What's the reasonning behind GPT part?
> +codes with this option.
> +@end 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;
> 

 Negative logic variables are unreadable and prone to errors. Could you
use positive logic?

>  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" : "",
On sparc it has no effect.
>  			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},
It doesn't seem to be important enough to give it a letter of its own.
>    { 0, 0, 0, 0, 0, 0 }
>  };
>  
Don't add it on sparc, it doesn't have any effect there.
> @@ -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"));
> +
I'd keep this check
> +        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);
>  }
> -
> 



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 291 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] Support to disable reed-solomon codes
  2013-11-26  0:47 ` Vladimir 'φ-coder/phcoder' Serbinenko
@ 2013-11-26 15:48   ` Jonathan McCune
  2013-11-26 16:09     ` Vladimir 'φ-coder/phcoder' Serbinenko
  0 siblings, 1 reply; 4+ messages in thread
From: Jonathan McCune @ 2013-11-26 15:48 UTC (permalink / raw)
  To: The development of GNU GRUB

[-- Attachment #1: Type: text/plain, Size: 14150 bytes --]

On Mon, Nov 25, 2013 at 4:47 PM, Vladimir 'φ-coder/phcoder' Serbinenko <
phcoder@gmail.com> wrote:

> On 25.11.2013 23:37, Jon McCune wrote:
> >  [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 <jonmccune@google.com>
> > ---
> >  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.
> > -@end table
> >
> > +@item --no-rs-codes
> > +By default, @command{grub-install} will use some extra space in the
> It must be clear that you speak about BIOS only.
>

Noted in v3.


> > +bootloader embedding area for Reed-Solomon error-correcting
> > +codes. This enables GRUB to still boot successfully if one single
> > +block is corrupted.
> We can survive more than one defective sector. If we have r sectors of
> redundancy we can survive up to r/2 corrupted ones
>

Noted in v3.


> >  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
> What's the reasonning behind GPT part?
>

I looked at these archived threads discussing the reasoning behind
including RS codes in the first place:
http://lists.gnu.org/archive/html/grub-devel/2010-09/msg00218.html
http://lists.gnu.org/archive/html/grub-devel/2010-09/msg00205.html
... and the motivation appeared to prioritize tolerating bad behavior from
proprietary software over actual disk errors.  I'm not aware of weird
proprietary software stealing blocks from a GPT BIOS boot partition.


> > +codes with this option.
> > +@end 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;
> >
>
>  Negative logic variables are unreadable and prone to errors. Could you
> use positive logic?
>

Sure, changed in v3.  I left the actual option as --no-rs-codes, and it
changes an option variable from its default of 1 to 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" : "",
> On sparc it has no effect.
>

Okay, added __attribute__ ((unused)) and a comment where it gets passed a 0
on sparc64.  The way setup.c is written it would be more invasive to
actually drop the parameter.


> >                       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},
> It doesn't seem to be important enough to give it a letter of its own.
>

Okay, dropped.  Not sure if the way I #defined a NO_RS_CODES_KEY -1 is the
right way to do an option with no short form.


> >    { 0, 0, 0, 0, 0, 0 }
> >  };
> >
> Don't add it on sparc, it doesn't have any effect there.
> > @@ -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"));
> > +
> I'd keep this check
>

Okay, moved it outside.


> > +        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);
> >  }
> > -
> >
>
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
>

[-- Attachment #2: Type: text/html, Size: 18514 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] Support to disable reed-solomon codes
  2013-11-26 15:48   ` Jonathan McCune
@ 2013-11-26 16:09     ` Vladimir 'φ-coder/phcoder' Serbinenko
  0 siblings, 0 replies; 4+ messages in thread
From: Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-11-26 16:09 UTC (permalink / raw)
  To: The development of GNU GRUB

[-- Attachment #1: Type: text/plain, Size: 1547 bytes --]

On 26.11.2013 16:48, Jonathan McCune wrote:

>     >  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
>     What's the reasonning behind GPT part?
> 
> 
> I looked at these archived threads discussing the reasoning behind
> including RS codes in the first place:
> http://lists.gnu.org/archive/html/grub-devel/2010-09/msg00218.html
> http://lists.gnu.org/archive/html/grub-devel/2010-09/msg00205.html
> ... and the motivation appeared to prioritize tolerating bad behavior
> from proprietary software over actual disk errors.  I'm not aware of
> weird proprietary software stealing blocks from a GPT BIOS boot partition.
>  
Perhaps we should contact Adobe to ask for an upgrade...
> Sure, changed in v3.  I left the actual option as --no-rs-codes, and it
> changes an option variable from its default of 1 to 0.
>  
Yes, that's what I meant.
> Okay, added __attribute__ ((unused)) and a comment where it gets passed
> a 0 on sparc64.  The way setup.c is written it would be more invasive to
> actually drop the parameter.
>  
Ok.
> 
> Okay, dropped.  Not sure if the way I #defined a NO_RS_CODES_KEY -1 is
> the right way to do an option with no short form.
>  
No, it should be enum and start at 0x100



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 291 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2013-11-26 16:09 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-11-25 22:37 [PATCH v2] Support to disable reed-solomon codes Jon McCune
2013-11-26  0:47 ` Vladimir 'φ-coder/phcoder' Serbinenko
2013-11-26 15:48   ` Jonathan McCune
2013-11-26 16:09     ` Vladimir 'φ-coder/phcoder' Serbinenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).