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
This commit is contained in:
Colin Watson 2014-01-28 14:40:02 +00:00
parent d36baf7811
commit 6e18b4772a
6 changed files with 119 additions and 6 deletions

View File

@ -24,3 +24,8 @@ grub_install_get_default_x86_platform (void)
return "i386-pc";
}
const char *
grub_install_get_default_powerpc_machtype (void)
{
return "generic";
}

View File

@ -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>
@ -145,3 +146,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;
}

View File

@ -212,6 +212,21 @@ grub_install_register_ieee1275 (int is_prep, const char *install_device,
else
boot_device = get_ofpathname (install_device);
if (strcmp (grub_install_get_default_powerpc_machtype (), "chrp_ibm") == 0)
{
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 }))
{
@ -220,6 +235,7 @@ grub_install_register_ieee1275 (int is_prep, const char *install_device,
cmd);
free (cmd);
}
}
free (boot_device);
}

View File

@ -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)
{

View File

@ -206,6 +206,9 @@ grub_install_create_envblk_file (const char *name);
const char *
grub_install_get_default_x86_platform (void);
const char *
grub_install_get_default_powerpc_machtype (void);
void
grub_install_register_efi (grub_device_t efidir_grub_dev,
const char *efifile_path,

View File

@ -1155,7 +1155,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;