grub-devel.gnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Enable install of grub2 in PReP partition
@ 2011-11-11 14:02 Paulo de Rezende Pinatti
  2011-11-11 15:11 ` Vladimir 'φ-coder/phcoder' Serbinenko
  0 siblings, 1 reply; 2+ messages in thread
From: Paulo de Rezende Pinatti @ 2011-11-11 14:02 UTC (permalink / raw)
  To: grub-devel

[-- Attachment #1: Type: text/plain, Size: 322 bytes --]

Hi,

This patch will enable the install and run of Grub 2 in the PReP 
partition for PowerPC machines. This procedure will only be used if a 
install_device argument is used with grub-install, otherwise it will be 
installed by the old way.

Best Regards

-- 
Paulo de Rezende Pinatti
Staff Software Engineer, LTC Brazil


[-- Attachment #2: grub-install-prep.patch --]
[-- Type: text/plain, Size: 3500 bytes --]

=== 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;


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2011-11-11 15:11 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-11 14:02 [PATCH] Enable install of grub2 in PReP partition Paulo de Rezende Pinatti
2011-11-11 15:11 ` Vladimir 'φ-coder/phcoder' Serbinenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).