=== modified file 'util/grub-install.in' --- util/grub-install.in 2011-11-05 11:15:07 +0000 +++ util/grub-install.in 2011-11-11 00:06:00 +0000 @@ -273,8 +273,7 @@ exit 1 fi -if ! ([ "${target_cpu}-${platform}" = "i386-pc" ] \ - || [ "${target_cpu}-${platform}" = "sparc64-ieee1275" ]); then +if ! ([ "${target_cpu}-${platform}" = "i386-pc" ] || [ "${platform}" = "ieee1275" ]); then install_device= fi @@ -643,6 +642,28 @@ # 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}" = "powerpc" ] && [ -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} 2>/dev/null || { + 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:" === modified file 'util/grub-probe.c' --- util/grub-probe.c 2011-11-08 11:38:30 +0000 +++ util/grub-probe.c 2011-11-11 00:02:52 +0000 @@ -55,7 +55,8 @@ PRINT_DEVICE, PRINT_PARTMAP, PRINT_ABSTRACTION, - PRINT_CRYPTODISK_UUID + PRINT_CRYPTODISK_UUID, + PRINT_MSDOS_PARTTYPE }; int print = PRINT_FS; @@ -231,6 +232,20 @@ goto end; } + if (print == PRINT_MSDOS_PARTTYPE) + { + if (dev->disk->partition == NULL) + { + grub_util_info ("no partition map found for %s", dev->disk->name); + } + + if (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); @@ -296,7 +311,7 @@ \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\ @@ -357,6 +372,8 @@ print = PRINT_ABSTRACTION; else if (!strcmp (optarg, "cryptodisk_uuid")) print = PRINT_CRYPTODISK_UUID; + else if (!strcmp (optarg, "msdos_parttype")) + print = PRINT_MSDOS_PARTTYPE; else usage (1); break;