[grub2/f17] Handle some missed bits for newer autotools support (patch from khopp)
Peter Jones
pjones at fedoraproject.org
Mon Mar 12 19:42:56 UTC 2012
commit c7429be5d2b2281fdc5c76aecf47512b2f16ed53
Author: Peter Jones <pjones at redhat.com>
Date: Mon Mar 12 15:41:49 2012 -0400
Handle some missed bits for newer autotools support (patch from khopp)
- Handle PReP installation on PPC.
grub-1.99-prep_install_v2.patch | 575 +++++++++++++++++++++++++++++++++++++++
grub2.spec | 7 +-
2 files changed, 581 insertions(+), 1 deletions(-)
---
diff --git a/grub-1.99-prep_install_v2.patch b/grub-1.99-prep_install_v2.patch
new file mode 100644
index 0000000..4ca57cb
--- /dev/null
+++ b/grub-1.99-prep_install_v2.patch
@@ -0,0 +1,575 @@
+From: Paulo Flabiano Smorigo <pfsmorigo at linux.vnet.ibm.com>
+Date: Fri, 24 Feb 2012 17:26:02 -0400
+Subject: [PATCH] Pull in required v2 changes for PPC
+---
+
+diff --git a/grub-core/kern/ieee1275/cmain.c b/grub-core/kern/ieee1275/cmain.c
+index 2fbe809..9e80757 100644
+--- a/grub-core/kern/ieee1275/cmain.c
++++ b/grub-core/kern/ieee1275/cmain.c
+@@ -60,6 +60,10 @@ grub_ieee1275_find_options (void)
+ int is_olpc = 0;
+ int is_qemu = 0;
+
++#ifdef __sparc__
++ grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_NO_PARTITION_0);
++#endif
++
+ grub_ieee1275_finddevice ("/", &root);
+ grub_ieee1275_finddevice ("/options", &options);
+ grub_ieee1275_finddevice ("/openprom", &openprom);
+diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
+index 682a8b5..13a160f 100644
+--- a/grub-core/kern/ieee1275/init.c
++++ b/grub-core/kern/ieee1275/init.c
+@@ -69,36 +69,45 @@ grub_translate_ieee1275_path (char *filepath)
+ }
+
+ void
+-grub_machine_set_prefix (void)
++grub_machine_get_bootlocation (char **device, char **path)
+ {
+ char bootpath[64]; /* XXX check length */
+ char *filename;
+- char *prefix;
+-
+- if (grub_prefix[0])
+- {
+- grub_env_set ("prefix", grub_prefix);
+- /* Prefix is hardcoded in the core image. */
+- return;
+- }
+-
++ char *type;
++
+ if (grub_ieee1275_get_property (grub_ieee1275_chosen, "bootpath", &bootpath,
+ sizeof (bootpath), 0))
+ {
+ /* Should never happen. */
+ grub_printf ("/chosen/bootpath property missing!\n");
+- grub_env_set ("prefix", "");
+ return;
+ }
+
+ /* Transform an OF device path to a GRUB path. */
+
+- prefix = grub_ieee1275_encode_devname (bootpath);
++ type = grub_ieee1275_get_device_type (bootpath);
++ if (type && grub_strcmp (type, "network") == 0)
++ {
++ char *dev, *canon;
++ char *ptr;
++ dev = grub_ieee1275_get_aliasdevname (bootpath);
++ canon = grub_ieee1275_canonicalise_devname (dev);
++ ptr = canon + grub_strlen (canon) - 1;
++ while (ptr > canon && (*ptr == ',' || *ptr == ':'))
++ ptr--;
++ ptr++;
++ *ptr = 0;
++
++ grub_free (dev);
++ grub_free (canon);
++ }
++ else
++ *device = grub_ieee1275_encode_devname (bootpath);
++ grub_free (type);
+
+ filename = grub_ieee1275_get_filename (bootpath);
+ if (filename)
+ {
+- char *newprefix;
+ char *lastslash = grub_strrchr (filename, '\\');
+
+ /* Truncate at last directory. */
+@@ -107,19 +116,9 @@ grub_machine_set_prefix (void)
+ *lastslash = '\0';
+ grub_translate_ieee1275_path (filename);
+
+- newprefix = grub_xasprintf ("%s%s", prefix, filename);
+- if (newprefix)
+- {
+- grub_free (prefix);
+- prefix = newprefix;
+- }
++ *path = filename;
+ }
+ }
+-
+- grub_env_set ("prefix", prefix);
+-
+- grub_free (filename);
+- grub_free (prefix);
+ }
+
+ /* Claim some available memory in the first /memory node. */
+@@ -192,22 +191,12 @@ static void grub_claim_heap (void)
+ grub_machine_mmap_iterate (heap_init);
+ }
+
+-static grub_uint64_t ieee1275_get_time_ms (void);
+-
+-void
+-grub_machine_init (void)
++static void
++grub_parse_cmdline (void)
+ {
+- char args[256];
+ grub_ssize_t actual;
++ char args[256];
+
+- grub_ieee1275_init ();
+-
+- grub_console_init_early ();
+- grub_claim_heap ();
+- grub_console_init_lately ();
+- grub_ofdisk_init ();
+-
+- /* Process commandline. */
+ if (grub_ieee1275_get_property (grub_ieee1275_chosen, "bootargs", &args,
+ sizeof args, &actual) == 0
+ && actual > 1)
+@@ -240,6 +229,21 @@ grub_machine_init (void)
+ }
+ }
+ }
++}
++
++static grub_uint64_t ieee1275_get_time_ms (void);
++
++void
++grub_machine_init (void)
++{
++ grub_ieee1275_init ();
++
++ grub_console_init_early ();
++ grub_claim_heap ();
++ grub_console_init_lately ();
++ grub_ofdisk_init ();
++
++ grub_parse_cmdline ();
+
+ grub_install_get_time_ms (ieee1275_get_time_ms);
+ }
+diff --git a/grub-core/kern/ieee1275/openfw.c b/grub-core/kern/ieee1275/openfw.c
+index f5dc8ef..6aa57ea 100644
+--- a/grub-core/kern/ieee1275/openfw.c
++++ b/grub-core/kern/ieee1275/openfw.c
+@@ -27,6 +27,8 @@ enum grub_ieee1275_parse_type
+ {
+ GRUB_PARSE_FILENAME,
+ GRUB_PARSE_PARTITION,
++ GRUB_PARSE_DEVICE,
++ GRUB_PARSE_DEVICE_TYPE
+ };
+
+ /* Walk children of 'devpath', calling hook for each. */
+@@ -317,14 +319,9 @@ grub_ieee1275_parse_args (const char *path, enum grub_ieee1275_parse_type ptype)
+ {
+ char type[64]; /* XXX check size. */
+ char *device = grub_ieee1275_get_devname (path);
+- char *args = grub_ieee1275_get_devargs (path);
+ char *ret = 0;
+ grub_ieee1275_phandle_t dev;
+
+- if (!args)
+- /* Shouldn't happen. */
+- return 0;
+-
+ /* We need to know what type of device it is in order to parse the full
+ file path properly. */
+ if (grub_ieee1275_finddevice (device, &dev))
+@@ -339,49 +336,93 @@ grub_ieee1275_parse_args (const char *path, enum grub_ieee1275_parse_type ptype)
+ goto fail;
+ }
+
+- if (!grub_strcmp ("block", type))
++ switch (ptype)
+ {
+- /* The syntax of the device arguments is defined in the CHRP and PReP
+- IEEE1275 bindings: "[partition][,[filename]]". */
+- char *comma = grub_strchr (args, ',');
++ case GRUB_PARSE_DEVICE:
++ ret = grub_strdup (device);
++ break;
++ case GRUB_PARSE_DEVICE_TYPE:
++ ret = grub_strdup (type);
++ break;
++ case GRUB_PARSE_FILENAME:
++ {
++ char *comma;
++ char *args;
++
++ if (grub_strcmp ("block", type) != 0)
++ goto unknown;
++
++ args = grub_ieee1275_get_devargs (path);
++ if (!args)
++ /* Shouldn't happen. */
++ return 0;
+
+- if (ptype == GRUB_PARSE_FILENAME)
+- {
+- if (comma)
+- {
+- char *filepath = comma + 1;
+-
+- /* Make sure filepath has leading backslash. */
+- if (filepath[0] != '\\')
+- ret = grub_xasprintf ("\\%s", filepath);
+- else
+- ret = grub_strdup (filepath);
++ /* The syntax of the device arguments is defined in the CHRP and PReP
++ IEEE1275 bindings: "[partition][,[filename]]". */
++ comma = grub_strchr (args, ',');
++
++ if (comma)
++ {
++ char *filepath = comma + 1;
++
++ /* Make sure filepath has leading backslash. */
++ if (filepath[0] != '\\')
++ ret = grub_xasprintf ("\\%s", filepath);
++ else
++ ret = grub_strdup (filepath);
+ }
++ grub_free (args);
+ }
+- else if (ptype == GRUB_PARSE_PARTITION)
+- {
+- if (!comma)
+- ret = grub_strdup (args);
+- else
+- ret = grub_strndup (args, (grub_size_t)(comma - args));
+- }
+- }
+- else
+- {
+- /* XXX Handle net devices by configuring & registering a grub_net_dev
+- here, then return its name?
+- Example path: "net:<server ip>,<file name>,<client ip>,<gateway
+- ip>,<bootp retries>,<tftp retries>". */
++ break;
++ case GRUB_PARSE_PARTITION:
++ {
++ char *comma;
++ char *args;
++
++ if (grub_strcmp ("block", type) != 0)
++ goto unknown;
++
++ args = grub_ieee1275_get_devargs (path);
++ if (!args)
++ /* Shouldn't happen. */
++ return 0;
++
++ comma = grub_strchr (args, ',');
++ if (!comma)
++ ret = grub_strdup (args);
++ else
++ ret = grub_strndup (args, (grub_size_t)(comma - args));
++ /* Consistently provide numbered partitions to GRUB.
++ OpenBOOT traditionally uses alphabetical partition
++ specifiers. */
++ if (ret[0] >= 'a' && ret[0] <= 'z')
++ ret[0] = '1' + (ret[0] - 'a');
++ grub_free (args);
++ }
++ break;
++ default:
++ unknown:
+ grub_printf ("Unsupported type %s for device %s\n", type, device);
+ }
+
+ fail:
+ grub_free (device);
+- grub_free (args);
+ return ret;
+ }
+
+ char *
++grub_ieee1275_get_device_type (const char *path)
++{
++ return grub_ieee1275_parse_args (path, GRUB_PARSE_DEVICE_TYPE);
++}
++
++char *
++grub_ieee1275_get_aliasdevname (const char *path)
++{
++ return grub_ieee1275_parse_args (path, GRUB_PARSE_DEVICE);
++}
++
++char *
+ grub_ieee1275_get_filename (const char *path)
+ {
+ return grub_ieee1275_parse_args (path, GRUB_PARSE_FILENAME);
+@@ -403,10 +444,10 @@ grub_ieee1275_encode_devname (const char *path)
+ /* GRUB partition 1 is OF partition 0. */
+ partno++;
+
+- encoding = grub_xasprintf ("(%s,%d)", device, partno);
++ encoding = grub_xasprintf ("%s,%d", device, partno);
+ }
+ else
+- encoding = grub_xasprintf ("(%s)", device);
++ encoding = grub_xasprintf ("%s", device);
+
+ grub_free (partition);
+ grub_free (device);
+diff --git a/grub-core/kern/main.c b/grub-core/kern/main.c
+index da71232..6820f4c 100644
+--- a/grub-core/kern/main.c
++++ b/grub-core/kern/main.c
+@@ -129,27 +129,74 @@ grub_env_write_root (struct grub_env_var *var __attribute__ ((unused)),
+ return grub_strdup (val);
+ }
+
+-/* Set the root device according to the dl prefix. */
+ static void
+-grub_set_root_dev (void)
++grub_set_prefix_and_root (void)
+ {
+- const char *prefix;
++ char *device = NULL;
++ char *path = NULL;
++ char *fwdevice = NULL;
++ char *fwpath = NULL;
+
+ grub_register_variable_hook ("root", 0, grub_env_write_root);
+
+- prefix = grub_env_get ("prefix");
+-
+- if (prefix)
++ {
++ char *pptr = NULL;
++ if (grub_prefix[0] == '(')
++ {
++ pptr = grub_strrchr (grub_prefix, ')');
++ if (pptr)
++ {
++ device = grub_strndup (grub_prefix + 1, pptr - grub_prefix - 1);
++ pptr++;
++ }
++ }
++ if (!pptr)
++ pptr = grub_prefix;
++ if (pptr[0])
++ path = grub_strdup (pptr);
++ }
++ if ((!device || device[0] == ',' || !device[0]) || !path)
++ grub_machine_get_bootlocation (&fwdevice, &fwpath);
++
++ if (!device && fwdevice)
++ device = fwdevice;
++ else if (fwdevice && (device[0] == ',' || !device[0]))
+ {
+- char *dev;
++ /* We have a partition, but still need to fill in the drive. */
++ char *comma, *new_device;
++
++ comma = grub_strchr (fwdevice, ',');
++ if (comma)
++ {
++ char *drive = grub_strndup (fwdevice, comma - fwdevice);
++ new_device = grub_xasprintf ("%s%s", drive, device);
++ grub_free (drive);
++ }
++ else
++ new_device = grub_xasprintf ("%s%s", fwdevice, device);
+
+- dev = grub_file_get_device_name (prefix);
+- if (dev)
++ grub_free (fwdevice);
++ grub_free (device);
++ device = new_device;
++ }
++ if (fwpath && !path)
++ path = fwpath;
++ if (device)
++ {
++ char *prefix;
++
++ prefix = grub_xasprintf ("(%s)%s", device, path ? : "");
++ if (prefix)
+ {
+- grub_env_set ("root", dev);
+- grub_free (dev);
++ grub_env_set ("prefix", prefix);
++ grub_free (prefix);
+ }
++ grub_env_set ("root", device);
+ }
++
++ grub_free (device);
++ grub_free (path);
++ grub_print_error ();
+ }
+
+ /* Load the normal mode module and execute the normal mode if possible. */
+@@ -159,7 +206,7 @@ grub_load_normal_mode (void)
+ /* Load the module. */
+ grub_dl_load ("normal");
+
+- /* Something went wrong. Print errors here to let user know why we're entering rescue mode. */
++ /* Print errors if any. */
+ grub_print_error ();
+ grub_errno = 0;
+
+@@ -187,8 +234,7 @@ grub_main (void)
+
+ /* It is better to set the root device as soon as possible,
+ for convenience. */
+- grub_machine_set_prefix ();
+- grub_set_root_dev ();
++ grub_set_prefix_and_root ();
+ grub_env_export ("root");
+ grub_env_export ("prefix");
+
+diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h
+index 4c56cc2..fc977f5 100644
+--- a/include/grub/ieee1275/ieee1275.h
++++ b/include/grub/ieee1275/ieee1275.h
+@@ -195,7 +195,8 @@ char *EXPORT_FUNC(grub_ieee1275_get_filename) (const char *path);
+ int EXPORT_FUNC(grub_ieee1275_devices_iterate) (int (*hook)
+ (struct grub_ieee1275_devalias *
+ alias));
+-
++char *EXPORT_FUNC(grub_ieee1275_get_aliasdevname) (const char *path);
+ char *EXPORT_FUNC(grub_ieee1275_canonicalise_devname) (const char *path);
++char *EXPORT_FUNC(grub_ieee1275_get_device_type) (const char *path);
+
+ #endif /* ! GRUB_IEEE1275_HEADER */
+diff --git a/include/grub/kernel.h b/include/grub/kernel.h
+index 2ecc73d..09839de 100644
+--- a/include/grub/kernel.h
++++ b/include/grub/kernel.h
+@@ -84,7 +84,8 @@ void grub_machine_init (void);
+ void EXPORT_FUNC(grub_machine_fini) (void);
+
+ /* The machine-specific prefix initialization. */
+-void grub_machine_set_prefix (void);
++void
++grub_machine_get_bootlocation (char **device, char **path);
+
+ /* Register all the exported symbols. This is automatically generated. */
+ void grub_register_exported_symbols (void);
+diff --git a/util/grub-install.in b/util/grub-install.in
+index ff8bea8..cbf1e1e 100644
+--- a/util/grub-install.in
++++ b/util/grub-install.in
+@@ -271,7 +271,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
+
+@@ -522,11 +523,11 @@ if [ "x${devabstraction_module}" = "x" ] ; then
+ # Strip partition number
+ grub_partition="`echo "${grub_drive}" | sed -e 's/^[^,]*[,)]//; s/)$//'`"
+ grub_drive="`echo "${grub_drive}" | sed -e s/,[a-z0-9,]*//g`"
+- if [ "$disk_module" = ata ] || [ "x${grub_drive}" != "x${install_drive}" ] || ([ "x$platform" != xefi ] && [ "x$platform" != xpc ] && [ x"${target_cpu}-${platform}" != x"sparc64-ieee1275" ]) ; then
++ if [ "$disk_module" = ata ] || [ "x${grub_drive}" != "x${install_drive}" ] || ([ "x$platform" != xefi ] && [ "x$platform" != xpc ] && [ x"${platform}" != x"ieee1275" ]); then
+ # generic method (used on coreboot and ata mod)
+ uuid="`"$grub_probe" --device-map="${device_map}" --target=fs_uuid --device "${grub_device}"`"
+ if [ "x${uuid}" = "x" ] ; then
+- if [ "x$platform" != xefi ] && [ "x$platform" != xpc ] && [ x"${target_cpu}-${platform}" != x"sparc64-ieee1275" ]; then
++ if [ "x$platform" != xefi ] && [ "x$platform" != xpc ] && [ x"${platform}" != x"ieee1275" ]; then
+ echo "UUID needed with $platform, but the filesystem containing ${grubdir} does not support UUIDs." 1>&2
+ elif [ "$disk_module" = ata ]; then
+ echo "UUID needed with ata mod, but the filesystem containing ${grubdir} does not support UUIDs." 1>&2
+@@ -540,11 +541,12 @@ if [ "x${devabstraction_module}" = "x" ] ; then
+ echo 'set prefix=($root)'"${relative_grubdir}" >> "${grubdir}/load.cfg"
+ config_opt="-c ${grubdir}/load.cfg "
+ modules="$modules search_fs_uuid"
+- elif [ "x$platform" = xefi ] || [ "x$platform" = xpc ]; then
++ else
+ # we need to hardcode the partition number in the core image's prefix.
+ if [ x"$grub_partition" = x ]; then
+ prefix_drive="()"
+ else
++ # Comma is already there
+ prefix_drive="(,$grub_partition)"
+ fi
+ fi
+@@ -612,6 +614,30 @@ 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
++
++ # Check if device is with an ELF within or is blank
++ if [ "$(file -s "${install_device}" -b | awk '{ print $1 }')" = ELF ] || cmp -s -n $(blockdev --getsize64 ${install_device}) /dev/zero ${install_device} ; 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 0d5dac9..3512a79 100644
+--- a/util/grub-probe.c
++++ b/util/grub-probe.c
+@@ -54,6 +54,7 @@ enum {
+ PRINT_DEVICE,
+ PRINT_PARTMAP,
+ PRINT_ABSTRACTION,
++ PRINT_MSDOS_PARTTYPE
+ };
+
+ int print = PRINT_FS;
+@@ -221,6 +222,17 @@ probe (const char *path, char *device_name)
+ free (list);
+ list = tmp;
+ }
++ printf ("\n");
++ 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;
+ }
+
+@@ -289,7 +301,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)\n\
++ -t, --target=(fs|fs_uuid|fs_label|drive|device|partmap|abstraction|msdos_parttype)\n\
+ print filesystem module, GRUB drive, system device, partition map module or abstraction module [default=fs]\n\
+ -h, --help display this message and exit\n\
+ -V, --version print version information and exit\n\
+@@ -348,6 +360,8 @@ main (int argc, char *argv[])
+ print = PRINT_PARTMAP;
+ else if (!strcmp (optarg, "abstraction"))
+ print = PRINT_ABSTRACTION;
++ else if (!strcmp (optarg, "msdos_parttype"))
++ print = PRINT_MSDOS_PARTTYPE;
+ else
+ usage (1);
+ break;
diff --git a/grub2.spec b/grub2.spec
index 1f6b01c..6b8bc3f 100644
--- a/grub2.spec
+++ b/grub2.spec
@@ -18,7 +18,7 @@
Name: grub2
Epoch: 1
Version: 1.99
-Release: 17%{?dist}
+Release: 18%{?dist}
Summary: Bootloader with support for Linux, Multiboot and more
Group: System Environment/Base
@@ -41,6 +41,7 @@ Patch7: grub-1.99-fix_grub-probe_call.patch
Patch8: grub-1.99-handle-newer-autotools.patch
Patch9: grub-1.99-gcc-4.7.0.patch
Patch10: grub2-1.99-remove-serial.mod-test-from-00_header-748964.patch
+Patch11: grub-1.99-prep_install_v2.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@@ -380,6 +381,10 @@ fi
%endif
%changelog
+* Mon Mar 12 2012 Peter Jones <pjones at redhat.com> - 1.99-18
+- Handle some missed bits for newer autotools support (patch from khopp)
+- Handle PReP installation on PPC.
+
* Wed Mar 07 2012 Peter Jones <pjones at redhat.com> - 1.99-17
- Update for newer autotools and gcc 4.7.0
Related: rhbz#782144
More information about the scm-commits
mailing list