summaryrefslogtreecommitdiffstats
path: root/debian/patches/install-powerpc-machtypes.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/install-powerpc-machtypes.patch')
-rw-r--r--debian/patches/install-powerpc-machtypes.patch220
1 files changed, 220 insertions, 0 deletions
diff --git a/debian/patches/install-powerpc-machtypes.patch b/debian/patches/install-powerpc-machtypes.patch
new file mode 100644
index 0000000..385174f
--- /dev/null
+++ b/debian/patches/install-powerpc-machtypes.patch
@@ -0,0 +1,220 @@
+From 4b6f846398109576c218394c3d10bcb075c065a7 Mon Sep 17 00:00:00 2001
+From: Colin Watson <cjwatson@debian.org>
+Date: Tue, 28 Jan 2014 14:40:02 +0000
+Subject: Port yaboot logic for various powerpc machine types
+
+Some powerpc machines require not updating the NVRAM. This can be handled
+by existing grub-install command-line options, but it's friendlier to detect
+this automatically.
+
+On chrp_ibm machines, use the nvram utility rather than nvsetenv. (This
+is possibly suitable for other machines too, but that needs to be
+verified.)
+
+Forwarded: no
+Last-Update: 2014-10-15
+
+Patch-Name: install-powerpc-machtypes.patch
+---
+ grub-core/osdep/basic/platform.c | 5 +++
+ grub-core/osdep/linux/platform.c | 72 ++++++++++++++++++++++++++++++
+ grub-core/osdep/unix/platform.c | 28 +++++++++---
+ grub-core/osdep/windows/platform.c | 6 +++
+ include/grub/util/install.h | 3 ++
+ util/grub-install.c | 11 +++++
+ 6 files changed, 119 insertions(+), 6 deletions(-)
+
+diff --git a/grub-core/osdep/basic/platform.c b/grub-core/osdep/basic/platform.c
+index a7dafd85a..6c293ed2d 100644
+--- a/grub-core/osdep/basic/platform.c
++++ b/grub-core/osdep/basic/platform.c
+@@ -30,3 +30,8 @@ grub_install_get_default_x86_platform (void)
+ return "i386-pc";
+ }
+
++const char *
++grub_install_get_default_powerpc_machtype (void)
++{
++ return "generic";
++}
+diff --git a/grub-core/osdep/linux/platform.c b/grub-core/osdep/linux/platform.c
+index 2e7f72086..5b37366d4 100644
+--- a/grub-core/osdep/linux/platform.c
++++ b/grub-core/osdep/linux/platform.c
+@@ -24,6 +24,7 @@
+ #include <grub/emu/misc.h>
+ #include <sys/types.h>
+ #include <dirent.h>
++#include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+
+@@ -184,3 +185,74 @@ grub_install_get_default_x86_platform (void)
+ grub_util_info ("... not found");
+ return "i386-pc";
+ }
++
++const char *
++grub_install_get_default_powerpc_machtype (void)
++{
++ FILE *fp;
++ char *buf = NULL;
++ size_t len = 0;
++ const char *machtype = "generic";
++
++ fp = grub_util_fopen ("/proc/cpuinfo", "r");
++ if (! fp)
++ return machtype;
++
++ while (getline (&buf, &len, fp) > 0)
++ {
++ if (strncmp (buf, "pmac-generation",
++ sizeof ("pmac-generation") - 1) == 0)
++ {
++ if (strstr (buf, "NewWorld"))
++ {
++ machtype = "pmac_newworld";
++ break;
++ }
++ if (strstr (buf, "OldWorld"))
++ {
++ machtype = "pmac_oldworld";
++ break;
++ }
++ }
++
++ if (strncmp (buf, "motherboard", sizeof ("motherboard") - 1) == 0 &&
++ strstr (buf, "AAPL"))
++ {
++ machtype = "pmac_oldworld";
++ break;
++ }
++
++ if (strncmp (buf, "machine", sizeof ("machine") - 1) == 0 &&
++ strstr (buf, "CHRP IBM"))
++ {
++ if (strstr (buf, "qemu"))
++ {
++ machtype = "chrp_ibm_qemu";
++ break;
++ }
++ else
++ {
++ machtype = "chrp_ibm";
++ break;
++ }
++ }
++
++ if (strncmp (buf, "platform", sizeof ("platform") - 1) == 0)
++ {
++ if (strstr (buf, "Maple"))
++ {
++ machtype = "maple";
++ break;
++ }
++ if (strstr (buf, "Cell"))
++ {
++ machtype = "cell";
++ break;
++ }
++ }
++ }
++
++ free (buf);
++ fclose (fp);
++ return machtype;
++}
+diff --git a/grub-core/osdep/unix/platform.c b/grub-core/osdep/unix/platform.c
+index 55b8f4016..9c439326a 100644
+--- a/grub-core/osdep/unix/platform.c
++++ b/grub-core/osdep/unix/platform.c
+@@ -218,13 +218,29 @@ grub_install_register_ieee1275 (int is_prep, const char *install_device,
+ else
+ boot_device = get_ofpathname (install_device);
+
+- if (grub_util_exec ((const char * []){ "nvsetenv", "boot-device",
+- boot_device, NULL }))
++ if (strcmp (grub_install_get_default_powerpc_machtype (), "chrp_ibm") == 0)
+ {
+- char *cmd = xasprintf ("setenv boot-device %s", boot_device);
+- grub_util_error (_("`nvsetenv' failed. \nYou will have to set `boot-device' variable manually. At the IEEE1275 prompt, type:\n %s\n"),
+- cmd);
+- free (cmd);
++ char *arg = xasprintf ("boot-device=%s", boot_device);
++ if (grub_util_exec ((const char * []){ "nvram",
++ "--update-config", arg, NULL }))
++ {
++ char *cmd = xasprintf ("setenv boot-device %s", boot_device);
++ grub_util_error (_("`nvram' failed. \nYou will have to set `boot-device' variable manually. At the IEEE1275 prompt, type:\n %s\n"),
++ cmd);
++ free (cmd);
++ }
++ free (arg);
++ }
++ else
++ {
++ if (grub_util_exec ((const char * []){ "nvsetenv", "boot-device",
++ boot_device, NULL }))
++ {
++ char *cmd = xasprintf ("setenv boot-device %s", boot_device);
++ grub_util_error (_("`nvsetenv' failed. \nYou will have to set `boot-device' variable manually. At the IEEE1275 prompt, type:\n %s\n"),
++ cmd);
++ free (cmd);
++ }
+ }
+
+ free (boot_device);
+diff --git a/grub-core/osdep/windows/platform.c b/grub-core/osdep/windows/platform.c
+index 253f8d101..d18488f20 100644
+--- a/grub-core/osdep/windows/platform.c
++++ b/grub-core/osdep/windows/platform.c
+@@ -128,6 +128,12 @@ grub_install_get_default_x86_platform (void)
+ return "i386-efi";
+ }
+
++const char *
++grub_install_get_default_powerpc_machtype (void)
++{
++ return "generic";
++}
++
+ static void *
+ get_efi_variable (const wchar_t *varname, ssize_t *len)
+ {
+diff --git a/include/grub/util/install.h b/include/grub/util/install.h
+index 7df3191f4..135ba48d2 100644
+--- a/include/grub/util/install.h
++++ b/include/grub/util/install.h
+@@ -223,6 +223,9 @@ grub_install_get_default_arm_platform (void);
+ const char *
+ grub_install_get_default_x86_platform (void);
+
++const char *
++grub_install_get_default_powerpc_machtype (void);
++
+ int
+ grub_install_register_efi (grub_device_t efidir_grub_dev,
+ const char *efifile_path,
+diff --git a/util/grub-install.c b/util/grub-install.c
+index 48c8c0364..d02bd488a 100644
+--- a/util/grub-install.c
++++ b/util/grub-install.c
+@@ -1187,7 +1187,18 @@ main (int argc, char *argv[])
+
+ if (platform == GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275)
+ {
++ const char *machtype = grub_install_get_default_powerpc_machtype ();
+ int is_guess = 0;
++
++ if (strcmp (machtype, "pmac_oldworld") == 0)
++ update_nvram = 0;
++ else if (strcmp (machtype, "cell") == 0)
++ update_nvram = 0;
++ else if (strcmp (machtype, "generic") == 0)
++ update_nvram = 0;
++ else if (strcmp (machtype, "chrp_ibm_qemu") == 0)
++ update_nvram = 0;
++
+ if (!macppcdir)
+ {
+ char *d;