[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
- [PATCH v0] Support to disable reed-solomon codes,
Jon McCune <=