From: Paulo de Rezende Pinatti Date: Mon, 23 Jan 2012 18:33:40 +0000 (+0100) Subject: * util/grub-install.in: Support dd'in into PreP partition. X-Git-Tag: 2.00~778 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=668327923fd02fb758cacf13bcd78fd5e0f9ef2f;p=thirdparty%2Fgrub.git * util/grub-install.in: Support dd'in into PreP partition. * util/grub-probe.c (probe): Support discovering partition type. (main): Support -t msdos_parttype. Also-By: Vladimir Serbinenko Also-By: pfsmorigo <> --- diff --git a/ChangeLog b/ChangeLog index 5e1498fa7..aae30b538 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2012-01-23 Paulo de Rezende Pinatti +2012-01-23 Vladimir Serbinenko +2012-01-23 pfsmorigo + + * util/grub-install.in: Support dd'in into PreP partition. + * util/grub-probe.c (probe): Support discovering partition type. + (main): Support -t msdos_parttype. + 2012-01-23 Vladimir Serbinenko * grub-core/normal/crypto.c (grub_crypto_autoload): Prevent diff --git a/util/grub-install.in b/util/grub-install.in index e58ed9ab3..96b1dfe76 100644 --- a/util/grub-install.in +++ b/util/grub-install.in @@ -274,7 +274,8 @@ if test "x$install_device" = x && ([ "${target_cpu}-${platform}" = "i386-pc" ] \ fi if ! ([ "${target_cpu}-${platform}" = "i386-pc" ] \ - || [ "${target_cpu}-${platform}" = "sparc64-ieee1275" ]); then + || [ "${target_cpu}-${platform}" = "sparc64-ieee1275" ] \ + || [ "${target_cpu}-${platform}" = "powerpc-ieee1275" ]); then install_device= fi @@ -653,6 +654,29 @@ elif [ "${target_cpu}-${platform}" = "i386-ieee1275" ] || [ "${target_cpu}-${pla # Point boot-device at the new grub install boot_device="$ofpath:$partno,"`"$grub_mkrelpath" "${grubdir}/core.${imgext}" | sed 's,/,\\\\,g'` + + # If a install device is defined, copy the core.elf to PReP partition. + if [ "${target_cpu}-${platform}" = "powerpc-ieee1275" ] \ + && [ -n "${install_device}" ]; then + if [ "$("${grub_probe}" -m "${device_map}" -d "${install_device}" -t msdos_parttype)" != "41" ]; then + echo "The chosen partition is not a PReP partition." + exit 1 + fi + + if [ "$(file -s "${install_device}" -b | awk '{ print $1 }')" = ELF ] || [ $(cmp /dev/zero "${install_device}" &>/dev/null) ]; then + # Change boot device to the harddisk root + boot_device="$ofpath" + dd if="${grubdir}/core.${imgext}" of="${install_device}" status=noxfer || { + echo "Failed to copy Grub to the PReP partition." + exit 1 + } + else + echo "The PReP partition is not empty. If you are sure you want to use it, run dd to clear it:" + echo " dd if=/dev/zero of=${install_device}" + exit 1 + fi + fi + "$nvsetenv" boot-device "$boot_device" || { echo "$nvsetenv failed." echo "You will have to set boot-device manually. At the Open Firmware prompt, type:" diff --git a/util/grub-probe.c b/util/grub-probe.c index ba96b8973..3750ce640 100644 --- a/util/grub-probe.c +++ b/util/grub-probe.c @@ -64,7 +64,8 @@ enum { PRINT_BAREMETAL_HINT, PRINT_EFI_HINT, PRINT_ARC_HINT, - PRINT_COMPATIBILITY_HINT + PRINT_COMPATIBILITY_HINT, + PRINT_MSDOS_PARTTYPE }; static int print = PRINT_FS; @@ -544,6 +545,16 @@ probe (const char *path, char *device_name) goto end; } + if (print == PRINT_MSDOS_PARTTYPE) + { + if (dev->disk->partition + && strcmp(dev->disk->partition->partmap->name, "msdos") == 0) + printf ("%02x", dev->disk->partition->msdostype); + + printf ("\n"); + goto end; + } + fs = grub_fs_probe (dev); if (! fs) grub_util_error ("%s", _(grub_errmsg)); @@ -609,7 +620,7 @@ Probe device information for a given path (or device, if the -d option is given) \n\ -d, --device given argument is a system device, not a path\n\ -m, --device-map=FILE use FILE as the device map [default=%s]\n\ - -t, --target=(fs|fs_uuid|fs_label|drive|device|partmap|abstraction|cryptodisk_uuid)\n\ + -t, --target=(fs|fs_uuid|fs_label|drive|device|partmap|abstraction|cryptodisk_uuid|msdos_parttype)\n\ print filesystem module, GRUB drive, system device, partition map module, abstraction module or CRYPTO UUID [default=fs]\n\ -h, --help display this message and exit\n\ -V, --version print version information and exit\n\ @@ -670,6 +681,8 @@ main (int argc, char *argv[]) print = PRINT_ABSTRACTION; else if (!strcmp (optarg, "cryptodisk_uuid")) print = PRINT_CRYPTODISK_UUID; + else if (!strcmp (optarg, "msdos_parttype")) + print = PRINT_MSDOS_PARTTYPE; else if (!strcmp (optarg, "hints_string")) print = PRINT_HINT_STR; else if (!strcmp (optarg, "bios_hints"))