From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1VcOhO-0005BU-4i for mharc-grub-devel@gnu.org; Fri, 01 Nov 2013 20:04:18 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51918) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VcOhK-0005B0-AV for grub-devel@gnu.org; Fri, 01 Nov 2013 20:04:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VcOhI-0005Ad-Tu for grub-devel@gnu.org; Fri, 01 Nov 2013 20:04:14 -0400 Received: from mail-qa0-x249.google.com ([2607:f8b0:400d:c00::249]:53407) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VcOhI-0005AU-Ot for grub-devel@gnu.org; Fri, 01 Nov 2013 20:04:12 -0400 Received: by mail-qa0-f73.google.com with SMTP id j15so164335qaq.2 for ; Fri, 01 Nov 2013 17:04:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=/f1X2Cpk3urRJonI9BAH1AS3pQmYax5GclmrfGJA+uQ=; b=WTZpfbrXKBgawRBc6FdWOWxmY/UNmwJ4Zr8pPmdrh8lXYJLV2tFEo0c5it3xCpFCRB SCFKAKYQIpTTg75XQ9gTDCp/D/jbCyx0u6TPMBxPLVOBvpgbDNVjdyWMDPQi2YIgU8i6 B+7V6i5+GuxQdH+Uwc7bashL0PoKvFcH48YSVS8AvLMON9WzKjNaqM8cWhxaNwvM2XS6 6zdEi1MW0APSORr3IVITUD8K3NnbMIbhRAoxaBf1Zi8gWYGzQCbAvBSZRESLPSm/q1Gj gbSe6d86Lgd2pR12AT28419imHP0gauW/7PJS5mlXx86cMpCrjFdRbRA1k2oDBuNzQbW KTzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=/f1X2Cpk3urRJonI9BAH1AS3pQmYax5GclmrfGJA+uQ=; b=kwtRZFYsP2LMRzxvxlm18zKUOgyWhIhbSc9yil0+08Ff1otDPNx8VCoLPGGM4EaNIi E/0Cn/ebGsxoT2xgCb34sqjbZICTB8VkyWpR7wKXYoNUwn1Ckb1uRuJXHlu9s4w5bPcx wdsNSBYHArEbrgY/aYletLg+pSdVvwNqBRE7XkhXl8a6itQEjcl68c/sgQ4q8RkUqx3h NPt9vyyP15kUpwUjhEVc7eJeT8ZI3k8C4Tx2MS/gJU8/hy/G5vVFjejHfs0bkqZHXrsO QFKUzYjN+BnITVkk6W0IolSTXlcAcSN2SWE4dbhhuKJ/Rp3h5XvHyT6tRIb3kUxWjNLt eKXg== X-Gm-Message-State: ALoCoQkXBnvippr9TdiV4eD5HL8TtvihgBpEnMrSYThd0x3H0J4rYPm3yXVpRWw2pJ5eyIAFJduXJX6I55mUAaWRuO9GbDzxxrxbI6hjkyJqakBpCbsjyVT7n6bGW3rPAT003uEr3G50TbKe/6Q5G5FAy20WTEzLXUWlq+eG8y/0OkPlFyPFE64AdNyNDGMqJ9fRztZxZq/s1Q41BYANJEJcBh6JiDAcJ1Tds3sFmJ4MYEZYoBden6g= X-Received: by 10.58.94.77 with SMTP id da13mr1805050veb.1.1383350651870; Fri, 01 Nov 2013 17:04:11 -0700 (PDT) Received: from corp2gmr1-2.hot.corp.google.com (corp2gmr1-2.hot.corp.google.com [172.24.189.93]) by gmr-mx.google.com with ESMTPS id t42si400677yhm.3.2013.11.01.17.04.11 for (version=TLSv1.1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 01 Nov 2013 17:04:11 -0700 (PDT) Received: from yinz.mtv.corp.google.com (yinz.mtv.corp.google.com [172.17.81.122]) by corp2gmr1-2.hot.corp.google.com (Postfix) with ESMTP id A43E45A41D9; Fri, 1 Nov 2013 17:04:11 -0700 (PDT) Received: by yinz.mtv.corp.google.com (Postfix, from userid 184367) id 40D5AC0CED; Fri, 1 Nov 2013 17:04:11 -0700 (PDT) From: Jon McCune To: grub-devel@gnu.org Subject: [PATCH v0] Support to disable reed-solomon codes Date: Fri, 1 Nov 2013 17:04:00 -0700 Message-Id: <1383350640-13907-1-git-send-email-jonmccune@google.com> X-Mailer: git-send-email 1.8.4.1 X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:400d:c00::249 Cc: Jon McCune X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 02 Nov 2013 00:04:16 -0000 * new grub-*-setup flag to disable insertion of reed solomon codes * grub-install support for option --no-rs-codes Signed-off-by: Jon McCune --- 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 ."; 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