grub: add extra patches for ieee1275/disable altivec for ppc64
Closes: #11851 [via git-merge-pr] Signed-off-by: Jürgen Buchmüller <pullmoll@t-online.de>
This commit is contained in:
parent
b965d6cd97
commit
fcfba82744
5 changed files with 350 additions and 1 deletions
32
srcpkgs/grub/patches/ieee1275-clear-reset.patch
Normal file
32
srcpkgs/grub/patches/ieee1275-clear-reset.patch
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
From 54b741317568867fc4ad801a65397d05f3ea0f59 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Paulo Flabiano Smorigo <pfsmorigo@linux.vnet.ibm.com>
|
||||||
|
Date: Thu, 25 Sep 2014 18:41:29 -0300
|
||||||
|
Subject: Include a text attribute reset in the clear command for ppc
|
||||||
|
|
||||||
|
Always clear text attribute for clear command in order to avoid problems
|
||||||
|
after it boots.
|
||||||
|
|
||||||
|
* grub-core/term/terminfo.c: Add escape for text attribute reset
|
||||||
|
|
||||||
|
Bug-Ubuntu: https://bugs.launchpad.net/bugs/1295255
|
||||||
|
Origin: other, https://lists.gnu.org/archive/html/grub-devel/2014-09/msg00076.html
|
||||||
|
Last-Update: 2014-09-26
|
||||||
|
|
||||||
|
Patch-Name: ieee1275-clear-reset.patch
|
||||||
|
---
|
||||||
|
grub-core/term/terminfo.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/grub-core/term/terminfo.c b/grub-core/term/terminfo.c
|
||||||
|
index f0d3e3deb..7cb7909c8 100644
|
||||||
|
--- grub-core/term/terminfo.c
|
||||||
|
+++ grub-core/term/terminfo.c
|
||||||
|
@@ -151,7 +151,7 @@ grub_terminfo_set_current (struct grub_term_output *term,
|
||||||
|
/* Clear the screen. Using serial console, screen(1) only recognizes the
|
||||||
|
* ANSI escape sequence. Using video console, Apple Open Firmware
|
||||||
|
* (version 3.1.1) only recognizes the literal ^L. So use both. */
|
||||||
|
- data->cls = grub_strdup ("\e[2J");
|
||||||
|
+ data->cls = grub_strdup ("\e[2J\e[m");
|
||||||
|
data->reverse_video_on = grub_strdup ("\e[7m");
|
||||||
|
data->reverse_video_off = grub_strdup ("\e[m");
|
||||||
|
if (grub_strcmp ("ieee1275", str) == 0)
|
220
srcpkgs/grub/patches/install_powerpc_machtypes.patch
Normal file
220
srcpkgs/grub/patches/install_powerpc_machtypes.patch
Normal file
|
@ -0,0 +1,220 @@
|
||||||
|
From 35118b5023b0d9b4e3ad82f6e15fb696ad8e2a10 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 4b5502aeb..2ab907976 100644
|
||||||
|
--- grub-core/osdep/basic/platform.c
|
||||||
|
+++ grub-core/osdep/basic/platform.c
|
||||||
|
@@ -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";
|
||||||
|
+}
|
||||||
|
diff --git a/grub-core/osdep/linux/platform.c b/grub-core/osdep/linux/platform.c
|
||||||
|
index 35f1bcc0e..9805c36d4 100644
|
||||||
|
--- grub-core/osdep/linux/platform.c
|
||||||
|
+++ grub-core/osdep/linux/platform.c
|
||||||
|
@@ -23,6 +23,7 @@
|
||||||
|
#include <grub/emu/misc.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
+#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <sys/utsname.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;
|
||||||
|
+}
|
||||||
|
diff --git a/grub-core/osdep/unix/platform.c b/grub-core/osdep/unix/platform.c
|
||||||
|
index a3fcfcaca..28cb37e15 100644
|
||||||
|
--- grub-core/osdep/unix/platform.c
|
||||||
|
+++ grub-core/osdep/unix/platform.c
|
||||||
|
@@ -212,13 +212,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 912269191..c30025b13 100644
|
||||||
|
--- grub-core/osdep/windows/platform.c
|
||||||
|
+++ 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 5ca4811cd..9f517a1bb 100644
|
||||||
|
--- include/grub/util/install.h
|
||||||
|
+++ include/grub/util/install.h
|
||||||
|
@@ -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,
|
||||||
|
diff --git a/util/grub-install.c b/util/grub-install.c
|
||||||
|
index e1a0202da..70b22eec4 100644
|
||||||
|
--- util/grub-install.c
|
||||||
|
+++ util/grub-install.c
|
||||||
|
@@ -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;
|
|
@ -0,0 +1,40 @@
|
||||||
|
From 7c52efa9093592ade59a986c5606450741fb8e59 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Julian Andres Klode <julian.klode@canonical.com>
|
||||||
|
Date: Thu, 23 Aug 2018 13:25:30 +0200
|
||||||
|
Subject: ofnet: Initialize structs in bootpath parser
|
||||||
|
|
||||||
|
Code later on checks if variables inside the struct are
|
||||||
|
0 to see if they have been set, like if there were addresses
|
||||||
|
in the bootpath.
|
||||||
|
|
||||||
|
The variables were not initialized however, so the check
|
||||||
|
might suceed with uninitialized data, and a new interface
|
||||||
|
with random addresses has been added. This caused a weird
|
||||||
|
bug in Ubuntu, because when booting from network, we now
|
||||||
|
had two interfaces with the same name, and net_default_mac
|
||||||
|
pointed to the random one.
|
||||||
|
|
||||||
|
Bug-Ubuntu: https://bugs.launchpad.net/bugs/1785859
|
||||||
|
Signed-off-by: Julian Andres Klode <julian.klode@canonical.com>
|
||||||
|
Patch-Name: ofnet-init-structs-in-bootpath-parser.patch
|
||||||
|
Forwarded: https://lists.gnu.org/archive/html/grub-devel/2018-08/msg00074.html
|
||||||
|
Last-Update: 2018-08-23
|
||||||
|
---
|
||||||
|
grub-core/net/drivers/ieee1275/ofnet.c | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/grub-core/net/drivers/ieee1275/ofnet.c b/grub-core/net/drivers/ieee1275/ofnet.c
|
||||||
|
index a78d164db..3a753658b 100644
|
||||||
|
--- grub-core/net/drivers/ieee1275/ofnet.c
|
||||||
|
+++ grub-core/net/drivers/ieee1275/ofnet.c
|
||||||
|
@@ -154,8 +154,8 @@ grub_ieee1275_parse_bootpath (const char *devpath, char *bootpath,
|
||||||
|
char *equal_char = 0;
|
||||||
|
grub_size_t field_counter = 0;
|
||||||
|
|
||||||
|
- grub_net_network_level_address_t client_addr, gateway_addr, subnet_mask;
|
||||||
|
- grub_net_link_level_address_t hw_addr;
|
||||||
|
+ grub_net_network_level_address_t client_addr = {}, gateway_addr = {}, subnet_mask = {};
|
||||||
|
+ grub_net_link_level_address_t hw_addr = {};
|
||||||
|
grub_net_interface_flags_t flags = 0;
|
||||||
|
struct grub_net_network_level_interface *inter = NULL;
|
||||||
|
|
52
srcpkgs/grub/patches/ppc64el-disable-vsx.patch
Normal file
52
srcpkgs/grub/patches/ppc64el-disable-vsx.patch
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
From efc381a55124b12fc74ed8117283f11367c9372a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Paulo Flabiano Smorigo <pfsmorigo@linux.vnet.ibm.com>
|
||||||
|
Date: Thu, 25 Sep 2014 19:33:39 -0300
|
||||||
|
Subject: Disable VSX instruction
|
||||||
|
|
||||||
|
VSX bit is enabled by default for Power7 and Power8 CPU models,
|
||||||
|
so we need to disable them in order to avoid instruction exceptions.
|
||||||
|
Kernel will activate it when necessary.
|
||||||
|
|
||||||
|
* grub-core/kern/powerpc/ieee1275/startup.S: Disable VSX.
|
||||||
|
|
||||||
|
Also-By: Adhemerval Zanella <azanella@linux.vnet.ibm.com>
|
||||||
|
Also-By: Colin Watson <cjwatson@debian.org>
|
||||||
|
|
||||||
|
Origin: other, https://lists.gnu.org/archive/html/grub-devel/2014-09/msg00078.html
|
||||||
|
Last-Update: 2015-01-27
|
||||||
|
|
||||||
|
Patch-Name: ppc64el-disable-vsx.patch
|
||||||
|
---
|
||||||
|
grub-core/kern/powerpc/ieee1275/startup.S | 12 ++++++++++++
|
||||||
|
1 file changed, 12 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/grub-core/kern/powerpc/ieee1275/startup.S b/grub-core/kern/powerpc/ieee1275/startup.S
|
||||||
|
index 21c884b43..de9a9601a 100644
|
||||||
|
--- grub-core/kern/powerpc/ieee1275/startup.S
|
||||||
|
+++ grub-core/kern/powerpc/ieee1275/startup.S
|
||||||
|
@@ -20,6 +20,8 @@
|
||||||
|
#include <grub/symbol.h>
|
||||||
|
#include <grub/offsets.h>
|
||||||
|
|
||||||
|
+#define MSR_VSX 0x80
|
||||||
|
+
|
||||||
|
.extern __bss_start
|
||||||
|
.extern _end
|
||||||
|
|
||||||
|
@@ -28,6 +30,16 @@
|
||||||
|
.globl start, _start
|
||||||
|
start:
|
||||||
|
_start:
|
||||||
|
+ _start:
|
||||||
|
+
|
||||||
|
+ /* Disable VSX instruction */
|
||||||
|
+ mfmsr 0
|
||||||
|
+ oris 0,0,MSR_VSX
|
||||||
|
+ /* The "VSX Available" bit is in the lower half of the MSR, so we
|
||||||
|
+ don't need mtmsrd, which in any case won't work in 32-bit mode. */
|
||||||
|
+ mtmsr 0
|
||||||
|
+ isync
|
||||||
|
+
|
||||||
|
li 2, 0
|
||||||
|
li 13, 0
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Template file for 'grub'
|
# Template file for 'grub'
|
||||||
pkgname=grub
|
pkgname=grub
|
||||||
version=2.02
|
version=2.02
|
||||||
revision=4
|
revision=5
|
||||||
hostmakedepends="flex freetype-devel font-unifont-bdf"
|
hostmakedepends="flex freetype-devel font-unifont-bdf"
|
||||||
makedepends="libusb-compat-devel ncurses-devel freetype-devel
|
makedepends="libusb-compat-devel ncurses-devel freetype-devel
|
||||||
liblzma-devel device-mapper-devel fuse-devel"
|
liblzma-devel device-mapper-devel fuse-devel"
|
||||||
|
@ -50,6 +50,11 @@ do_configure() {
|
||||||
unset CC AS LD RANLIB CPP
|
unset CC AS LD RANLIB CPP
|
||||||
CFLAGS="$CFLAGS -fno-stack-protector"
|
CFLAGS="$CFLAGS -fno-stack-protector"
|
||||||
|
|
||||||
|
# building with altivec generates broken grub core
|
||||||
|
case "$XBPS_TARGET_MACHINE" in
|
||||||
|
ppc64*) CFLAGS="$CFLAGS -mno-altivec" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
configure_args+=" --enable-device-mapper --enable-cache-stats --enable-nls
|
configure_args+=" --enable-device-mapper --enable-cache-stats --enable-nls
|
||||||
--enable-grub-mkfont --enable-grub-mount --disable-werror
|
--enable-grub-mkfont --enable-grub-mount --disable-werror
|
||||||
--sbindir=/usr/bin"
|
--sbindir=/usr/bin"
|
||||||
|
|
Loading…
Reference in a new issue