grub-devel
[Top][All Lists]
Advanced

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

[PATCH v0] Support to disable reed-solomon codes


From: Jon McCune
Subject: [PATCH v0] Support to disable reed-solomon codes
Date: Fri, 1 Nov 2013 17:04:00 -0700

 * new grub-*-setup flag to disable insertion of reed solomon codes
 * grub-install support for option --no-rs-codes

Signed-off-by: Jon McCune <address@hidden>
---
 include/grub/util/install.h |  4 ++--
 util/grub-install.in        |  7 ++++++-
 util/grub-setup.c           | 12 +++++++++++-
 util/setup.c                | 48 +++++++++++++++++++++++----------------------
 4 files changed, 44 insertions(+), 27 deletions(-)

diff --git a/include/grub/util/install.h b/include/grub/util/install.h
index 7eb6141..9b33368 100644
--- a/include/grub/util/install.h
+++ b/include/grub/util/install.h
@@ -53,12 +53,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.in b/util/grub-install.in
index 7cd089b..79d103f 100644
--- a/util/grub-install.in
+++ b/util/grub-install.in
@@ -87,6 +87,7 @@ usage () {
     print_option_help  "--removable" "$(gettext "the installation device is 
removable. This option is only available on EFI.")"
     print_option_help  "--bootloader-id=$(gettext "ID")" "$(gettext "the ID of 
bootloader. This option is only available on EFI.")"
     print_option_help "--efi-directory=$(gettext "DIR")" "$(gettext "use DIR 
as the EFI System Partition root.")"
+    print_option_help "--no-rs-codes" "$(gettext "Do not apply any 
reed-solomon codes, even if there is enough space.")"
 echo
 gettext "INSTALL_DEVICE must be system device filename.";echo
 echo
@@ -100,6 +101,7 @@ gettext "Report bugs to <address@hidden>."; echo
 allow_floppy=""
 force_file_id=
 efidir=
+no_rs_codes=""
 
 # Check the arguments.
 while test $# -gt 0
@@ -199,6 +201,9 @@ do
     --no-nvram)
        update_nvram=no ;;
 
+    --no-rs-codes)
+       no_rs_codes="--no-rs-codes" ;;
+
     # This is an undocumented feature...
     --debug)
        debug=yes ;;
@@ -680,7 +685,7 @@ fi
 # Perform the grub_modinfo_platform-dependent install
 if [ "${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = "i386-pc" ] || [ 
"${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = "sparc64-ieee1275" ] ; 
then
     # Now perform the installation.
-    "$grub_setup" ${allow_floppy} ${setup_verbose} ${setup_force} 
--directory="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform" \
+    "$grub_setup" ${allow_floppy} ${setup_verbose} ${setup_force} 
${no_rs_codes} 
--directory="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform" \
        --device-map="${device_map}" "${install_device}" || exit 1
 elif [ "${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = "i386-ieee1275" 
] || [ "${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = 
"powerpc-ieee1275" ]; then
 
diff --git a/util/grub-setup.c b/util/grub-setup.c
index 90b9de0..088efcf 100644
--- a/util/grub-setup.c
+++ b/util/grub-setup.c
@@ -83,6 +83,10 @@ static struct argp_option options[] = {
       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, even if there is enough space."), 
0},
+
+
   { 0, 0, 0, 0, 0, 0 }
 };
 
@@ -118,6 +122,7 @@ struct arguments
   int  fs_probe;
   int allow_floppy;
   char *device;
+  int no_rs_codes;
 };
 
 static error_t
@@ -173,6 +178,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 +301,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 5b7c384..95f173e 100644
--- a/util/setup.c
+++ b/util/setup.c
@@ -241,7 +241,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;
@@ -540,27 +540,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++)
@@ -574,7 +576,7 @@ SETUP (const char *dir,
   }
 
 unable_to_embed:
-#endif
+#endif  /* ifdef GRUB_SETUP_BIOS */
 
   if (dest_dev->disk->dev->id != root_dev->disk->dev->id)
     grub_util_error ("%s", _("embedding is not possible, but this is required 
for "
-- 
1.8.4.1




reply via email to

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