From 4b6f846398109576c218394c3d10bcb075c065a7 Mon Sep 17 00:00:00 2001 From: Colin Watson 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 #include #include +#include #include #include @@ -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;