В Fri, 1 Nov 2013 17:04:00 -0700 Jon McCune <jonmcc...@google.com> пишет:
> * new grub-*-setup flag to disable insertion of reed solomon codes > * grub-install support for option --no-rs-codes > What problem does it solve? > Signed-off-by: Jon McCune <jonmcc...@google.com> > --- > 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 <bug-g...@gnu.org>."; 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 " _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel