Accepting request 228323 from home:michael-chang:SLE12
- snapper rollback support (fate#317062) * add btrfs_follow_default.patch * add suse_btrfs_grub2_install.sh * add 80_suse_btrfs_snapshot * refresh grub2-snapper-plugin.sh - add grub2-x86_64-xen subpackage (bnc#863821) - ieee1275: check for IBM pseries emulated machine (bnc#869964) - added patches: * grub2-ppc64-build-ppc64-32bit.patch - Build ppc64 as 32bit - added patches: * grub2-ppc64-build-ppc64-32bit.patch - Rename PowerPC patches so it will have architecture in it's name - added patches: * grub2-ppc64le-01-Add-Little-Endian-support-for-Power64-to-the-build.patch * grub2-ppc64le-02-Build-grub-as-O1-until-we-add-savegpr-and-restgpr-ro.patch * grub2-ppc64le-03-disable-creation-of-vsx-and-altivec-instructions.patch * grub2-ppc64le-04-powerpc64-LE-s-linker-knows-how-to-handle-the-undefi.patch * grub2-ppc64le-05-grub-install-can-now-recognize-and-install-a-LE-grub.patch * grub2-ppc64le-06-set-the-ABI-version-to-0x02-in-the-e_flag-of-the-PPC.patch * grub2-ppc64le-07-Add-IEEE1275_ADDR-helper.patch * grub2-ppc64le-08-Fix-some-more-warnings-when-casting.patch * grub2-ppc64le-09-Add-powerpc64-types.patch * grub2-ppc64le-10-powerpc64-is-not-necessarily-BigEndian-anymore.patch * grub2-ppc64le-11-Fix-warnings-when-building-powerpc-linux-loader-64bi.patch * grub2-ppc64le-12-GRUB_ELF_R_PPC_-processing-is-applicable-only-for-32.patch OBS-URL: https://build.opensuse.org/request/show/228323 OBS-URL: https://build.opensuse.org/package/show/Base:System/grub2?expand=0&rev=81
This commit is contained in:
parent
73ea23ebe4
commit
b05b350108
@ -11,12 +11,17 @@ v1:
|
||||
Introduce $boot_prefix for setting prefix on seeking other /boot
|
||||
directory.
|
||||
|
||||
v2:
|
||||
Refresh for s390x-emu.
|
||||
|
||||
Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
|
||||
Index: grub-2.02~beta2/util/grub.d/10_linux.in
|
||||
===================================================================
|
||||
--- grub-2.02~beta2.orig/util/grub.d/10_linux.in
|
||||
+++ grub-2.02~beta2/util/grub.d/10_linux.in
|
||||
---
|
||||
util/grub.d/10_linux.in | 57 ++++++++++++++++++++++++++++++++++++++++--------
|
||||
1 file changed, 48 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/util/grub.d/10_linux.in
|
||||
+++ b/util/grub.d/10_linux.in
|
||||
@@ -55,7 +55,9 @@ case x"$GRUB_FS" in
|
||||
xbtrfs)
|
||||
rootsubvol="`make_system_path_relative_to_its_root /`"
|
||||
@ -28,10 +33,10 @@ Index: grub-2.02~beta2/util/grub.d/10_linux.in
|
||||
GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
|
||||
fi;;
|
||||
xzfs)
|
||||
@@ -126,17 +128,43 @@ linux_entry ()
|
||||
fi
|
||||
@@ -145,17 +147,43 @@ linux_entry ()
|
||||
printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/"
|
||||
fi
|
||||
fi
|
||||
+
|
||||
+ if [ "x$overridable_root_by_subvol" = "xtrue" -a "x$GRUB_FS" = "xbtrfs" ]; then
|
||||
+ sed "s/^/$submenu_indentation/" << EOF
|
||||
@ -74,7 +79,7 @@ Index: grub-2.02~beta2/util/grub.d/10_linux.in
|
||||
fi
|
||||
if test -n "${initrd}" ; then
|
||||
# TRANSLATORS: ramdisk isn't identifier. Should be translated.
|
||||
@@ -144,13 +172,21 @@ EOF
|
||||
@@ -163,13 +191,21 @@ EOF
|
||||
if [ -d /sys/firmware/efi ] && [ "x${GRUB_USE_LINUXEFI}" = "xtrue" ]; then
|
||||
sed "s/^/$submenu_indentation/" << EOF
|
||||
echo '$message'
|
||||
@ -98,17 +103,21 @@ Index: grub-2.02~beta2/util/grub.d/10_linux.in
|
||||
fi
|
||||
fi
|
||||
sed "s/^/$submenu_indentation/" << EOF
|
||||
@@ -161,11 +197,11 @@ EOF
|
||||
@@ -179,10 +215,13 @@ EOF
|
||||
|
||||
machine=`uname -m`
|
||||
case "x$machine" in
|
||||
xi?86 | xx86_64)
|
||||
- list=`for i in /boot/vmlinuz-* /vmlinuz-* /boot/kernel-* ; do
|
||||
+ list=`for i in ${boot_prefix}/boot/vmlinuz-* ${boot_prefix}/vmlinuz-* ${boot_prefix}/boot/kernel-* ; do
|
||||
if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
|
||||
done` ;;
|
||||
*)
|
||||
- list=`for i in /boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* /boot/kernel-* ; do
|
||||
+ list=`for i in ${boot_prefix}/boot/vmlinuz-* ${boot_prefix}/boot/vmlinux-* ${boot_prefix}/vmlinuz-* ${boot_prefix}/vmlinux-* ${boot_prefix}/boot/kernel-* ; do
|
||||
if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
|
||||
done` ;;
|
||||
case "$machine" in
|
||||
- i?86 | x86_64) klist="/boot/vmlinuz-* /vmlinuz-* /boot/kernel-*" ;;
|
||||
- s390 | s390x) klist="/boot/image-* /boot/kernel-*" ;;
|
||||
- *) klist="/boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* \
|
||||
- /boot/kernel-*" ;;
|
||||
+ i?86 | x86_64) klist="${boot_prefix}/boot/vmlinuz-* \
|
||||
+ ${boot_prefix}/vmlinuz-* ${boot_prefix}/boot/kernel-*" ;;
|
||||
+ s390 | s390x) klist="${boot_prefix}/boot/image-* \
|
||||
+ ${boot_prefix}/boot/kernel-*" ;;
|
||||
+ *) klist="${boot_prefix}/boot/vmlinuz-* \
|
||||
+ ${boot_prefix}/boot/vmlinux-* ${boot_prefix}/vmlinuz-* \
|
||||
+ ${boot_prefix}/vmlinux-* /boot/kernel-*" ;;
|
||||
esac
|
||||
list=`for i in $klist; do
|
||||
if grub_file_is_not_garbage "$i" ; then
|
||||
|
10
80_suse_btrfs_snapshot
Normal file
10
80_suse_btrfs_snapshot
Normal file
@ -0,0 +1,10 @@
|
||||
#! /bin/sh
|
||||
set -e
|
||||
if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ] &&
|
||||
[ "x${GRUB_FS}" = "xbtrfs" ] ; then
|
||||
cat <<EOF
|
||||
if [ -f "/.snapshots/snapshot_submenu.cfg" ]; then
|
||||
source "/.snapshots/snapshot_submenu.cfg"
|
||||
fi
|
||||
EOF
|
||||
fi
|
99
SUSE_BTRFS_SNAPSHOT_BOOTING.patch
Normal file
99
SUSE_BTRFS_SNAPSHOT_BOOTING.patch
Normal file
@ -0,0 +1,99 @@
|
||||
Index: grub-2.02~beta2/util/grub-mkconfig_lib.in
|
||||
===================================================================
|
||||
--- grub-2.02~beta2.orig/util/grub-mkconfig_lib.in
|
||||
+++ grub-2.02~beta2/util/grub-mkconfig_lib.in
|
||||
@@ -49,7 +49,12 @@ grub_warn ()
|
||||
|
||||
make_system_path_relative_to_its_root ()
|
||||
{
|
||||
+ if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ] &&
|
||||
+ [ "x${GRUB_FS}" = "xbtrfs" ] ; then
|
||||
+ readlink -f "$1"
|
||||
+ else
|
||||
"${grub_mkrelpath}" "$1"
|
||||
+ fi
|
||||
}
|
||||
|
||||
is_path_readable_by_grub ()
|
||||
Index: grub-2.02~beta2/util/grub.d/00_header.in
|
||||
===================================================================
|
||||
--- grub-2.02~beta2.orig/util/grub.d/00_header.in
|
||||
+++ grub-2.02~beta2/util/grub.d/00_header.in
|
||||
@@ -27,6 +27,14 @@ export TEXTDOMAINDIR="@localedir@"
|
||||
|
||||
. "@datadir@/@PACKAGE@/grub-mkconfig_lib"
|
||||
|
||||
+if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ] &&
|
||||
+ [ "x${GRUB_FS}" = "xbtrfs" ] ; then
|
||||
+ cat <<EOF
|
||||
+set btrfs_relative_path="y"
|
||||
+export btrfs_relative_path
|
||||
+EOF
|
||||
+fi
|
||||
+
|
||||
# Do this as early as possible, since other commands might depend on it.
|
||||
# (e.g. the `loadfont' command might need lvm or raid modules)
|
||||
for i in ${GRUB_PRELOAD_MODULES} ; do
|
||||
@@ -43,7 +51,9 @@ if [ "x${GRUB_DEFAULT_BUTTON}" = "xsaved
|
||||
if [ "x${GRUB_TIMEOUT_BUTTON}" = "x" ] ; then GRUB_TIMEOUT_BUTTON="$GRUB_TIMEOUT" ; fi
|
||||
|
||||
cat << EOF
|
||||
-if [ -s \$prefix/grubenv ]; then
|
||||
+if [ -f \${config_directory}/grubenv ]; then
|
||||
+ load_env -f \${config_directory}/grubenv
|
||||
+elif [ -s \$prefix/grubenv ]; then
|
||||
load_env
|
||||
fi
|
||||
EOF
|
||||
Index: grub-2.02~beta2/util/grub-mkconfig.in
|
||||
===================================================================
|
||||
--- grub-2.02~beta2.orig/util/grub-mkconfig.in
|
||||
+++ grub-2.02~beta2/util/grub-mkconfig.in
|
||||
@@ -250,7 +250,8 @@ export GRUB_DEFAULT \
|
||||
GRUB_OS_PROBER_SKIP_LIST \
|
||||
GRUB_DISABLE_SUBMENU \
|
||||
GRUB_CMDLINE_LINUX_RECOVERY \
|
||||
- GRUB_USE_LINUXEFI
|
||||
+ GRUB_USE_LINUXEFI \
|
||||
+ SUSE_BTRFS_SNAPSHOT_BOOTING
|
||||
|
||||
if test "x${grub_cfg}" != "x"; then
|
||||
rm -f "${grub_cfg}.new"
|
||||
Index: grub-2.02~beta2/util/grub.d/10_linux.in
|
||||
===================================================================
|
||||
--- grub-2.02~beta2.orig/util/grub.d/10_linux.in
|
||||
+++ grub-2.02~beta2/util/grub.d/10_linux.in
|
||||
@@ -53,10 +53,14 @@ fi
|
||||
|
||||
case x"$GRUB_FS" in
|
||||
xbtrfs)
|
||||
+ if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ]; then
|
||||
+ GRUB_CMDLINE_LINUX="${GRUB_CMDLINE_LINUX} \${extra_cmdline}"
|
||||
+ else
|
||||
rootsubvol="`make_system_path_relative_to_its_root /`"
|
||||
rootsubvol="${rootsubvol#/}"
|
||||
if [ "x${rootsubvol}" != x ]; then
|
||||
GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
|
||||
+ fi
|
||||
fi;;
|
||||
xzfs)
|
||||
rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || true`
|
||||
Index: grub-2.02~beta2/util/grub.d/20_linux_xen.in
|
||||
===================================================================
|
||||
--- grub-2.02~beta2.orig/util/grub.d/20_linux_xen.in
|
||||
+++ grub-2.02~beta2/util/grub.d/20_linux_xen.in
|
||||
@@ -67,10 +67,14 @@ fi
|
||||
|
||||
case x"$GRUB_FS" in
|
||||
xbtrfs)
|
||||
+ if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ]; then
|
||||
+ GRUB_CMDLINE_LINUX="${GRUB_CMDLINE_LINUX} \${extra_cmdline}"
|
||||
+ else
|
||||
rootsubvol="`make_system_path_relative_to_its_root /`"
|
||||
rootsubvol="${rootsubvol#/}"
|
||||
if [ "x${rootsubvol}" != x ]; then
|
||||
GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
|
||||
+ fi
|
||||
fi;;
|
||||
xzfs)
|
||||
rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || true`
|
179
btrfs_follow_default.patch
Normal file
179
btrfs_follow_default.patch
Normal file
@ -0,0 +1,179 @@
|
||||
Index: grub-2.02~beta2/grub-core/fs/btrfs.c
|
||||
===================================================================
|
||||
--- grub-2.02~beta2.orig/grub-core/fs/btrfs.c
|
||||
+++ grub-2.02~beta2/grub-core/fs/btrfs.c
|
||||
@@ -913,6 +913,7 @@ grub_btrfs_mount (grub_device_t dev)
|
||||
{
|
||||
struct grub_btrfs_data *data;
|
||||
grub_err_t err;
|
||||
+ const char *relpath = grub_env_get ("btrfs_relative_path");
|
||||
|
||||
if (!dev->disk)
|
||||
{
|
||||
@@ -943,11 +944,14 @@ grub_btrfs_mount (grub_device_t dev)
|
||||
data->devices_attached[0].dev = dev;
|
||||
data->devices_attached[0].id = data->sblock.this_device.device_id;
|
||||
|
||||
- err = btrfs_handle_subvol (data);
|
||||
- if (err)
|
||||
+ if (relpath && (relpath[0] == '1' || relpath[0] == 'y'))
|
||||
{
|
||||
- grub_free (data);
|
||||
- return NULL;
|
||||
+ err = btrfs_handle_subvol (data);
|
||||
+ if (err)
|
||||
+ {
|
||||
+ grub_free (data);
|
||||
+ return NULL;
|
||||
+ }
|
||||
}
|
||||
|
||||
return data;
|
||||
@@ -1407,24 +1411,39 @@ find_path (struct grub_btrfs_data *data,
|
||||
grub_size_t allocated = 0;
|
||||
struct grub_btrfs_dir_item *direl = NULL;
|
||||
struct grub_btrfs_key key_out;
|
||||
+ int follow_default;
|
||||
const char *ctoken;
|
||||
grub_size_t ctokenlen;
|
||||
char *path_alloc = NULL;
|
||||
char *origpath = NULL;
|
||||
unsigned symlinks_max = 32;
|
||||
+ const char *relpath = grub_env_get ("btrfs_relative_path");
|
||||
|
||||
+ follow_default = 0;
|
||||
origpath = grub_strdup (path);
|
||||
if (!origpath)
|
||||
return grub_errno;
|
||||
|
||||
- if (data->fs_tree)
|
||||
+ if (relpath && (relpath[0] == '1' || relpath[0] == 'y'))
|
||||
{
|
||||
- *type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY;
|
||||
- *tree = data->fs_tree;
|
||||
- /* This is a tree root, so everything starts at objectid 256 */
|
||||
- key->object_id = grub_cpu_to_le64_compile_time (GRUB_BTRFS_OBJECT_ID_CHUNK);
|
||||
- key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM;
|
||||
- key->offset = 0;
|
||||
+ if (data->fs_tree)
|
||||
+ {
|
||||
+ *type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY;
|
||||
+ *tree = data->fs_tree;
|
||||
+ /* This is a tree root, so everything starts at objectid 256 */
|
||||
+ key->object_id = grub_cpu_to_le64_compile_time (GRUB_BTRFS_OBJECT_ID_CHUNK);
|
||||
+ key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM;
|
||||
+ key->offset = 0;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ *type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY;
|
||||
+ *tree = data->sblock.root_tree;
|
||||
+ key->object_id = data->sblock.root_dir_objectid;
|
||||
+ key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM;
|
||||
+ key->offset = 0;
|
||||
+ follow_default = 1;
|
||||
+ }
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1435,15 +1454,23 @@ find_path (struct grub_btrfs_data *data,
|
||||
|
||||
while (1)
|
||||
{
|
||||
- while (path[0] == '/')
|
||||
- path++;
|
||||
- if (!path[0])
|
||||
- break;
|
||||
- slash = grub_strchr (path, '/');
|
||||
- if (!slash)
|
||||
- slash = path + grub_strlen (path);
|
||||
- ctoken = path;
|
||||
- ctokenlen = slash - path;
|
||||
+ if (!follow_default)
|
||||
+ {
|
||||
+ while (path[0] == '/')
|
||||
+ path++;
|
||||
+ if (!path[0])
|
||||
+ break;
|
||||
+ slash = grub_strchr (path, '/');
|
||||
+ if (!slash)
|
||||
+ slash = path + grub_strlen (path);
|
||||
+ ctoken = path;
|
||||
+ ctokenlen = slash - path;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ ctoken = "default";
|
||||
+ ctokenlen = sizeof ("default") - 1;
|
||||
+ }
|
||||
|
||||
if (*type != GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY)
|
||||
{
|
||||
@@ -1454,7 +1481,9 @@ find_path (struct grub_btrfs_data *data,
|
||||
|
||||
if (ctokenlen == 1 && ctoken[0] == '.')
|
||||
{
|
||||
- path = slash;
|
||||
+ if (!follow_default)
|
||||
+ path = slash;
|
||||
+ follow_default = 0;
|
||||
continue;
|
||||
}
|
||||
if (ctokenlen == 2 && ctoken[0] == '.' && ctoken[1] == '.')
|
||||
@@ -1485,8 +1514,9 @@ find_path (struct grub_btrfs_data *data,
|
||||
*type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY;
|
||||
key->object_id = key_out.offset;
|
||||
|
||||
- path = slash;
|
||||
-
|
||||
+ if (!follow_default)
|
||||
+ path = slash;
|
||||
+ follow_default = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1555,7 +1585,9 @@ find_path (struct grub_btrfs_data *data,
|
||||
return err;
|
||||
}
|
||||
|
||||
- path = slash;
|
||||
+ if (!follow_default)
|
||||
+ path = slash;
|
||||
+ follow_default = 0;
|
||||
if (cdirel->type == GRUB_BTRFS_DIR_ITEM_TYPE_SYMLINK)
|
||||
{
|
||||
struct grub_btrfs_inode inode;
|
||||
@@ -1605,14 +1637,26 @@ find_path (struct grub_btrfs_data *data,
|
||||
path = path_alloc = tmp;
|
||||
if (path[0] == '/')
|
||||
{
|
||||
- if (data->fs_tree)
|
||||
+ if (relpath && (relpath[0] == '1' || relpath[0] == 'y'))
|
||||
{
|
||||
- *type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY;
|
||||
- *tree = data->fs_tree;
|
||||
- /* This is a tree root, so everything starts at objectid 256 */
|
||||
- key->object_id = grub_cpu_to_le64_compile_time (GRUB_BTRFS_OBJECT_ID_CHUNK);
|
||||
- key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM;
|
||||
- key->offset = 0;
|
||||
+ if (data->fs_tree)
|
||||
+ {
|
||||
+ *type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY;
|
||||
+ *tree = data->fs_tree;
|
||||
+ /* This is a tree root, so everything starts at objectid 256 */
|
||||
+ key->object_id = grub_cpu_to_le64_compile_time (GRUB_BTRFS_OBJECT_ID_CHUNK);
|
||||
+ key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM;
|
||||
+ key->offset = 0;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ *type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY;
|
||||
+ *tree = data->sblock.root_tree;
|
||||
+ key->object_id = data->sblock.root_dir_objectid;
|
||||
+ key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM;
|
||||
+ key->offset = 0;
|
||||
+ follow_default = 1;
|
||||
+ }
|
||||
}
|
||||
else
|
||||
{
|
@ -1,301 +0,0 @@
|
||||
Index: grub-2.02~beta2/configure.ac
|
||||
===================================================================
|
||||
--- grub-2.02~beta2.orig/configure.ac
|
||||
+++ grub-2.02~beta2/configure.ac
|
||||
@@ -1014,7 +1014,7 @@ else
|
||||
CFLAGS="$TARGET_CFLAGS -nostdlib -Wno-error"
|
||||
fi
|
||||
CPPFLAGS="$TARGET_CPPFLAGS"
|
||||
-if test x$target_cpu = xi386 || test x$target_cpu = xx86_64 || test "x$grub_cv_cc_target_clang" = xyes ; then
|
||||
+if test x$target_cpu = xi386 || test x$target_cpu = xx86_64 || test x$target_cpu = xpowerpc || test "x$grub_cv_cc_target_clang" = xyes ; then
|
||||
TARGET_LIBGCC=
|
||||
else
|
||||
TARGET_LIBGCC=-lgcc
|
||||
Index: grub-2.02~beta2/grub-core/kern/powerpc/crtsavres.S
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
+++ grub-2.02~beta2/grub-core/kern/powerpc/crtsavres.S
|
||||
@@ -0,0 +1,125 @@
|
||||
+/*
|
||||
+ * Special support for eabi and SVR4
|
||||
+ *
|
||||
+ * Copyright (C) 1995, 1996, 1998, 2000, 2001 Free Software Foundation, Inc.
|
||||
+ * Written By Michael Meissner
|
||||
+ * 64-bit support written by David Edelsohn
|
||||
+ *
|
||||
+ * This file is free software; you can redistribute it and/or modify it
|
||||
+ * under the terms of the GNU General Public License as published by the
|
||||
+ * Free Software Foundation; either version 2, or (at your option) any
|
||||
+ * later version.
|
||||
+ *
|
||||
+ * In addition to the permissions in the GNU General Public License, the
|
||||
+ * Free Software Foundation gives you unlimited permission to link the
|
||||
+ * compiled version of this file with other programs, and to distribute
|
||||
+ * those programs without any restriction coming from the use of this
|
||||
+ * file. (The General Public License restrictions do apply in other
|
||||
+ * respects; for example, they cover modification of the file, and
|
||||
+ * distribution when not linked into another program.)
|
||||
+ *
|
||||
+ * This file is distributed in the hope that it will be useful, but
|
||||
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ * General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program; see the file COPYING. If not, write to
|
||||
+ * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
|
||||
+ * Boston, MA 02110-1301, USA.
|
||||
+ *
|
||||
+ * As a special exception, if you link this library with files
|
||||
+ * compiled with GCC to produce an executable, this does not cause
|
||||
+ * the resulting executable to be covered by the GNU General Public License.
|
||||
+ * This exception does not however invalidate any other reasons why
|
||||
+ * the executable file might be covered by the GNU General Public License.
|
||||
+ */
|
||||
+
|
||||
+/* Do any initializations needed for the eabi environment */
|
||||
+
|
||||
+ .file "crtsavres.S"
|
||||
+ .section ".text"
|
||||
+
|
||||
+/* On PowerPC64 Linux, these functions are provided by the linker. */
|
||||
+#ifndef __powerpc64__
|
||||
+
|
||||
+#define FUNC_START(name) \
|
||||
+ .type name,@function; \
|
||||
+ .globl name; \
|
||||
+name:
|
||||
+
|
||||
+/* Routines for saving integer registers, called by the compiler. */
|
||||
+/* Called with r11 pointing to the stack header word of the caller of the */
|
||||
+/* function, just beyond the end of the integer save area. */
|
||||
+
|
||||
+FUNC_START(_savegpr_14) stw 14,-72(11) /* save gp registers */
|
||||
+FUNC_START(_savegpr_15) stw 15,-68(11)
|
||||
+FUNC_START(_savegpr_16) stw 16,-64(11)
|
||||
+FUNC_START(_savegpr_17) stw 17,-60(11)
|
||||
+FUNC_START(_savegpr_18) stw 18,-56(11)
|
||||
+FUNC_START(_savegpr_19) stw 19,-52(11)
|
||||
+FUNC_START(_savegpr_20) stw 20,-48(11)
|
||||
+FUNC_START(_savegpr_21) stw 21,-44(11)
|
||||
+FUNC_START(_savegpr_22) stw 22,-40(11)
|
||||
+FUNC_START(_savegpr_23) stw 23,-36(11)
|
||||
+FUNC_START(_savegpr_24) stw 24,-32(11)
|
||||
+FUNC_START(_savegpr_25) stw 25,-28(11)
|
||||
+FUNC_START(_savegpr_26) stw 26,-24(11)
|
||||
+FUNC_START(_savegpr_27) stw 27,-20(11)
|
||||
+FUNC_START(_savegpr_28) stw 28,-16(11)
|
||||
+FUNC_START(_savegpr_29) stw 29,-12(11)
|
||||
+FUNC_START(_savegpr_30) stw 30,-8(11)
|
||||
+FUNC_START(_savegpr_31) stw 31,-4(11)
|
||||
+ blr
|
||||
+
|
||||
+/* Routines for restoring integer registers, called by the compiler. */
|
||||
+/* Called with r11 pointing to the stack header word of the caller of the */
|
||||
+/* function, just beyond the end of the integer restore area. */
|
||||
+
|
||||
+FUNC_START(_restgpr_14) lwz 14,-72(11) /* restore gp registers */
|
||||
+FUNC_START(_restgpr_15) lwz 15,-68(11)
|
||||
+FUNC_START(_restgpr_16) lwz 16,-64(11)
|
||||
+FUNC_START(_restgpr_17) lwz 17,-60(11)
|
||||
+FUNC_START(_restgpr_18) lwz 18,-56(11)
|
||||
+FUNC_START(_restgpr_19) lwz 19,-52(11)
|
||||
+FUNC_START(_restgpr_20) lwz 20,-48(11)
|
||||
+FUNC_START(_restgpr_21) lwz 21,-44(11)
|
||||
+FUNC_START(_restgpr_22) lwz 22,-40(11)
|
||||
+FUNC_START(_restgpr_23) lwz 23,-36(11)
|
||||
+FUNC_START(_restgpr_24) lwz 24,-32(11)
|
||||
+FUNC_START(_restgpr_25) lwz 25,-28(11)
|
||||
+FUNC_START(_restgpr_26) lwz 26,-24(11)
|
||||
+FUNC_START(_restgpr_27) lwz 27,-20(11)
|
||||
+FUNC_START(_restgpr_28) lwz 28,-16(11)
|
||||
+FUNC_START(_restgpr_29) lwz 29,-12(11)
|
||||
+FUNC_START(_restgpr_30) lwz 30,-8(11)
|
||||
+FUNC_START(_restgpr_31) lwz 31,-4(11)
|
||||
+ blr
|
||||
+
|
||||
+/* Routines for restoring integer registers, called by the compiler. */
|
||||
+/* Called with r11 pointing to the stack header word of the caller of the */
|
||||
+/* function, just beyond the end of the integer restore area. */
|
||||
+
|
||||
+FUNC_START(_restgpr_14_x) lwz 14,-72(11) /* restore gp registers */
|
||||
+FUNC_START(_restgpr_15_x) lwz 15,-68(11)
|
||||
+FUNC_START(_restgpr_16_x) lwz 16,-64(11)
|
||||
+FUNC_START(_restgpr_17_x) lwz 17,-60(11)
|
||||
+FUNC_START(_restgpr_18_x) lwz 18,-56(11)
|
||||
+FUNC_START(_restgpr_19_x) lwz 19,-52(11)
|
||||
+FUNC_START(_restgpr_20_x) lwz 20,-48(11)
|
||||
+FUNC_START(_restgpr_21_x) lwz 21,-44(11)
|
||||
+FUNC_START(_restgpr_22_x) lwz 22,-40(11)
|
||||
+FUNC_START(_restgpr_23_x) lwz 23,-36(11)
|
||||
+FUNC_START(_restgpr_24_x) lwz 24,-32(11)
|
||||
+FUNC_START(_restgpr_25_x) lwz 25,-28(11)
|
||||
+FUNC_START(_restgpr_26_x) lwz 26,-24(11)
|
||||
+FUNC_START(_restgpr_27_x) lwz 27,-20(11)
|
||||
+FUNC_START(_restgpr_28_x) lwz 28,-16(11)
|
||||
+FUNC_START(_restgpr_29_x) lwz 29,-12(11)
|
||||
+FUNC_START(_restgpr_30_x) lwz 30,-8(11)
|
||||
+FUNC_START(_restgpr_31_x) lwz 0,4(11)
|
||||
+ lwz 31,-4(11)
|
||||
+ mtlr 0
|
||||
+ mr 1,11
|
||||
+ blr
|
||||
+#endif
|
||||
Index: grub-2.02~beta2/grub-core/Makefile.core.def
|
||||
===================================================================
|
||||
--- grub-2.02~beta2.orig/grub-core/Makefile.core.def
|
||||
+++ grub-2.02~beta2/grub-core/Makefile.core.def
|
||||
@@ -250,6 +250,8 @@ kernel = {
|
||||
extra_dist = video/sis315_init.c;
|
||||
mips_loongson = commands/keylayouts.c;
|
||||
|
||||
+ powerpc_ieee1275 = kern/powerpc/crtsavres.S;
|
||||
+ powerpc_ieee1275 = disk/ieee1275/libgcc.c;
|
||||
powerpc_ieee1275 = kern/powerpc/cache.S;
|
||||
powerpc_ieee1275 = kern/powerpc/dl.c;
|
||||
|
||||
Index: grub-2.02~beta2/grub-core/disk/ieee1275/libgcc.c
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
+++ grub-2.02~beta2/grub-core/disk/ieee1275/libgcc.c
|
||||
@@ -0,0 +1,106 @@
|
||||
+
|
||||
+typedef int int32 __attribute__ ((mode (SI)));
|
||||
+typedef unsigned int uint32 __attribute__ ((mode (SI)));
|
||||
+typedef int int64 __attribute__ ((mode (DI)));
|
||||
+typedef unsigned uint64 __attribute__ ((mode (DI)));
|
||||
+
|
||||
+typedef union {
|
||||
+ int64 ll;
|
||||
+ struct {
|
||||
+ int32 low, high;
|
||||
+ } u;
|
||||
+} DWunion;
|
||||
+extern int64 __ashldi3 (int64, int32);
|
||||
+int64 __ashldi3(int64 x, int32 count)
|
||||
+{
|
||||
+ if (!count)
|
||||
+ return x;
|
||||
+
|
||||
+ const DWunion uu = {.ll = x};
|
||||
+ const int32 bm = 4 * sizeof (int64) - count; /* 8 * size (int64) / 2 */
|
||||
+ DWunion w;
|
||||
+
|
||||
+ if (bm <= 0)
|
||||
+ {
|
||||
+ w.u.low = 0;
|
||||
+ w.u.high = (uint32) uu.u.low << -bm;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ const uint32 carries = (uint32) uu.u.low >> bm;
|
||||
+
|
||||
+ w.u.low = (uint32) uu.u.low << count;
|
||||
+ w.u.high = ((uint32) uu.u.high << count) | carries;
|
||||
+ }
|
||||
+
|
||||
+ return w.ll;
|
||||
+}
|
||||
+extern int64 __lshrdi3 (int64 , int32);
|
||||
+int64 __lshrdi3(int64 x, int32 count)
|
||||
+{
|
||||
+ if (!count)
|
||||
+ return x;
|
||||
+
|
||||
+ const DWunion uu = {.ll = x};
|
||||
+ const int32 bm = 4 * sizeof (int64) - count;
|
||||
+ DWunion w;
|
||||
+
|
||||
+ if (bm <= 0)
|
||||
+ {
|
||||
+ w.u.high = 0;
|
||||
+ w.u.low = (uint32) uu.u.high >> -bm;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ const uint32 carries = (uint32) uu.u.high << bm;
|
||||
+
|
||||
+ w.u.high = (uint32) uu.u.high >> count;
|
||||
+ w.u.low = ((uint32) uu.u.low >> count) | carries;
|
||||
+ }
|
||||
+
|
||||
+ return w.ll;
|
||||
+}
|
||||
+
|
||||
+extern int64 __ashrdi3 (int64, int32);
|
||||
+int64 __ashrdi3(int64 x, int32 count)
|
||||
+{
|
||||
+ if (!count)
|
||||
+ return x;
|
||||
+
|
||||
+ const DWunion uu = {.ll = x};
|
||||
+ const int32 bm = 4 * sizeof (int64) - count; /* 8 * size (int64) / 2 */
|
||||
+ DWunion w;
|
||||
+
|
||||
+ if (bm <= 0)
|
||||
+ {
|
||||
+ w.u.high =
|
||||
+ uu.u.high >> 31;
|
||||
+ w.u.low = uu.u.high >> -bm;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ const uint32 carries = (uint32) uu.u.high << bm;
|
||||
+
|
||||
+ w.u.high = (uint32) uu.u.high >> count;
|
||||
+ w.u.low = ((uint32) uu.u.low >> count) | carries;
|
||||
+ }
|
||||
+
|
||||
+ return w.ll;
|
||||
+}
|
||||
+extern int64 __ucmpdi2 (int64, int64);
|
||||
+int64 __ucmpdi2(int64 a, int64 b)
|
||||
+{
|
||||
+ const DWunion au = {.ll = a};
|
||||
+ const DWunion bu = {.ll = b};
|
||||
+
|
||||
+ if ((unsigned int) au.u.high < (unsigned int) bu.u.high)
|
||||
+ return 0;
|
||||
+ else if ((unsigned int) au.u.high > (unsigned int) bu.u.high)
|
||||
+ return 2;
|
||||
+ if ((unsigned int) au.u.low < (unsigned int) bu.u.low)
|
||||
+ return 0;
|
||||
+ else if ((unsigned int) au.u.low > (unsigned int) bu.u.low)
|
||||
+ return 2;
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
Index: grub-2.02~beta2/include/grub/libgcc.h
|
||||
===================================================================
|
||||
--- grub-2.02~beta2.orig/include/grub/libgcc.h
|
||||
+++ grub-2.02~beta2/include/grub/libgcc.h
|
||||
@@ -24,16 +24,16 @@
|
||||
|
||||
/* On x86 these functions aren't really needed. Save some space. */
|
||||
#if !defined (__i386__) && !defined (__x86_64__)
|
||||
-# ifdef HAVE___ASHLDI3
|
||||
+# if defined (HAVE___ASHLDI3) || defined (__powerpc__)
|
||||
void EXPORT_FUNC (__ashldi3) (void);
|
||||
# endif
|
||||
-# ifdef HAVE___ASHRDI3
|
||||
+# if defined (HAVE___ASHRDI3) || defined (__powerpc__)
|
||||
void EXPORT_FUNC (__ashrdi3) (void);
|
||||
# endif
|
||||
-# ifdef HAVE___LSHRDI3
|
||||
+# if defined (HAVE___LSHRDI3) || defined (__powerpc__)
|
||||
void EXPORT_FUNC (__lshrdi3) (void);
|
||||
# endif
|
||||
-# ifdef HAVE___UCMPDI2
|
||||
+# if defined (HAVE___UCMPDI2) || defined (__powerpc__)
|
||||
void EXPORT_FUNC (__ucmpdi2) (void);
|
||||
# endif
|
||||
# ifdef HAVE___BSWAPSI2
|
||||
@@ -50,7 +50,7 @@ void EXPORT_FUNC (__ctzsi2) (void);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
-#ifdef HAVE__RESTGPR_14_X
|
||||
+#if defined (HAVE__RESTGPR_14_X) || defined (__powerpc__)
|
||||
void EXPORT_FUNC (_restgpr_14_x) (void);
|
||||
void EXPORT_FUNC (_restgpr_15_x) (void);
|
||||
void EXPORT_FUNC (_restgpr_16_x) (void);
|
39
grub2-ppc64-build-ppc64-32bit.patch
Normal file
39
grub2-ppc64-build-ppc64-32bit.patch
Normal file
@ -0,0 +1,39 @@
|
||||
Index: grub-2.02~beta2/util/mkimage.c
|
||||
===================================================================
|
||||
--- grub-2.02~beta2.orig/util/mkimage.c
|
||||
+++ grub-2.02~beta2/util/mkimage.c
|
||||
@@ -354,13 +354,10 @@ static const struct grub_install_image_t
|
||||
{
|
||||
.dirname = "powerpc-ieee1275",
|
||||
.names = { "powerpc-ieee1275", NULL },
|
||||
-
|
||||
-#ifdef __powerpc64__
|
||||
+#ifdef __powerpc64le__
|
||||
.voidp_sizeof = 8,
|
||||
- .elf_target = EM_PPC64,
|
||||
#else
|
||||
.voidp_sizeof = 4,
|
||||
- .elf_target = EM_PPC,
|
||||
#endif
|
||||
|
||||
#ifdef __powerpc64le__
|
||||
@@ -368,7 +365,6 @@ static const struct grub_install_image_t
|
||||
#else
|
||||
.bigendian = 1,
|
||||
#endif
|
||||
-
|
||||
.id = IMAGE_PPC,
|
||||
.flags = PLATFORM_FLAGS_NONE,
|
||||
.total_module_size = TARGET_NO_FIELD,
|
||||
@@ -378,6 +374,11 @@ static const struct grub_install_image_t
|
||||
.section_align = 1,
|
||||
.vaddr_offset = 0,
|
||||
.link_addr = GRUB_KERNEL_POWERPC_IEEE1275_LINK_ADDR,
|
||||
+#ifdef __powerpc64le__
|
||||
+ .elf_target = EM_PPC64,
|
||||
+#else
|
||||
+ .elf_target = EM_PPC,
|
||||
+#endif
|
||||
.mod_gap = GRUB_KERNEL_POWERPC_IEEE1275_MOD_GAP,
|
||||
.mod_align = GRUB_KERNEL_POWERPC_IEEE1275_MOD_ALIGN,
|
||||
.link_align = 4
|
33
grub2-ppc64-qemu.patch
Normal file
33
grub2-ppc64-qemu.patch
Normal file
@ -0,0 +1,33 @@
|
||||
From 90f6eed0b4ffdfe361c2966e62fcb8ed11b528bc Mon Sep 17 00:00:00 2001
|
||||
From: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com>
|
||||
Date: Thu, 20 Mar 2014 16:39:29 +0530
|
||||
Subject: [PATCH] ieee1275: check for IBM pseries emulated machine
|
||||
|
||||
As there is no check for IBM pSeries qemu machine, is_qemu is not
|
||||
set. So feature like GRUB_IEEE1275_FLAG_HAS_CURSORONOFF is not
|
||||
enabled. This results in cursor not being displayed during the
|
||||
grub-menu.
|
||||
|
||||
Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com>
|
||||
---
|
||||
grub-core/kern/ieee1275/cmain.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/kern/ieee1275/cmain.c b/grub-core/kern/ieee1275/cmain.c
|
||||
index d92ae14..3e12e6b 100644
|
||||
--- a/grub-core/kern/ieee1275/cmain.c
|
||||
+++ b/grub-core/kern/ieee1275/cmain.c
|
||||
@@ -84,8 +84,10 @@ grub_ieee1275_find_options (void)
|
||||
|
||||
rc = grub_ieee1275_get_property (root, "model",
|
||||
tmp, sizeof (tmp), 0);
|
||||
- if (rc >= 0 && !grub_strcmp (tmp, "Emulated PC"))
|
||||
+ if (rc >= 0 && (!grub_strcmp (tmp, "Emulated PC")
|
||||
+ || !grub_strcmp (tmp, "IBM pSeries (emulated by qemu)"))) {
|
||||
is_qemu = 1;
|
||||
+ }
|
||||
|
||||
if (rc >= 0 && grub_strncmp (tmp, "IBM", 3) == 0)
|
||||
grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_NO_TREE_SCANNING_FOR_DISKS);
|
||||
--
|
||||
1.8.3.1
|
@ -0,0 +1,52 @@
|
||||
From aae96031c1d54796334d5e49f8fbf7144ead1883 Mon Sep 17 00:00:00 2001
|
||||
From: Ram Pai <linuxram@us.ibm.com>
|
||||
Date: Mon, 24 Feb 2014 22:26:14 +0000
|
||||
Subject: [PATCH 01/23] Add Little-Endian support for Power64 to the build
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
Signed-off-by: Tomohiro B Berry <tbberry@us.ibm.com>
|
||||
Signed-off-by: Thomas Falcon <tlfalcon@linux.vnet.ibm.com>
|
||||
---
|
||||
config.h.in | 4 ++++
|
||||
configure.ac | 6 ++++++
|
||||
2 files changed, 10 insertions(+)
|
||||
|
||||
Index: grub-2.02~beta2/config.h.in
|
||||
===================================================================
|
||||
--- grub-2.02~beta2.orig/config.h.in
|
||||
+++ grub-2.02~beta2/config.h.in
|
||||
@@ -6,6 +6,10 @@
|
||||
#define __powerpc__ 1
|
||||
#endif
|
||||
|
||||
+#if defined(__PPC64__) && defined(__LITTLE_ENDIAN__)
|
||||
+#define __powerpc64le__ 1
|
||||
+#endif
|
||||
+
|
||||
#define GCRYPT_NO_DEPRECATED 1
|
||||
|
||||
/* Define to 1 to enable disk cache statistics. */
|
||||
Index: grub-2.02~beta2/configure.ac
|
||||
===================================================================
|
||||
--- grub-2.02~beta2.orig/configure.ac
|
||||
+++ grub-2.02~beta2/configure.ac
|
||||
@@ -137,6 +137,7 @@ case "$target_cpu"-"$platform" in
|
||||
x86_64-xen) ;;
|
||||
x86_64-*) target_cpu=i386 ;;
|
||||
powerpc64-ieee1275) target_cpu=powerpc ;;
|
||||
+ powerpc64le-ieee1275) target_cpu=powerpc; do_bits=64 ;;
|
||||
esac
|
||||
|
||||
# Check if the platform is supported, make final adjustments.
|
||||
@@ -344,6 +345,11 @@ AC_SYS_LARGEFILE
|
||||
# Identify characteristics of the host architecture.
|
||||
unset ac_cv_c_bigendian
|
||||
|
||||
+if test -n "$do_bits" ; then
|
||||
+ target_m32=0;
|
||||
+ target_m64=1;
|
||||
+fi
|
||||
+
|
||||
if test x"$target_cpu-$platform" = xsparc64-emu ; then
|
||||
CFLAGS="$CFLAGS -m64"
|
||||
HOST_CFLAGS="$HOST_CFLAGS -m64"
|
@ -0,0 +1,32 @@
|
||||
e5d79c82de59b004d65399e Mon Sep 17 00:00:00 2001
|
||||
From: Ram Pai <linuxram@us.ibm.com>
|
||||
Date: Mon, 24 Feb 2014 23:01:07 +0000
|
||||
Subject: [PATCH 02/23] Build grub as O1 until we add savegpr and restgpr
|
||||
routines
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
---
|
||||
configure.ac | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index c9d2ce6..7b9d7ed 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -73,7 +73,12 @@ grub_TRANSFORM([grub-file])
|
||||
|
||||
# Optimization flag. Allow user to override.
|
||||
if test "x$TARGET_CFLAGS" = x; then
|
||||
- TARGET_CFLAGS="$TARGET_CFLAGS -Os"
|
||||
+ if test "x$target_cpu" = xpowerpc64le; then
|
||||
+ #HACK till savegpr/addgpr is supported
|
||||
+ TARGET_CFLAGS="$TARGET_CFLAGS -O1"
|
||||
+ else
|
||||
+ TARGET_CFLAGS="$TARGET_CFLAGS -Os"
|
||||
+ fi
|
||||
fi
|
||||
|
||||
# Default HOST_CPPFLAGS
|
||||
--
|
||||
1.8.3.1
|
@ -0,0 +1,27 @@
|
||||
From f3b10c3a7e098f22a6f3863c3b56a483e3fe96a7 Mon Sep 17 00:00:00 2001
|
||||
From: Ram Pai <linuxram@us.ibm.com>
|
||||
Date: Fri, 28 Feb 2014 20:17:34 +0000
|
||||
Subject: [PATCH 03/23] disable creation of vsx and altivec instructions.
|
||||
|
||||
These instructions fault on power7.
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
---
|
||||
configure.ac | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 7b9d7ed..ded7dbc 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -75,7 +75,7 @@ grub_TRANSFORM([grub-file])
|
||||
if test "x$TARGET_CFLAGS" = x; then
|
||||
if test "x$target_cpu" = xpowerpc64le; then
|
||||
#HACK till savegpr/addgpr is supported
|
||||
- TARGET_CFLAGS="$TARGET_CFLAGS -O1"
|
||||
+ TARGET_CFLAGS="$TARGET_CFLAGS -O1 -mno-altivec -mno-vsx"
|
||||
else
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -Os"
|
||||
fi
|
||||
--
|
||||
1.8.3.1
|
@ -0,0 +1,30 @@
|
||||
From ccd71bef390c23fa2e513d6144d16d591279d0a2 Mon Sep 17 00:00:00 2001
|
||||
From: Ram Pai <linuxram@us.ibm.com>
|
||||
Date: Mon, 24 Feb 2014 23:41:41 +0000
|
||||
Subject: [PATCH 04/23] ignore .TOC. symbol during build
|
||||
|
||||
powerpc64 LE's linker knows how to handle the undefined
|
||||
symbol .TOC. in grub modules. So just ignore that symbol during build.
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
---
|
||||
grub-core/gensyminfo.sh.in | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/gensyminfo.sh.in b/grub-core/gensyminfo.sh.in
|
||||
index 2e8716b..7754dc9 100644
|
||||
--- a/grub-core/gensyminfo.sh.in
|
||||
+++ b/grub-core/gensyminfo.sh.in
|
||||
@@ -34,4 +34,9 @@ else
|
||||
fi
|
||||
|
||||
# Print all undefined symbols used by module
|
||||
-@TARGET_NM@ -u @TARGET_NMFLAGS_MINUS_P@ -p $module | sed "s@^\([^ ]*\).*@undefined $modname \1@g"
|
||||
+if test x"@GRUB_TARGET_CPU@" = xpowerpc; then
|
||||
+ #ignore the special .TOC. symbol on powerpc64le
|
||||
+ @TARGET_NM@ -u @TARGET_NMFLAGS_MINUS_P@ -p $module | grep -w -v '.TOC.'
|
||||
+else
|
||||
+ @TARGET_NM@ -u @TARGET_NMFLAGS_MINUS_P@ -p $module
|
||||
+fi | sed "s@^\([^ ]*\).*@undefined $modname \1@g"
|
||||
--
|
||||
1.8.3.1
|
@ -0,0 +1,48 @@
|
||||
From 36ac10e085ecf53e9c76685e05a1ebe7b5221ca3 Mon Sep 17 00:00:00 2001
|
||||
From: Ram Pai <linuxram@us.ibm.com>
|
||||
Date: Tue, 25 Feb 2014 00:07:43 +0000
|
||||
Subject: [PATCH 05/23] recognize and install a LE grub boot loader
|
||||
|
||||
grub-install can now recognize and install a LE grub boot loader
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
---
|
||||
util/mkimage.c | 14 +++++++++++++-
|
||||
1 file changed, 13 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/util/mkimage.c b/util/mkimage.c
|
||||
index 26d9816..9374ccd 100644
|
||||
--- a/util/mkimage.c
|
||||
+++ b/util/mkimage.c
|
||||
@@ -354,8 +354,21 @@ static const struct grub_install_image_target_desc image_targets[] =
|
||||
{
|
||||
.dirname = "powerpc-ieee1275",
|
||||
.names = { "powerpc-ieee1275", NULL },
|
||||
+
|
||||
+#ifdef __powerpc64__
|
||||
+ .voidp_sizeof = 8,
|
||||
+ .elf_target = EM_PPC64,
|
||||
+#else
|
||||
.voidp_sizeof = 4,
|
||||
+ .elf_target = EM_PPC,
|
||||
+#endif
|
||||
+
|
||||
+#ifdef __powerpc64le__
|
||||
+ .bigendian = 0,
|
||||
+#else
|
||||
.bigendian = 1,
|
||||
+#endif
|
||||
+
|
||||
.id = IMAGE_PPC,
|
||||
.flags = PLATFORM_FLAGS_NONE,
|
||||
.total_module_size = TARGET_NO_FIELD,
|
||||
@@ -365,7 +378,6 @@ static const struct grub_install_image_target_desc image_targets[] =
|
||||
.section_align = 1,
|
||||
.vaddr_offset = 0,
|
||||
.link_addr = GRUB_KERNEL_POWERPC_IEEE1275_LINK_ADDR,
|
||||
- .elf_target = EM_PPC,
|
||||
.mod_gap = GRUB_KERNEL_POWERPC_IEEE1275_MOD_GAP,
|
||||
.mod_align = GRUB_KERNEL_POWERPC_IEEE1275_MOD_ALIGN,
|
||||
.link_align = 4
|
||||
--
|
||||
1.8.3.1
|
@ -0,0 +1,47 @@
|
||||
From 12d83a4bded734551415df888bd80b97fdb3d4ad Mon Sep 17 00:00:00 2001
|
||||
From: Ram Pai <linuxram@us.ibm.com>
|
||||
Date: Wed, 26 Feb 2014 10:28:13 +0000
|
||||
Subject: [PATCH 06/23] set the ABI version correctly
|
||||
|
||||
set the ABI version to 0x02 in the e_flag of the PPC64LE ELF image.
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
---
|
||||
include/grub/elf.h | 1 +
|
||||
util/grub-mkimagexx.c | 4 ++++
|
||||
2 files changed, 5 insertions(+)
|
||||
|
||||
diff --git a/include/grub/elf.h b/include/grub/elf.h
|
||||
index caa7963..bee7583 100644
|
||||
--- a/include/grub/elf.h
|
||||
+++ b/include/grub/elf.h
|
||||
@@ -1851,6 +1851,7 @@ typedef Elf32_Addr Elf32_Conflict;
|
||||
|
||||
/* Values for Elf32/64_Ehdr.e_flags. */
|
||||
#define EF_PPC_EMB 0x80000000 /* PowerPC embedded flag */
|
||||
+#define EF_PPC64LE_ABIV2 0x00000002 /* PowerPC 64 LE flag */
|
||||
|
||||
/* Cygnus local bits below */
|
||||
#define EF_PPC_RELOCATABLE 0x00010000 /* PowerPC -mrelocatable flag*/
|
||||
diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c
|
||||
index 0a1ac9e..b1833a1 100644
|
||||
--- a/util/grub-mkimagexx.c
|
||||
+++ b/util/grub-mkimagexx.c
|
||||
@@ -141,11 +141,15 @@ SUFFIX (generate_elf) (const struct grub_install_image_target_desc *image_target
|
||||
phdr->p_vaddr = grub_host_to_target32 (target_addr);
|
||||
phdr->p_paddr = grub_host_to_target32 (target_addr);
|
||||
phdr->p_align = grub_host_to_target32 (align > image_target->link_align ? align : image_target->link_align);
|
||||
+
|
||||
if (image_target->id == IMAGE_LOONGSON_ELF)
|
||||
ehdr->e_flags = grub_host_to_target32 (0x1000 | EF_MIPS_NOREORDER
|
||||
| EF_MIPS_PIC | EF_MIPS_CPIC);
|
||||
+ else if (image_target->id == IMAGE_PPC && image_target->bigendian == 0)
|
||||
+ ehdr->e_flags = grub_host_to_target32 (EF_PPC64LE_ABIV2);
|
||||
else
|
||||
ehdr->e_flags = 0;
|
||||
+
|
||||
if (image_target->id == IMAGE_LOONGSON_ELF)
|
||||
{
|
||||
phdr->p_filesz = grub_host_to_target32 (*core_size);
|
||||
--
|
||||
1.8.3.1
|
236
grub2-ppc64le-07-Add-IEEE1275_ADDR-helper.patch
Normal file
236
grub2-ppc64le-07-Add-IEEE1275_ADDR-helper.patch
Normal file
@ -0,0 +1,236 @@
|
||||
From c3718600e10e985fe770d13e0110f086256b984f Mon Sep 17 00:00:00 2001
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
Date: Wed, 29 Jan 2014 10:29:32 +1100
|
||||
Subject: [PATCH 07/23] Add IEEE1275_ADDR helper
|
||||
|
||||
If the target pointer size doesn't match the IEEE1275 cell size, we
|
||||
need to cast twice to avoid a warning.
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
---
|
||||
grub-core/disk/ieee1275/ofdisk.c | 4 ++--
|
||||
grub-core/kern/ieee1275/ieee1275.c | 30 +++++++++++++++---------------
|
||||
grub-core/kern/ieee1275/openfw.c | 6 +++---
|
||||
grub-core/lib/ieee1275/datetime.c | 4 ++--
|
||||
grub-core/net/drivers/ieee1275/ofnet.c | 2 +-
|
||||
include/grub/ieee1275/ieee1275.h | 4 +++-
|
||||
6 files changed, 26 insertions(+), 24 deletions(-)
|
||||
|
||||
diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c
|
||||
index 6870b39..1b72f06 100644
|
||||
--- a/grub-core/disk/ieee1275/ofdisk.c
|
||||
+++ b/grub-core/disk/ieee1275/ofdisk.c
|
||||
@@ -224,7 +224,7 @@ dev_iterate (const struct grub_ieee1275_devalias *alias)
|
||||
return;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 3);
|
||||
- args.method = (grub_ieee1275_cell_t) "vscsi-report-luns";
|
||||
+ args.method = IEEE1275_ADDR("vscsi-report-luns");
|
||||
args.ihandle = ihandle;
|
||||
args.table = 0;
|
||||
args.nentries = 0;
|
||||
@@ -613,7 +613,7 @@ grub_ofdisk_get_block_size (const char *device, grub_uint32_t *block_size)
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "can't open device");
|
||||
|
||||
INIT_IEEE1275_COMMON (&args_ieee1275.common, "call-method", 2, 2);
|
||||
- args_ieee1275.method = (grub_ieee1275_cell_t) "block-size";
|
||||
+ args_ieee1275.method = IEEE1275_ADDR("block-size");
|
||||
args_ieee1275.ihandle = last_ihandle;
|
||||
args_ieee1275.result = 1;
|
||||
|
||||
diff --git a/grub-core/kern/ieee1275/ieee1275.c b/grub-core/kern/ieee1275/ieee1275.c
|
||||
index 9821702..f933c89 100644
|
||||
--- a/grub-core/kern/ieee1275/ieee1275.c
|
||||
+++ b/grub-core/kern/ieee1275/ieee1275.c
|
||||
@@ -38,7 +38,7 @@ grub_ieee1275_finddevice (const char *name, grub_ieee1275_phandle_t *phandlep)
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "finddevice", 1, 1);
|
||||
- args.device = (grub_ieee1275_cell_t) name;
|
||||
+ args.device = IEEE1275_ADDR(name);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
@@ -66,8 +66,8 @@ grub_ieee1275_get_property (grub_ieee1275_phandle_t phandle,
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "getprop", 4, 1);
|
||||
args.phandle = phandle;
|
||||
- args.prop = (grub_ieee1275_cell_t) property;
|
||||
- args.buf = (grub_ieee1275_cell_t) buf;
|
||||
+ args.prop = IEEE1275_ADDR(property);
|
||||
+ args.buf = IEEE1275_ADDR(buf);
|
||||
args.buflen = (grub_ieee1275_cell_t) size;
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
@@ -115,8 +115,8 @@ grub_ieee1275_next_property (grub_ieee1275_phandle_t phandle, char *prev_prop,
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "nextprop", 3, 1);
|
||||
args.phandle = phandle;
|
||||
- args.prev_prop = (grub_ieee1275_cell_t) prev_prop;
|
||||
- args.next_prop = (grub_ieee1275_cell_t) prop;
|
||||
+ args.prev_prop = IEEE1275_ADDR(prev_prop);
|
||||
+ args.next_prop = IEEE1275_ADDR(prop);
|
||||
args.flags = (grub_ieee1275_cell_t) -1;
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
@@ -139,7 +139,7 @@ grub_ieee1275_get_property_length (grub_ieee1275_phandle_t phandle,
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "getproplen", 2, 1);
|
||||
args.phandle = phandle;
|
||||
- args.prop = (grub_ieee1275_cell_t) prop;
|
||||
+ args.prop = IEEE1275_ADDR(prop);
|
||||
args.length = (grub_ieee1275_cell_t) -1;
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
@@ -190,7 +190,7 @@ grub_ieee1275_package_to_path (grub_ieee1275_phandle_t phandle,
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "package-to-path", 3, 1);
|
||||
args.phandle = phandle;
|
||||
- args.buf = (grub_ieee1275_cell_t) path;
|
||||
+ args.buf = IEEE1275_ADDR(path);
|
||||
args.buflen = (grub_ieee1275_cell_t) len;
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
@@ -219,7 +219,7 @@ grub_ieee1275_instance_to_path (grub_ieee1275_ihandle_t ihandle,
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "instance-to-path", 3, 1);
|
||||
args.ihandle = ihandle;
|
||||
- args.buf = (grub_ieee1275_cell_t) path;
|
||||
+ args.buf = IEEE1275_ADDR(path);
|
||||
args.buflen = (grub_ieee1275_cell_t) len;
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
@@ -247,7 +247,7 @@ grub_ieee1275_write (grub_ieee1275_ihandle_t ihandle, const void *buffer,
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "write", 3, 1);
|
||||
args.ihandle = ihandle;
|
||||
- args.buf = (grub_ieee1275_cell_t) buffer;
|
||||
+ args.buf = IEEE1275_ADDR(buffer);
|
||||
args.len = (grub_ieee1275_cell_t) len;
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
@@ -273,7 +273,7 @@ grub_ieee1275_read (grub_ieee1275_ihandle_t ihandle, void *buffer,
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "read", 3, 1);
|
||||
args.ihandle = ihandle;
|
||||
- args.buf = (grub_ieee1275_cell_t) buffer;
|
||||
+ args.buf = IEEE1275_ADDR(buffer);
|
||||
args.len = (grub_ieee1275_cell_t) len;
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
@@ -401,7 +401,7 @@ grub_ieee1275_interpret (const char *command, grub_ieee1275_cell_t *catch)
|
||||
return -1;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "interpret", 1, 1);
|
||||
- args.command = (grub_ieee1275_cell_t) command;
|
||||
+ args.command = IEEE1275_ADDR(command);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
@@ -453,7 +453,7 @@ grub_ieee1275_open (const char *path, grub_ieee1275_ihandle_t *result)
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "open", 1, 1);
|
||||
- args.path = (grub_ieee1275_cell_t) path;
|
||||
+ args.path = IEEE1275_ADDR(path);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
@@ -548,8 +548,8 @@ grub_ieee1275_set_property (grub_ieee1275_phandle_t phandle,
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "setprop", 4, 1);
|
||||
args.size = (grub_ieee1275_cell_t) size;
|
||||
- args.buf = (grub_ieee1275_cell_t) buf;
|
||||
- args.propname = (grub_ieee1275_cell_t) propname;
|
||||
+ args.buf = IEEE1275_ADDR(buf);
|
||||
+ args.propname = IEEE1275_ADDR(propname);
|
||||
args.phandle = (grub_ieee1275_cell_t) phandle;
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
@@ -578,7 +578,7 @@ grub_ieee1275_set_color (grub_ieee1275_ihandle_t ihandle,
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "call-method", 6, 1);
|
||||
- args.method = (grub_ieee1275_cell_t) "color!";
|
||||
+ args.method = IEEE1275_ADDR("color!");
|
||||
args.ihandle = ihandle;
|
||||
args.index = index;
|
||||
args.r = r;
|
||||
diff --git a/grub-core/kern/ieee1275/openfw.c b/grub-core/kern/ieee1275/openfw.c
|
||||
index ddb7783..a8bbc71 100644
|
||||
--- a/grub-core/kern/ieee1275/openfw.c
|
||||
+++ b/grub-core/kern/ieee1275/openfw.c
|
||||
@@ -285,7 +285,7 @@ grub_ieee1275_map (grub_addr_t phys, grub_addr_t virt, grub_size_t size,
|
||||
6,
|
||||
#endif
|
||||
1);
|
||||
- args.method = (grub_ieee1275_cell_t) "map";
|
||||
+ args.method = IEEE1275_ADDR("map");
|
||||
args.ihandle = grub_ieee1275_mmu;
|
||||
#ifdef __sparc__
|
||||
args.phys_high = 0;
|
||||
@@ -543,8 +543,8 @@ grub_ieee1275_canonicalise_devname (const char *path)
|
||||
return NULL;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "canon", 3, 1);
|
||||
- args.path = (grub_ieee1275_cell_t) path;
|
||||
- args.buf = (grub_ieee1275_cell_t) buf;
|
||||
+ args.path = IEEE1275_ADDR(path);
|
||||
+ args.buf = IEEE1275_ADDR(buf);
|
||||
args.inlen = (grub_ieee1275_cell_t) (bufsize - 1);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
diff --git a/grub-core/lib/ieee1275/datetime.c b/grub-core/lib/ieee1275/datetime.c
|
||||
index 74578f1..fa0d3b6 100644
|
||||
--- a/grub-core/lib/ieee1275/datetime.c
|
||||
+++ b/grub-core/lib/ieee1275/datetime.c
|
||||
@@ -84,7 +84,7 @@ grub_get_datetime (struct grub_datetime *datetime)
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 7);
|
||||
args.device = (grub_ieee1275_cell_t) ihandle;
|
||||
- args.method = (grub_ieee1275_cell_t) "get-time";
|
||||
+ args.method = IEEE1275_ADDR("get-time");
|
||||
|
||||
status = IEEE1275_CALL_ENTRY_FN (&args);
|
||||
|
||||
@@ -136,7 +136,7 @@ grub_set_datetime (struct grub_datetime *datetime)
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "call-method", 8, 1);
|
||||
args.device = (grub_ieee1275_cell_t) ihandle;
|
||||
- args.method = (grub_ieee1275_cell_t) "set-time";
|
||||
+ args.method = IEEE1275_ADDR("set-time");
|
||||
|
||||
args.year = datetime->year;
|
||||
args.month = datetime->month;
|
||||
diff --git a/grub-core/net/drivers/ieee1275/ofnet.c b/grub-core/net/drivers/ieee1275/ofnet.c
|
||||
index eea8e71..ea6456f 100644
|
||||
--- a/grub-core/net/drivers/ieee1275/ofnet.c
|
||||
+++ b/grub-core/net/drivers/ieee1275/ofnet.c
|
||||
@@ -386,7 +386,7 @@ search_net_devices (struct grub_ieee1275_devalias *alias)
|
||||
args;
|
||||
INIT_IEEE1275_COMMON (&args.common, "interpret", 2, 2);
|
||||
args.len = card->txbufsize;
|
||||
- args.method = (grub_ieee1275_cell_t) "alloc-mem";
|
||||
+ args.method = IEEE1275_ADDR("alloc-mem");
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1
|
||||
|| args.catch)
|
||||
diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h
|
||||
index 8e42513..2e5270c 100644
|
||||
--- a/include/grub/ieee1275/ieee1275.h
|
||||
+++ b/include/grub/ieee1275/ieee1275.h
|
||||
@@ -49,8 +49,10 @@ struct grub_ieee1275_common_hdr
|
||||
grub_ieee1275_cell_t nr_outs;
|
||||
};
|
||||
|
||||
+#define IEEE1275_ADDR(x) (grub_uint32_t)(grub_addr_t)(x)
|
||||
+
|
||||
#define INIT_IEEE1275_COMMON(p, xname, xins, xouts) \
|
||||
- (p)->name = (grub_ieee1275_cell_t) xname; \
|
||||
+ (p)->name = (grub_ieee1275_cell_t) IEEE1275_ADDR(xname); \
|
||||
(p)->nr_ins = (grub_ieee1275_cell_t) xins; \
|
||||
(p)->nr_outs = (grub_ieee1275_cell_t) xouts
|
||||
|
||||
--
|
||||
1.8.3.1
|
67
grub2-ppc64le-08-Fix-some-more-warnings-when-casting.patch
Normal file
67
grub2-ppc64le-08-Fix-some-more-warnings-when-casting.patch
Normal file
@ -0,0 +1,67 @@
|
||||
From ab7a0d7323fd2f6eb4f55da50386378d6a7a7af0 Mon Sep 17 00:00:00 2001
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
Date: Wed, 29 Jan 2014 10:36:41 +1100
|
||||
Subject: [PATCH 08/23] Fix some more warnings when casting.
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
---
|
||||
grub-core/disk/ieee1275/ofdisk.c | 2 +-
|
||||
grub-core/lib/powerpc/relocator.c | 8 ++++----
|
||||
grub-core/net/drivers/ieee1275/ofnet.c | 2 +-
|
||||
3 files changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c
|
||||
index 1b72f06..d785d6a 100644
|
||||
--- a/grub-core/disk/ieee1275/ofdisk.c
|
||||
+++ b/grub-core/disk/ieee1275/ofdisk.c
|
||||
@@ -244,7 +244,7 @@ dev_iterate (const struct grub_ieee1275_devalias *alias)
|
||||
{
|
||||
grub_uint64_t *ptr;
|
||||
|
||||
- ptr = *(grub_uint64_t **) (args.table + 4 + 8 * i);
|
||||
+ ptr = *(grub_uint64_t **) ((grub_addr_t)args.table + 4 + 8 * i);
|
||||
while (*ptr)
|
||||
{
|
||||
grub_snprintf (bufptr, 32, "/disk@%" PRIxGRUB_UINT64_T, *ptr++);
|
||||
diff --git a/grub-core/lib/powerpc/relocator.c b/grub-core/lib/powerpc/relocator.c
|
||||
index bdf2b11..4bac96f 100644
|
||||
--- a/grub-core/lib/powerpc/relocator.c
|
||||
+++ b/grub-core/lib/powerpc/relocator.c
|
||||
@@ -84,8 +84,8 @@ grub_cpu_relocator_backward (void *ptr0, void *src, void *dest,
|
||||
grub_size_t size)
|
||||
{
|
||||
void *ptr = ptr0;
|
||||
- write_reg (8, (grub_uint32_t) src, &ptr);
|
||||
- write_reg (9, (grub_uint32_t) dest, &ptr);
|
||||
+ write_reg (8, (grub_uint32_t) (grub_addr_t) src, &ptr);
|
||||
+ write_reg (9, (grub_uint32_t) (grub_addr_t) dest, &ptr);
|
||||
write_reg (10, (grub_uint32_t) size, &ptr);
|
||||
grub_memcpy (ptr, &grub_relocator_backward_start,
|
||||
RELOCATOR_SRC_SIZEOF (backward));
|
||||
@@ -96,8 +96,8 @@ grub_cpu_relocator_forward (void *ptr0, void *src, void *dest,
|
||||
grub_size_t size)
|
||||
{
|
||||
void *ptr = ptr0;
|
||||
- write_reg (8, (grub_uint32_t) src, &ptr);
|
||||
- write_reg (9, (grub_uint32_t) dest, &ptr);
|
||||
+ write_reg (8, (grub_uint32_t) (grub_addr_t) src, &ptr);
|
||||
+ write_reg (9, (grub_uint32_t) (grub_addr_t) dest, &ptr);
|
||||
write_reg (10, (grub_uint32_t) size, &ptr);
|
||||
grub_memcpy (ptr, &grub_relocator_forward_start,
|
||||
RELOCATOR_SRC_SIZEOF (forward));
|
||||
diff --git a/grub-core/net/drivers/ieee1275/ofnet.c b/grub-core/net/drivers/ieee1275/ofnet.c
|
||||
index ea6456f..07c8446 100644
|
||||
--- a/grub-core/net/drivers/ieee1275/ofnet.c
|
||||
+++ b/grub-core/net/drivers/ieee1275/ofnet.c
|
||||
@@ -395,7 +395,7 @@ search_net_devices (struct grub_ieee1275_devalias *alias)
|
||||
grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory"));
|
||||
}
|
||||
else
|
||||
- card->txbuf = (void *) args.result;
|
||||
+ card->txbuf = (void *) (grub_addr_t) args.result;
|
||||
}
|
||||
else
|
||||
card->txbuf = grub_zalloc (card->txbufsize);
|
||||
--
|
||||
1.8.3.1
|
37
grub2-ppc64le-09-Add-powerpc64-types.patch
Normal file
37
grub2-ppc64le-09-Add-powerpc64-types.patch
Normal file
@ -0,0 +1,37 @@
|
||||
From 71a44537c3293d14184901a39f87e2b9d748c8ce Mon Sep 17 00:00:00 2001
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
Date: Wed, 29 Jan 2014 10:37:54 +1100
|
||||
Subject: [PATCH 09/23] Add powerpc64 types
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
---
|
||||
include/grub/powerpc/types.h | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/include/grub/powerpc/types.h b/include/grub/powerpc/types.h
|
||||
index a098ae6..7a2fc6b 100644
|
||||
--- a/include/grub/powerpc/types.h
|
||||
+++ b/include/grub/powerpc/types.h
|
||||
@@ -19,11 +19,19 @@
|
||||
#ifndef GRUB_TYPES_CPU_HEADER
|
||||
#define GRUB_TYPES_CPU_HEADER 1
|
||||
|
||||
+#ifdef __powerpc64le__
|
||||
+/* The size of void *. */
|
||||
+#define GRUB_TARGET_SIZEOF_VOID_P 8
|
||||
+
|
||||
+/* The size of long. */
|
||||
+#define GRUB_TARGET_SIZEOF_LONG 8
|
||||
+#else
|
||||
/* The size of void *. */
|
||||
#define GRUB_TARGET_SIZEOF_VOID_P 4
|
||||
|
||||
/* The size of long. */
|
||||
#define GRUB_TARGET_SIZEOF_LONG 4
|
||||
+#endif
|
||||
|
||||
/* powerpc is big-endian. */
|
||||
#define GRUB_TARGET_WORDS_BIGENDIAN 1
|
||||
--
|
||||
1.8.3.1
|
@ -0,0 +1,42 @@
|
||||
From 258ae455c8fdcee9884fa9e4cf432a4d22694ce2 Mon Sep 17 00:00:00 2001
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
Date: Wed, 29 Jan 2014 10:37:54 +1100
|
||||
Subject: [PATCH 10/23] powerpc64 is not necessarily BigEndian
|
||||
|
||||
powerpc64 is not necessarily BigEndian anymore! :)
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
---
|
||||
include/grub/powerpc/types.h | 10 +++++++---
|
||||
1 file changed, 7 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/include/grub/powerpc/types.h b/include/grub/powerpc/types.h
|
||||
index 7a2fc6b..ab138d4 100644
|
||||
--- a/include/grub/powerpc/types.h
|
||||
+++ b/include/grub/powerpc/types.h
|
||||
@@ -19,7 +19,7 @@
|
||||
#ifndef GRUB_TYPES_CPU_HEADER
|
||||
#define GRUB_TYPES_CPU_HEADER 1
|
||||
|
||||
-#ifdef __powerpc64le__
|
||||
+#ifdef __powerpc64__
|
||||
/* The size of void *. */
|
||||
#define GRUB_TARGET_SIZEOF_VOID_P 8
|
||||
|
||||
@@ -33,8 +33,12 @@
|
||||
#define GRUB_TARGET_SIZEOF_LONG 4
|
||||
#endif
|
||||
|
||||
-/* powerpc is big-endian. */
|
||||
-#define GRUB_TARGET_WORDS_BIGENDIAN 1
|
||||
+#ifdef __powerpc64le__
|
||||
+#undef GRUB_TARGET_WORDS_BIGENDIAN
|
||||
+#else
|
||||
+#define GRUB_TARGET_WORDS_BIGENDIAN 1
|
||||
+#endif
|
||||
+
|
||||
|
||||
|
||||
#endif /* ! GRUB_TYPES_CPU_HEADER */
|
||||
--
|
||||
1.8.3.1
|
@ -0,0 +1,42 @@
|
||||
From 65dc046ba1f73ae2454ed6495145d645ad452596 Mon Sep 17 00:00:00 2001
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
Date: Wed, 29 Jan 2014 10:38:28 +1100
|
||||
Subject: [PATCH 11/23] Fix warnings when building powerpc linux loader 64bit
|
||||
|
||||
Fix warnings when building powerpc linux loader 64bit
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
---
|
||||
grub-core/loader/powerpc/ieee1275/linux.c | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/grub-core/loader/powerpc/ieee1275/linux.c b/grub-core/loader/powerpc/ieee1275/linux.c
|
||||
index 4a14f66..9dde053 100644
|
||||
--- a/grub-core/loader/powerpc/ieee1275/linux.c
|
||||
+++ b/grub-core/loader/powerpc/ieee1275/linux.c
|
||||
@@ -141,9 +141,9 @@ grub_linux_boot (void)
|
||||
grub_ieee1275_set_property (grub_ieee1275_chosen, "bootargs", linux_args,
|
||||
grub_strlen (linux_args) + 1, &actual);
|
||||
|
||||
- grub_dprintf ("loader", "Entry point: 0x%x\n", linux_entry);
|
||||
- grub_dprintf ("loader", "Initrd at: 0x%x, size 0x%x\n", initrd_addr,
|
||||
- initrd_size);
|
||||
+ grub_dprintf ("loader", "Entry point: 0x%lx\n", (unsigned long)linux_entry);
|
||||
+ grub_dprintf ("loader", "Initrd at: 0x%lx, size 0x%lx\n",
|
||||
+ (unsigned long)initrd_addr, (unsigned long)initrd_size);
|
||||
grub_dprintf ("loader", "Boot arguments: %s\n", linux_args);
|
||||
grub_dprintf ("loader", "Jumping to Linux...\n");
|
||||
|
||||
@@ -360,7 +360,8 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||
if (addr == (grub_addr_t) -1)
|
||||
goto fail;
|
||||
|
||||
- grub_dprintf ("loader", "Loading initrd at 0x%x, size 0x%x\n", addr, size);
|
||||
+ grub_dprintf ("loader", "Loading initrd at 0x%lx, size 0x%lx\n",
|
||||
+ (unsigned long)addr, (unsigned long)size);
|
||||
|
||||
if (grub_initrd_load (&initrd_ctx, argv, (void *) addr))
|
||||
goto fail;
|
||||
--
|
||||
1.8.3.1
|
@ -0,0 +1,45 @@
|
||||
From b94389e81084af714c6e6ad71d50e64174018c39 Mon Sep 17 00:00:00 2001
|
||||
From: Ram Pai <linuxram@us.ibm.com>
|
||||
Date: Tue, 25 Feb 2014 01:35:51 +0000
|
||||
Subject: [PATCH 12/23] GRUB_ELF_R_PPC_* processing fix
|
||||
|
||||
GRUB_ELF_R_PPC_* processing is applicable only for 32
|
||||
bit bootloader.
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
---
|
||||
grub-core/kern/powerpc/dl.c | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/kern/powerpc/dl.c b/grub-core/kern/powerpc/dl.c
|
||||
index 3a7fa3e..7677e5a 100644
|
||||
--- a/grub-core/kern/powerpc/dl.c
|
||||
+++ b/grub-core/kern/powerpc/dl.c
|
||||
@@ -94,6 +94,7 @@ grub_err_t
|
||||
grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr,
|
||||
Elf_Shdr *s, grub_dl_segment_t seg)
|
||||
{
|
||||
+#ifdef powerpc
|
||||
Elf_Rela *rel, *max;
|
||||
|
||||
for (rel = (Elf_Rela *) ((char *) ehdr + s->sh_offset),
|
||||
@@ -155,7 +156,6 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr,
|
||||
case GRUB_ELF_R_PPC_REL32:
|
||||
*addr = value - (Elf_Word) addr;
|
||||
break;
|
||||
-
|
||||
default:
|
||||
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
N_("relocation 0x%x is not implemented yet"),
|
||||
@@ -164,4 +164,9 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr,
|
||||
}
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
+#else
|
||||
+ return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
+ N_("relocation is not implemented yet for module=%llx ehdr=%llx Elf_Shdr=%llx seg=%llx"),
|
||||
+ mod, ehdr, s, seg);
|
||||
+#endif
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
134
grub2-ppc64le-13-Fix-powerpc-setjmp-longjmp-64bit-issues.patch
Normal file
134
grub2-ppc64le-13-Fix-powerpc-setjmp-longjmp-64bit-issues.patch
Normal file
@ -0,0 +1,134 @@
|
||||
From 653e20ad39923aace0117fb7b51df27784587652 Mon Sep 17 00:00:00 2001
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
Date: Wed, 29 Jan 2014 10:39:32 +1100
|
||||
Subject: [PATCH 13/23] Fix powerpc setjmp/longjmp 64bit issues
|
||||
|
||||
Fix powerpc setjmp/longjmp 64bit issues
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
---
|
||||
grub-core/lib/powerpc/setjmp.S | 94 +++++++++++++++++++++++-------------------
|
||||
1 file changed, 52 insertions(+), 42 deletions(-)
|
||||
|
||||
diff --git a/grub-core/lib/powerpc/setjmp.S b/grub-core/lib/powerpc/setjmp.S
|
||||
index 716b563..51fcae9 100644
|
||||
--- a/grub-core/lib/powerpc/setjmp.S
|
||||
+++ b/grub-core/lib/powerpc/setjmp.S
|
||||
@@ -25,33 +25,43 @@ GRUB_MOD_LICENSE "GPLv3+"
|
||||
|
||||
.text
|
||||
|
||||
+#if defined( __powerpc64__ ) || defined( __powerpc64le__ )
|
||||
+#define LOAD ld
|
||||
+#define STORE std
|
||||
+#define SZ_LONG 8
|
||||
+#else
|
||||
+#define LOAD lwz
|
||||
+#define STORE stw
|
||||
+#define SZ_LONG 4
|
||||
+#endif
|
||||
+
|
||||
/*
|
||||
* int grub_setjmp (grub_jmp_buf env)
|
||||
*/
|
||||
FUNCTION(grub_setjmp)
|
||||
- stw 1, 0(3)
|
||||
- stw 14, 4(3)
|
||||
- stw 15, 8(3)
|
||||
- stw 16, 12(3)
|
||||
- stw 17, 16(3)
|
||||
- stw 18, 20(3)
|
||||
- stw 19, 24(3)
|
||||
- stw 20, 28(3)
|
||||
- stw 21, 32(3)
|
||||
- stw 22, 36(3)
|
||||
- stw 23, 40(3)
|
||||
- stw 24, 44(3)
|
||||
- stw 25, 48(3)
|
||||
- stw 26, 52(3)
|
||||
- stw 27, 56(3)
|
||||
- stw 28, 60(3)
|
||||
- stw 29, 64(3)
|
||||
- stw 30, 68(3)
|
||||
- stw 31, 72(3)
|
||||
+ STORE 1, 0(3)
|
||||
+ STORE 14, 1*SZ_LONG(3)
|
||||
+ STORE 15, 2*SZ_LONG(3)
|
||||
+ STORE 16, 3*SZ_LONG(3)
|
||||
+ STORE 17, 4*SZ_LONG(3)
|
||||
+ STORE 18, 5*SZ_LONG(3)
|
||||
+ STORE 19, 6*SZ_LONG(3)
|
||||
+ STORE 20, 7*SZ_LONG(3)
|
||||
+ STORE 21, 8*SZ_LONG(3)
|
||||
+ STORE 22, 9*SZ_LONG(3)
|
||||
+ STORE 23, 10*SZ_LONG(3)
|
||||
+ STORE 24, 11*SZ_LONG(3)
|
||||
+ STORE 25, 12*SZ_LONG(3)
|
||||
+ STORE 26, 13*SZ_LONG(3)
|
||||
+ STORE 27, 14*SZ_LONG(3)
|
||||
+ STORE 28, 15*SZ_LONG(3)
|
||||
+ STORE 29, 16*SZ_LONG(3)
|
||||
+ STORE 30, 17*SZ_LONG(3)
|
||||
+ STORE 31, 18*SZ_LONG(3)
|
||||
mflr 4
|
||||
- stw 4, 76(3)
|
||||
+ STORE 4, 19*SZ_LONG(3)
|
||||
mfcr 4
|
||||
- stw 4, 80(3)
|
||||
+ STORE 4, 20*SZ_LONG(3)
|
||||
li 3, 0
|
||||
blr
|
||||
|
||||
@@ -59,28 +69,28 @@ FUNCTION(grub_setjmp)
|
||||
* int grub_longjmp (grub_jmp_buf env, int val)
|
||||
*/
|
||||
FUNCTION(grub_longjmp)
|
||||
- lwz 1, 0(3)
|
||||
- lwz 14, 4(3)
|
||||
- lwz 15, 8(3)
|
||||
- lwz 16, 12(3)
|
||||
- lwz 17, 16(3)
|
||||
- lwz 18, 20(3)
|
||||
- lwz 19, 24(3)
|
||||
- lwz 20, 28(3)
|
||||
- lwz 21, 32(3)
|
||||
- lwz 22, 36(3)
|
||||
- lwz 23, 40(3)
|
||||
- lwz 24, 44(3)
|
||||
- lwz 25, 48(3)
|
||||
- lwz 26, 52(3)
|
||||
- lwz 27, 56(3)
|
||||
- lwz 28, 60(3)
|
||||
- lwz 29, 64(3)
|
||||
- lwz 30, 68(3)
|
||||
- lwz 31, 72(3)
|
||||
- lwz 5, 76(3)
|
||||
+ LOAD 1, 0(3)
|
||||
+ LOAD 14, 1*SZ_LONG(3)
|
||||
+ LOAD 15, 2*SZ_LONG(3)
|
||||
+ LOAD 16, 3*SZ_LONG(3)
|
||||
+ LOAD 17, 4*SZ_LONG(3)
|
||||
+ LOAD 18, 5*SZ_LONG(3)
|
||||
+ LOAD 19, 6*SZ_LONG(3)
|
||||
+ LOAD 20, 7*SZ_LONG(3)
|
||||
+ LOAD 21, 8*SZ_LONG(3)
|
||||
+ LOAD 22, 9*SZ_LONG(3)
|
||||
+ LOAD 23, 10*SZ_LONG(3)
|
||||
+ LOAD 24, 11*SZ_LONG(3)
|
||||
+ LOAD 25, 12*SZ_LONG(3)
|
||||
+ LOAD 26, 13*SZ_LONG(3)
|
||||
+ LOAD 27, 14*SZ_LONG(3)
|
||||
+ LOAD 28, 15*SZ_LONG(3)
|
||||
+ LOAD 29, 16*SZ_LONG(3)
|
||||
+ LOAD 30, 17*SZ_LONG(3)
|
||||
+ LOAD 31, 18*SZ_LONG(3)
|
||||
+ LOAD 5, 19*SZ_LONG(3)
|
||||
mtlr 5
|
||||
- lwz 5, 80(3)
|
||||
+ LOAD 5, 20*SZ_LONG(3)
|
||||
mtcr 5
|
||||
mr. 3, 4
|
||||
bne 1f
|
||||
--
|
||||
1.8.3.1
|
201
grub2-ppc64le-14-Add-powerpc64-ieee1275-trampoline.patch
Normal file
201
grub2-ppc64le-14-Add-powerpc64-ieee1275-trampoline.patch
Normal file
@ -0,0 +1,201 @@
|
||||
From dc0b31e8fe09b4143488e85a7aeb7c532e48f81d Mon Sep 17 00:00:00 2001
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
Date: Wed, 29 Jan 2014 10:40:17 +1100
|
||||
Subject: [PATCH 14/23] Add powerpc64 ieee1275 trampoline
|
||||
|
||||
Add a trampoline so a 64bit grub can call a 32 bit OF
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
---
|
||||
grub-core/Makefile.core.def | 1 +
|
||||
grub-core/kern/powerpc/ieee1275/entry.S | 150 +++++++++++++++++++++++++++++++
|
||||
include/grub/powerpc/ieee1275/ieee1275.h | 6 ++
|
||||
3 files changed, 157 insertions(+)
|
||||
create mode 100644 grub-core/kern/powerpc/ieee1275/entry.S
|
||||
|
||||
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
|
||||
index 42443bc..9563eeb 100644
|
||||
--- a/grub-core/Makefile.core.def
|
||||
+++ b/grub-core/Makefile.core.def
|
||||
@@ -252,6 +252,7 @@ kernel = {
|
||||
|
||||
powerpc_ieee1275 = kern/powerpc/cache.S;
|
||||
powerpc_ieee1275 = kern/powerpc/dl.c;
|
||||
+ powerpc_ieee1275 = kern/powerpc/ieee1275/entry.S;
|
||||
|
||||
sparc64_ieee1275 = kern/sparc64/cache.S;
|
||||
sparc64_ieee1275 = kern/sparc64/dl.c;
|
||||
diff --git a/grub-core/kern/powerpc/ieee1275/entry.S b/grub-core/kern/powerpc/ieee1275/entry.S
|
||||
new file mode 100644
|
||||
index 0000000..5d58149
|
||||
--- /dev/null
|
||||
+++ b/grub-core/kern/powerpc/ieee1275/entry.S
|
||||
@@ -0,0 +1,150 @@
|
||||
+/* entry.S - open firmware call entry and return */
|
||||
+/*
|
||||
+ * GRUB -- GRand Unified Bootloader
|
||||
+ * Copyright (C) 2004,2007,2010,2014 Free Software Foundation, Inc.
|
||||
+ *
|
||||
+ * GRUB is free software: you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License as published by
|
||||
+ * the Free Software Foundation, either version 3 of the License, or
|
||||
+ * (at your option) any later version.
|
||||
+ *
|
||||
+ * GRUB is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
+ */
|
||||
+
|
||||
+#include <ppc-asm.h>
|
||||
+
|
||||
+#define STACK_FRAME_SIZE (48 + 64 + 16 + 144)
|
||||
+#define MSR_OFFSET (48 + 64)
|
||||
+#define R13_OFFSET (MSR_OFFSET + 8)
|
||||
+#define NVREG_OFFSET(i) (STACK_FRAME_SIZE - (32-(i))*8)
|
||||
+#define SAVE_NVGPR(A) std (A),NVREG_OFFSET(A)(r1)
|
||||
+#define REST_NVGPR(A) ld (A),NVREG_OFFSET(A)(r1)
|
||||
+#define SPRN_SRR0 0x01A
|
||||
+#define SPRN_SRR1 0x01B
|
||||
+#define r1 sp
|
||||
+
|
||||
+
|
||||
+#if defined(_CALL_ELF) && _CALL_ELF == 1 /* BIG ENDIAN */
|
||||
+#define TOC_OFFSET 40
|
||||
+#define r2 toc
|
||||
+#endif
|
||||
+
|
||||
+/*
|
||||
+ * OF runs in 32 bit mode so it clobbers the high 32 bits of all registers
|
||||
+ * it saves. We save and restore all the non volatile registers to avoid
|
||||
+ * this issue.
|
||||
+ *
|
||||
+ * unsigned int ieee1275_call_entry_fn(void *args, unsigned long entry);
|
||||
+ */
|
||||
+FUNC_START(ieee1275_call_entry_fn)
|
||||
+ mflr r0
|
||||
+ std r0,16(r1)
|
||||
+ stdu r1,-STACK_FRAME_SIZE(r1)
|
||||
+
|
||||
+#if defined(_CALL_ELF) && _CALL_ELF == 1 /* BIG ENDIAN */
|
||||
+ std r2,TOC_OFFSET(r1)
|
||||
+#endif
|
||||
+ std r13,R13_OFFSET(r1)
|
||||
+
|
||||
+ SAVE_NVGPR(r14)
|
||||
+ SAVE_NVGPR(r15)
|
||||
+ SAVE_NVGPR(r16)
|
||||
+ SAVE_NVGPR(r17)
|
||||
+ SAVE_NVGPR(r18)
|
||||
+ SAVE_NVGPR(r19)
|
||||
+ SAVE_NVGPR(r20)
|
||||
+ SAVE_NVGPR(r21)
|
||||
+ SAVE_NVGPR(r22)
|
||||
+ SAVE_NVGPR(r23)
|
||||
+ SAVE_NVGPR(r24)
|
||||
+ SAVE_NVGPR(r25)
|
||||
+ SAVE_NVGPR(r26)
|
||||
+ SAVE_NVGPR(r27)
|
||||
+ SAVE_NVGPR(r28)
|
||||
+ SAVE_NVGPR(r29)
|
||||
+ SAVE_NVGPR(r30)
|
||||
+ SAVE_NVGPR(r31)
|
||||
+
|
||||
+ mfmsr r31
|
||||
+ std r31, MSR_OFFSET(r1)
|
||||
+
|
||||
+ /* Clear 64bit mode */
|
||||
+ rldicl r31,r31,0,1
|
||||
+
|
||||
+#if defined(_CALL_ELF) && _CALL_ELF == 2 /* LITTLE ENDIAN */
|
||||
+ /* Clear LE mode */
|
||||
+ rldicr r31,r31,0,62
|
||||
+#endif
|
||||
+
|
||||
+ mtspr SPRN_SRR0,r4
|
||||
+ mtspr SPRN_SRR1,r31
|
||||
+
|
||||
+ /* Point the LR at our return code */
|
||||
+ bl 1f
|
||||
+1: mflr r30
|
||||
+ addi r30,r30,(2f - 1b)
|
||||
+ mtlr r30
|
||||
+
|
||||
+ /* Call OF */
|
||||
+ rfid
|
||||
+
|
||||
+#if defined(_CALL_ELF) && _CALL_ELF == 2 /* LITTLE ENDIAN */
|
||||
+2: .long 0x05009f42 /* bcl 20,31,$+4 */
|
||||
+ .long 0xa602487d /* mflr r10 */
|
||||
+ .long 0x1c004a39 /* addi r10,r10,28 */
|
||||
+ .long 0xa6035a7d /* mtsrr0 r10 */
|
||||
+ .long 0xa600407d /* mfmsr r10 */
|
||||
+ .long 0x01004a69 /* xori r10,r10,1 */
|
||||
+ .long 0xa6035b7d /* mtsrr1 r10 */
|
||||
+ .long 0x2400004c /* rfid */
|
||||
+#endif
|
||||
+
|
||||
+ /* Clear the top 32 bits of r1, just in case */
|
||||
+2: rldicl r1,r1,0,32
|
||||
+
|
||||
+ /* Reset our MSR */
|
||||
+ ld r31,MSR_OFFSET(r1)
|
||||
+ mtspr SPRN_SRR1,r31
|
||||
+
|
||||
+ bl 3f
|
||||
+3: mflr r30
|
||||
+ addi r30,r30,(4f - 3b)
|
||||
+ mtspr SPRN_SRR0,r30
|
||||
+
|
||||
+ rfid
|
||||
+
|
||||
+#if defined(_CALL_ELF) && _CALL_ELF == 1 /* BIG ENDIAN */
|
||||
+4: ld r2,TOC_OFFSET(r1)
|
||||
+#endif
|
||||
+4: ld r13,R13_OFFSET(r1)
|
||||
+
|
||||
+ REST_NVGPR(r14)
|
||||
+ REST_NVGPR(r15)
|
||||
+ REST_NVGPR(r16)
|
||||
+ REST_NVGPR(r17)
|
||||
+ REST_NVGPR(r18)
|
||||
+ REST_NVGPR(r19)
|
||||
+ REST_NVGPR(r20)
|
||||
+ REST_NVGPR(r21)
|
||||
+ REST_NVGPR(r22)
|
||||
+ REST_NVGPR(r23)
|
||||
+ REST_NVGPR(r24)
|
||||
+ REST_NVGPR(r25)
|
||||
+ REST_NVGPR(r26)
|
||||
+ REST_NVGPR(r27)
|
||||
+ REST_NVGPR(r28)
|
||||
+ REST_NVGPR(r29)
|
||||
+ REST_NVGPR(r30)
|
||||
+ REST_NVGPR(r31)
|
||||
+
|
||||
+ addi r1,r1,STACK_FRAME_SIZE
|
||||
+ ld r0,16(r1)
|
||||
+ mtlr r0
|
||||
+ blr
|
||||
+FUNC_END(ieee1275_call_entry_fn)
|
||||
diff --git a/include/grub/powerpc/ieee1275/ieee1275.h b/include/grub/powerpc/ieee1275/ieee1275.h
|
||||
index 3c7683f..14bdc43 100644
|
||||
--- a/include/grub/powerpc/ieee1275/ieee1275.h
|
||||
+++ b/include/grub/powerpc/ieee1275/ieee1275.h
|
||||
@@ -25,4 +25,10 @@
|
||||
#define GRUB_IEEE1275_CELL_SIZEOF 4
|
||||
typedef grub_uint32_t grub_ieee1275_cell_t;
|
||||
|
||||
+#ifdef __powerpc64__
|
||||
+int EXPORT_FUNC(ieee1275_call_entry_fn)(void *args, void *entry);
|
||||
+#define IEEE1275_CALL_ENTRY_FN(args) \
|
||||
+ ieee1275_call_entry_fn((args), grub_ieee1275_entry_fn)
|
||||
+#endif
|
||||
+
|
||||
#endif /* ! GRUB_IEEE1275_MACHINE_HEADER */
|
||||
--
|
||||
1.8.3.1
|
@ -0,0 +1,72 @@
|
||||
From 303109b36a45f53400cbcdaf2ad90ca5790ce1d6 Mon Sep 17 00:00:00 2001
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
Date: Wed, 29 Jan 2014 10:41:29 +1100
|
||||
Subject: [PATCH 15/23] Add 64bit support to powerpc startup code
|
||||
|
||||
Add 64bit support to powerpc startup code
|
||||
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
---
|
||||
grub-core/kern/powerpc/ieee1275/startup.S | 33 +++++++++++++++++++++++++++----
|
||||
1 file changed, 29 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/powerpc/ieee1275/startup.S b/grub-core/kern/powerpc/ieee1275/startup.S
|
||||
index 21c884b..03f80d8 100644
|
||||
--- a/grub-core/kern/powerpc/ieee1275/startup.S
|
||||
+++ b/grub-core/kern/powerpc/ieee1275/startup.S
|
||||
@@ -19,15 +19,28 @@
|
||||
|
||||
#include <grub/symbol.h>
|
||||
#include <grub/offsets.h>
|
||||
+#include <ppc-asm.h>
|
||||
|
||||
.extern __bss_start
|
||||
.extern _end
|
||||
|
||||
.text
|
||||
- .align 2
|
||||
- .globl start, _start
|
||||
-start:
|
||||
-_start:
|
||||
+
|
||||
+FUNC_START(_start)
|
||||
+
|
||||
+#if defined(_CALL_ELF) && _CALL_ELF == 2 /* LITTLE ENDIAN */
|
||||
+ tdi 0,0,0x48 /* Reverse endian of b . + 8 */
|
||||
+ b $+36 /* Skip trampoline if already LE mode */
|
||||
+ .long 0x05009f42 /* bcl 20,31,$+4 */
|
||||
+ .long 0xa602487d /* mflr r10 */
|
||||
+ .long 0x1c004a39 /* addi r10,r10,28 */
|
||||
+ .long 0xa600607d /* mfmsr r11 */
|
||||
+ .long 0x01006b69 /* xori r11,r11,1 */
|
||||
+ .long 0xa6035a7d /* mtsrr0 r10 */
|
||||
+ .long 0xa6037b7d /* mtsrr1 r11 */
|
||||
+ .long 0x2400004c /* rfid */
|
||||
+#endif
|
||||
+
|
||||
li 2, 0
|
||||
li 13, 0
|
||||
|
||||
@@ -61,7 +74,19 @@ _start:
|
||||
|
||||
/* Store r5 in grub_ieee1275_entry_fn. */
|
||||
lis 9, grub_ieee1275_entry_fn@ha
|
||||
+#if defined(_CALL_ELF) && _CALL_ELF == 1 /* BIG ENDIAN */
|
||||
+ std 5, grub_ieee1275_entry_fn@l(9)
|
||||
+#else
|
||||
stw 5, grub_ieee1275_entry_fn@l(9)
|
||||
+#endif
|
||||
+
|
||||
+#if defined(_CALL_ELF) && _CALL_ELF == 2 /* LITTLE ENDIAN */
|
||||
+ bl 3f
|
||||
+3: mflr 9
|
||||
+ addis 2,9,.TOC.-3b@ha
|
||||
+ addi 2,2,.TOC.-3b@l
|
||||
+#endif
|
||||
|
||||
bl grub_main
|
||||
1: b 1b
|
||||
+FUNC_END(_start)
|
||||
--
|
||||
1.8.3.1
|
77
grub2-ppc64le-16-Add-grub_dl_find_section_addr.patch
Normal file
77
grub2-ppc64le-16-Add-grub_dl_find_section_addr.patch
Normal file
@ -0,0 +1,77 @@
|
||||
From ca7d011e65c6dc1b633c85b7105c807b929598f1 Mon Sep 17 00:00:00 2001
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
Date: Wed, 29 Jan 2014 10:42:12 +1100
|
||||
Subject: [PATCH 16/23] Add grub_dl_find_section_addr
|
||||
|
||||
ppc64 needs to find the address of the toc section.
|
||||
Create grub_dl_find_section_addr to do this.
|
||||
|
||||
We also need grub_dl_find_section, so make it global.
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
---
|
||||
grub-core/kern/dl.c | 27 ++++++++++++++++++++++++++-
|
||||
include/grub/dl.h | 2 ++
|
||||
2 files changed, 28 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/kern/dl.c b/grub-core/kern/dl.c
|
||||
index 6850e04..de2d0ed 100644
|
||||
--- a/grub-core/kern/dl.c
|
||||
+++ b/grub-core/kern/dl.c
|
||||
@@ -191,6 +191,31 @@ grub_dl_get_section_addr (grub_dl_t mod, unsigned n)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+void *grub_dl_find_section_addr (grub_dl_t mod, Elf_Ehdr *e, const char *name)
|
||||
+{
|
||||
+ Elf_Shdr *s;
|
||||
+ const char *str;
|
||||
+ unsigned i;
|
||||
+ grub_dl_segment_t seg;
|
||||
+
|
||||
+ s = (Elf_Shdr *) ((char *) e + e->e_shoff + e->e_shstrndx * e->e_shentsize);
|
||||
+ str = (char *) e + s->sh_offset;
|
||||
+
|
||||
+ for (i = 0, s = (Elf_Shdr *) ((char *) e + e->e_shoff);
|
||||
+ i < e->e_shnum;
|
||||
+ i++, s = (Elf_Shdr *) ((char *) s + e->e_shentsize))
|
||||
+ {
|
||||
+ if (grub_strcmp (str + s->sh_name, name) == 0)
|
||||
+ {
|
||||
+ for (seg = mod->segment; seg; seg = seg->next)
|
||||
+ if (seg->section == i)
|
||||
+ return seg->addr;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/* Check if EHDR is a valid ELF header. */
|
||||
static grub_err_t
|
||||
grub_dl_check_header (void *ehdr, grub_size_t size)
|
||||
@@ -427,7 +452,7 @@ grub_dl_resolve_symbols (grub_dl_t mod, Elf_Ehdr *e)
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
-static Elf_Shdr *
|
||||
+Elf_Shdr *
|
||||
grub_dl_find_section (Elf_Ehdr *e, const char *name)
|
||||
{
|
||||
Elf_Shdr *s;
|
||||
diff --git a/include/grub/dl.h b/include/grub/dl.h
|
||||
index 9562fa6..39c73a7 100644
|
||||
--- a/include/grub/dl.h
|
||||
+++ b/include/grub/dl.h
|
||||
@@ -250,6 +250,8 @@ grub_err_t grub_arch_dl_check_header (void *ehdr);
|
||||
grub_err_t
|
||||
grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr,
|
||||
Elf_Shdr *s, grub_dl_segment_t seg);
|
||||
+Elf_Shdr * grub_dl_find_section (Elf_Ehdr *e, const char *name);
|
||||
+void *grub_dl_find_section_addr (grub_dl_t mod, Elf_Ehdr *e, const char *name);
|
||||
#endif
|
||||
|
||||
#if defined (_mips)
|
||||
--
|
||||
1.8.3.1
|
310
grub2-ppc64le-17-Add-ppc64-relocations.patch
Normal file
310
grub2-ppc64le-17-Add-ppc64-relocations.patch
Normal file
@ -0,0 +1,310 @@
|
||||
From 96d6b8d370e653386982b808f10a2a67849f73f1 Mon Sep 17 00:00:00 2001
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
Date: Wed, 29 Jan 2014 10:44:46 +1100
|
||||
Subject: [PATCH 17/23] Add ppc64 relocations
|
||||
|
||||
Add ppc64 relocations
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
---
|
||||
grub-core/kern/powerpc/dl.c | 185 ++++++++++++++++++++++++++++++++++++++++----
|
||||
include/grub/elf.h | 3 +
|
||||
2 files changed, 174 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/powerpc/dl.c b/grub-core/kern/powerpc/dl.c
|
||||
index 7677e5a..cc496d3 100644
|
||||
--- a/grub-core/kern/powerpc/dl.c
|
||||
+++ b/grub-core/kern/powerpc/dl.c
|
||||
@@ -23,6 +23,20 @@
|
||||
#include <grub/err.h>
|
||||
#include <grub/i18n.h>
|
||||
|
||||
+#if defined( __powerpc64__ ) || defined( __powerpc64le__ )
|
||||
+#define ELFCLASSXX ELFCLASS64
|
||||
+#define ELFMACHINEXX EM_PPC64
|
||||
+#else
|
||||
+#define ELFCLASSXX ELFCLASS32
|
||||
+#define ELFMACHINEXX EM_PPC
|
||||
+#endif
|
||||
+
|
||||
+#if defined( __powerpc64le__ )
|
||||
+#define ELFDATA2XSB ELFDATA2LSB
|
||||
+#else
|
||||
+#define ELFDATA2XSB ELFDATA2MSB
|
||||
+#endif
|
||||
+
|
||||
/* Check if EHDR is a valid ELF header. */
|
||||
grub_err_t
|
||||
grub_arch_dl_check_header (void *ehdr)
|
||||
@@ -30,14 +44,86 @@ grub_arch_dl_check_header (void *ehdr)
|
||||
Elf_Ehdr *e = ehdr;
|
||||
|
||||
/* Check the magic numbers. */
|
||||
- if (e->e_ident[EI_CLASS] != ELFCLASS32
|
||||
- || e->e_ident[EI_DATA] != ELFDATA2MSB
|
||||
- || e->e_machine != EM_PPC)
|
||||
+ if (e->e_ident[EI_CLASS] != ELFCLASSXX
|
||||
+ || e->e_ident[EI_DATA] != ELFDATA2XSB
|
||||
+ || e->e_machine != ELFMACHINEXX)
|
||||
return grub_error (GRUB_ERR_BAD_OS, N_("invalid arch-dependent ELF magic"));
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
+
|
||||
+
|
||||
+
|
||||
+#if defined( __powerpc64le__ )
|
||||
+struct trampoline
|
||||
+{
|
||||
+ grub_uint32_t std;
|
||||
+ grub_uint32_t addis;
|
||||
+ grub_uint32_t addi;
|
||||
+ grub_uint32_t mtctr;
|
||||
+ grub_uint32_t bctr;
|
||||
+};
|
||||
+
|
||||
+static const struct trampoline trampoline_template =
|
||||
+ {
|
||||
+ 0xf8410018, /* std r2,24(r1) */
|
||||
+ 0x3d800000, /* addis r12,0,0 */
|
||||
+ 0x398c0000, /* addi r12,r12,0 */
|
||||
+ 0x7d8903a6, /* mtctr r12 */
|
||||
+ 0x4e800420, /* bctr */
|
||||
+ };
|
||||
+
|
||||
+#define PPC_NOP 0x60000000
|
||||
+#define RESTORE_TOC 0xe8410018 /* ld r2,24(r1) */
|
||||
+
|
||||
+#define STO_PPC64_LOCAL_BIT 5
|
||||
+#define STO_PPC64_LOCAL_MASK (7 << STO_PPC64_LOCAL_BIT)
|
||||
+
|
||||
+static unsigned long grub_arch_dl_get_toc (grub_dl_t mod, void *ehdr)
|
||||
+{
|
||||
+ unsigned long i = (unsigned long)grub_dl_find_section_addr(mod, ehdr, ".toc");
|
||||
+ if (!i)
|
||||
+ return 0;
|
||||
+
|
||||
+ return i;
|
||||
+}
|
||||
+
|
||||
+static inline unsigned int
|
||||
+ppc64_decode_local_entry(unsigned int other)
|
||||
+{
|
||||
+ return ((1 << other) >> 2) << 2;
|
||||
+}
|
||||
+
|
||||
+#define PPC64_LOCAL_ENTRY_OFFSET(other) \
|
||||
+ ppc64_decode_local_entry (((other) & STO_PPC64_LOCAL_MASK) \
|
||||
+ >> STO_PPC64_LOCAL_BIT)
|
||||
+
|
||||
+
|
||||
+
|
||||
+#elif defined( __powerpc64__ )
|
||||
+
|
||||
+#error "NOT IMPLEMENTED YET"
|
||||
+
|
||||
+static int grub_arch_dl_is_in_opd (grub_dl_t mod, void *ehdr, unsigned long addr)
|
||||
+{
|
||||
+ unsigned long start, end;
|
||||
+ Elf_Shdr *s = grub_dl_find_section(ehdr, ".opd");
|
||||
+
|
||||
+ if (!s)
|
||||
+ return 0;
|
||||
+
|
||||
+ start = (unsigned long)grub_dl_find_section_addr(mod, ehdr, ".opd");
|
||||
+ end = start + s->sh_size;
|
||||
+
|
||||
+ if ((start <= addr) && (addr < end))
|
||||
+ return 1;
|
||||
+ else
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#else
|
||||
+
|
||||
/* For low-endian reverse lis and addr_high as well as ori and addr_low. */
|
||||
struct trampoline
|
||||
{
|
||||
@@ -47,7 +133,7 @@ struct trampoline
|
||||
grub_uint32_t bctr;
|
||||
};
|
||||
|
||||
-static const struct trampoline trampoline_template =
|
||||
+static const struct trampoline trampoline_template =
|
||||
{
|
||||
0x3d800000,
|
||||
0x618c0000,
|
||||
@@ -55,6 +141,8 @@ static const struct trampoline trampoline_template =
|
||||
0x4e800420,
|
||||
};
|
||||
|
||||
+#endif
|
||||
+
|
||||
#pragma GCC diagnostic ignored "-Wcast-align"
|
||||
|
||||
grub_err_t
|
||||
@@ -74,14 +162,13 @@ grub_arch_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
|
||||
if (s->sh_type == SHT_RELA)
|
||||
{
|
||||
const Elf_Rela *rel, *max;
|
||||
-
|
||||
+
|
||||
for (rel = (const Elf_Rela *) ((const char *) e + s->sh_offset),
|
||||
max = rel + s->sh_size / s->sh_entsize;
|
||||
rel < max;
|
||||
rel++)
|
||||
if (ELF_R_TYPE (rel->r_info) == GRUB_ELF_R_PPC_REL24)
|
||||
(*tramp)++;
|
||||
-
|
||||
}
|
||||
|
||||
*tramp *= sizeof (struct trampoline);
|
||||
@@ -89,12 +176,15 @@ grub_arch_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
+#define PPC_LO(v) ((v) & 0xffff)
|
||||
+#define PPC_HI(v) (((v) >> 16) & 0xffff)
|
||||
+#define PPC_HA(v) PPC_HI ((v) + 0x8000)
|
||||
+
|
||||
/* Relocate symbols. */
|
||||
grub_err_t
|
||||
grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr,
|
||||
Elf_Shdr *s, grub_dl_segment_t seg)
|
||||
{
|
||||
-#ifdef powerpc
|
||||
Elf_Rela *rel, *max;
|
||||
|
||||
for (rel = (Elf_Rela *) ((char *) ehdr + s->sh_offset),
|
||||
@@ -104,7 +194,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr,
|
||||
{
|
||||
Elf_Word *addr;
|
||||
Elf_Sym *sym;
|
||||
- grub_uint32_t value;
|
||||
+ Elf_Addr value;
|
||||
|
||||
if (seg->size < rel->r_offset)
|
||||
return grub_error (GRUB_ERR_BAD_MODULE,
|
||||
@@ -119,6 +209,76 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr,
|
||||
value = sym->st_value + rel->r_addend;
|
||||
switch (ELF_R_TYPE (rel->r_info))
|
||||
{
|
||||
+#ifdef __powerpc64le__
|
||||
+ case GRUB_ELF_R_PPC_REL24:
|
||||
+ {
|
||||
+ struct trampoline *tptr = mod->trampptr;
|
||||
+ Elf_Sword delta;
|
||||
+ if (sym->st_shndx == SHN_UNDEF)
|
||||
+ {
|
||||
+ grub_memcpy (tptr, &trampoline_template, sizeof (*tptr));
|
||||
+
|
||||
+ tptr->addis |= PPC_HA(value);
|
||||
+ tptr->addi |= PPC_LO(value);
|
||||
+
|
||||
+ mod->trampptr = tptr + 1;
|
||||
+ delta = (grub_uint8_t *) tptr - (grub_uint8_t *) addr;
|
||||
+
|
||||
+ if (*(addr+1) != PPC_NOP)
|
||||
+ return grub_error (GRUB_ERR_BAD_MODULE,
|
||||
+ "Missing NOP after PPC_REL24 got %x", *(addr+1));
|
||||
+ *(addr+1) = RESTORE_TOC;
|
||||
+ } else
|
||||
+ delta = (grub_uint8_t *)value - (grub_uint8_t *) addr +
|
||||
+ PPC64_LOCAL_ENTRY_OFFSET(sym->st_other);
|
||||
+
|
||||
+
|
||||
+ if (delta << 6 >> 6 != delta)
|
||||
+ return grub_error (GRUB_ERR_BAD_MODULE,
|
||||
+ "relocation overflow");
|
||||
+
|
||||
+ *(Elf_Word *) (addr) = (*addr & ~0x03fffffc) | (delta & 0x03fffffc);
|
||||
+ }
|
||||
+ break;
|
||||
+
|
||||
+ case GRUB_ELF_R_PPC64_ADDR64:
|
||||
+ *(Elf_Xword *) addr = value;
|
||||
+ break;
|
||||
+
|
||||
+ case GRUB_ELF_R_PPC64_TOC:
|
||||
+ *(Elf_Xword *) addr = grub_arch_dl_get_toc(mod, ehdr);
|
||||
+ break;
|
||||
+
|
||||
+ case GRUB_ELF_R_PPC64_TOC16_HA:
|
||||
+ value -= grub_arch_dl_get_toc(mod, ehdr);
|
||||
+ *(Elf_Half *) addr = PPC_HA(value);
|
||||
+ break;
|
||||
+
|
||||
+ case GRUB_ELF_R_PPC64_TOC16_LO:
|
||||
+ value -= grub_arch_dl_get_toc(mod, ehdr);
|
||||
+ *(Elf_Half *) addr = PPC_LO(value);
|
||||
+ break;
|
||||
+
|
||||
+ case GRUB_ELF_R_PPC64_TOC16_LO_DS:
|
||||
+ value -= grub_arch_dl_get_toc(mod, ehdr);
|
||||
+ if (value & 3)
|
||||
+ return grub_error (GRUB_ERR_BAD_MODULE,
|
||||
+ "bad TOC16_LO_DS relocation");
|
||||
+
|
||||
+ *(Elf_Half *) addr = ((*(Elf_Half *) addr) & ~0xfffc) | (value & 0xfffc);
|
||||
+ break;
|
||||
+
|
||||
+ case GRUB_ELF_R_PPC64_REL16_HA:
|
||||
+ value -= (unsigned long) addr;
|
||||
+ *(Elf_Half *) addr = PPC_HA(value);
|
||||
+ break;
|
||||
+
|
||||
+ case GRUB_ELF_R_PPC64_REL16_LO:
|
||||
+ value -= (unsigned long) addr;
|
||||
+ *(Elf_Half *) addr = PPC_LO(value);
|
||||
+ break;
|
||||
+#else
|
||||
+
|
||||
case GRUB_ELF_R_PPC_ADDR16_LO:
|
||||
*(Elf_Half *) addr = value;
|
||||
break;
|
||||
@@ -137,7 +297,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr,
|
||||
tptr->ori |= ((value) & 0xffff);
|
||||
mod->trampptr = tptr + 1;
|
||||
}
|
||||
-
|
||||
+
|
||||
if (delta << 6 >> 6 != delta)
|
||||
return grub_error (GRUB_ERR_BAD_MODULE,
|
||||
"relocation overflow");
|
||||
@@ -156,6 +316,8 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr,
|
||||
case GRUB_ELF_R_PPC_REL32:
|
||||
*addr = value - (Elf_Word) addr;
|
||||
break;
|
||||
+#endif
|
||||
+
|
||||
default:
|
||||
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
N_("relocation 0x%x is not implemented yet"),
|
||||
@@ -164,9 +326,4 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr,
|
||||
}
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
-#else
|
||||
- return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
- N_("relocation is not implemented yet for module=%llx ehdr=%llx Elf_Shdr=%llx seg=%llx"),
|
||||
- mod, ehdr, s, seg);
|
||||
-#endif
|
||||
}
|
||||
diff --git a/include/grub/elf.h b/include/grub/elf.h
|
||||
index bee7583..224d164 100644
|
||||
--- a/include/grub/elf.h
|
||||
+++ b/include/grub/elf.h
|
||||
@@ -1998,6 +1998,9 @@ typedef Elf32_Addr Elf32_Conflict;
|
||||
#define GRUB_ELF_R_PPC_DIAB_RELSDA_HI 184 /* like EMB_RELSDA, but high 16 bit */
|
||||
#define GRUB_ELF_R_PPC_DIAB_RELSDA_HA 185 /* like EMB_RELSDA, adjusted high 16 */
|
||||
|
||||
+#define GRUB_ELF_R_PPC64_REL16_LO 250
|
||||
+#define GRUB_ELF_R_PPC64_REL16_HA 252
|
||||
+
|
||||
/* This is a phony reloc to handle any old fashioned TOC16 references
|
||||
that may still be in object files. */
|
||||
#define GRUB_ELF_R_PPC_TOC16 255
|
||||
--
|
||||
1.8.3.1
|
28
grub2-ppc64le-18-ppc64-doesn-t-need-libgcc-routines.patch
Normal file
28
grub2-ppc64le-18-ppc64-doesn-t-need-libgcc-routines.patch
Normal file
@ -0,0 +1,28 @@
|
||||
From 8dc2290890dc8e1cf534b6e44ab44bab4d694da5 Mon Sep 17 00:00:00 2001
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
Date: Wed, 29 Jan 2014 10:49:12 +1100
|
||||
Subject: [PATCH 18/23] ppc64 doesn't need libgcc routines
|
||||
|
||||
ppc64 doesn't need libgcc routines
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
---
|
||||
include/grub/libgcc.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/grub/libgcc.h b/include/grub/libgcc.h
|
||||
index fdc6611..69a95bc 100644
|
||||
--- a/include/grub/libgcc.h
|
||||
+++ b/include/grub/libgcc.h
|
||||
@@ -23,7 +23,7 @@
|
||||
#include <config-util.h>
|
||||
|
||||
/* On x86 these functions aren't really needed. Save some space. */
|
||||
-#if !defined (__i386__) && !defined (__x86_64__)
|
||||
+#if !defined (__i386__) && !defined (__x86_64__) && !defined (__powerpc64le__)
|
||||
# ifdef HAVE___ASHLDI3
|
||||
void EXPORT_FUNC (__ashldi3) (void);
|
||||
# endif
|
||||
--
|
||||
1.8.3.1
|
@ -0,0 +1,76 @@
|
||||
From d63aa12f89bfd5e0cc11983601323694e9a24be7 Mon Sep 17 00:00:00 2001
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
Date: Wed, 29 Jan 2014 10:52:28 +1100
|
||||
Subject: [PATCH 19/23] Use FUNC_START/FUNC_END
|
||||
|
||||
Use FUNC_START/FUNC_END for powerpc function definitions
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
From: Anton Blanchard <anton@samba.org>
|
||||
---
|
||||
grub-core/kern/powerpc/cache.S | 6 ++++--
|
||||
grub-core/lib/powerpc/setjmp.S | 8 +++++---
|
||||
2 files changed, 9 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/powerpc/cache.S b/grub-core/kern/powerpc/cache.S
|
||||
index d85e68d..82f10f8 100644
|
||||
--- a/grub-core/kern/powerpc/cache.S
|
||||
+++ b/grub-core/kern/powerpc/cache.S
|
||||
@@ -17,10 +17,12 @@
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
+#include <ppc-asm.h>
|
||||
+
|
||||
.text
|
||||
|
||||
.align 2
|
||||
- .globl grub_arch_sync_caches
|
||||
-grub_arch_sync_caches:
|
||||
+FUNC_START(grub_arch_sync_caches)
|
||||
#include "cache_flush.S"
|
||||
blr
|
||||
+FUNC_END(grub_arch_sync_caches)
|
||||
diff --git a/grub-core/lib/powerpc/setjmp.S b/grub-core/lib/powerpc/setjmp.S
|
||||
index 51fcae9..6fdd60e 100644
|
||||
--- a/grub-core/lib/powerpc/setjmp.S
|
||||
+++ b/grub-core/lib/powerpc/setjmp.S
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
#include <grub/symbol.h>
|
||||
#include <grub/dl.h>
|
||||
+#include <ppc-asm.h>
|
||||
|
||||
.file "setjmp.S"
|
||||
|
||||
@@ -38,7 +39,7 @@ GRUB_MOD_LICENSE "GPLv3+"
|
||||
/*
|
||||
* int grub_setjmp (grub_jmp_buf env)
|
||||
*/
|
||||
-FUNCTION(grub_setjmp)
|
||||
+FUNC_START(grub_setjmp)
|
||||
STORE 1, 0(3)
|
||||
STORE 14, 1*SZ_LONG(3)
|
||||
STORE 15, 2*SZ_LONG(3)
|
||||
@@ -64,11 +65,12 @@ FUNCTION(grub_setjmp)
|
||||
STORE 4, 20*SZ_LONG(3)
|
||||
li 3, 0
|
||||
blr
|
||||
+FUNC_END(grub_setjmp)
|
||||
|
||||
/*
|
||||
* int grub_longjmp (grub_jmp_buf env, int val)
|
||||
*/
|
||||
-FUNCTION(grub_longjmp)
|
||||
+FUNC_START(grub_longjmp)
|
||||
LOAD 1, 0(3)
|
||||
LOAD 14, 1*SZ_LONG(3)
|
||||
LOAD 15, 2*SZ_LONG(3)
|
||||
@@ -96,4 +98,4 @@ FUNCTION(grub_longjmp)
|
||||
bne 1f
|
||||
li 3, 1
|
||||
1: blr
|
||||
-
|
||||
+FUNC_END(grub_longjmp)
|
||||
--
|
||||
1.8.3.1
|
@ -0,0 +1,67 @@
|
||||
From 8212195e18301ed18a060722e2b5933d2052b2c1 Mon Sep 17 00:00:00 2001
|
||||
From: Ram Pai <linuxram@us.ibm.com>
|
||||
Date: Tue, 25 Feb 2014 18:59:13 +0000
|
||||
Subject: [PATCH 20/23] handle .TOC. symbol while loading
|
||||
|
||||
.TOC. symbol is special in ppc64le . It maps to the
|
||||
address of the .toc section.
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
---
|
||||
grub-core/kern/dl.c | 34 +++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 33 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/kern/dl.c b/grub-core/kern/dl.c
|
||||
index de2d0ed..ce2ff38 100644
|
||||
--- a/grub-core/kern/dl.c
|
||||
+++ b/grub-core/kern/dl.c
|
||||
@@ -343,6 +343,26 @@ grub_dl_load_segments (grub_dl_t mod, const Elf_Ehdr *e)
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
+#ifdef __powerpc64le__
|
||||
+static int
|
||||
+grub_dl_find_section_index (Elf_Ehdr *e, const char *name)
|
||||
+{
|
||||
+ Elf_Shdr *s;
|
||||
+ const char *str;
|
||||
+ unsigned i;
|
||||
+
|
||||
+ s = (Elf_Shdr *) ((char *) e + e->e_shoff + e->e_shstrndx * e->e_shentsize);
|
||||
+ str = (char *) e + s->sh_offset;
|
||||
+
|
||||
+ for (i = 0, s = (Elf_Shdr *) ((char *) e + e->e_shoff);
|
||||
+ i < e->e_shnum;
|
||||
+ i++, s = (Elf_Shdr *) ((char *) s + e->e_shentsize))
|
||||
+ if (grub_strcmp (str + s->sh_name, name) == 0)
|
||||
+ return i;
|
||||
+ return -1;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
static grub_err_t
|
||||
grub_dl_resolve_symbols (grub_dl_t mod, Elf_Ehdr *e)
|
||||
{
|
||||
@@ -392,7 +412,19 @@ grub_dl_resolve_symbols (grub_dl_t mod, Elf_Ehdr *e)
|
||||
/* Resolve a global symbol. */
|
||||
if (sym->st_name != 0 && sym->st_shndx == 0)
|
||||
{
|
||||
- grub_symbol_t nsym = grub_dl_resolve_symbol (name);
|
||||
+ grub_symbol_t nsym;
|
||||
+
|
||||
+#ifdef __powerpc64le__
|
||||
+ if (grub_strcmp(name, ".TOC.") == 0) {
|
||||
+ int j = grub_dl_find_section_index (e, ".toc");
|
||||
+ if (j < 0)
|
||||
+ return grub_error (GRUB_ERR_BAD_MODULE,
|
||||
+ N_("section '.toc' not found"), name);
|
||||
+ sym->st_value = (Elf_Addr) grub_dl_get_section_addr (mod, j);
|
||||
+ break;
|
||||
+ }
|
||||
+#endif
|
||||
+ nsym = grub_dl_resolve_symbol (name);
|
||||
if (! nsym)
|
||||
return grub_error (GRUB_ERR_BAD_MODULE,
|
||||
N_("symbol `%s' not found"), name);
|
||||
--
|
||||
1.8.3.1
|
@ -0,0 +1,35 @@
|
||||
From 584206ed234f18aab8c9e41e869b539003c56c44 Mon Sep 17 00:00:00 2001
|
||||
From: Ram Pai <linuxram@us.ibm.com>
|
||||
Date: Tue, 25 Feb 2014 20:49:28 +0000
|
||||
Subject: [PATCH 21/23] fix the .toc section alignment
|
||||
|
||||
|
||||
the .toc section in powerpc64le modules are sometimes
|
||||
not aligned on a four byte boundary. This fails the module linker especially
|
||||
when processing R_PPC64_TOC16_LO_DS, since the addresses are expected to be
|
||||
aligned on 4byte boundary.
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
---
|
||||
grub-core/kern/dl.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/grub-core/kern/dl.c b/grub-core/kern/dl.c
|
||||
index ce2ff38..ee69c3c 100644
|
||||
--- a/grub-core/kern/dl.c
|
||||
+++ b/grub-core/kern/dl.c
|
||||
@@ -304,7 +304,12 @@ grub_dl_load_segments (grub_dl_t mod, const Elf_Ehdr *e)
|
||||
{
|
||||
void *addr;
|
||||
|
||||
+#ifdef __powerpc64le__
|
||||
+ ptr = (char *) ALIGN_UP ((grub_addr_t) ptr,
|
||||
+ (s->sh_addralign < 4 ? 4 : s->sh_addralign));
|
||||
+#else
|
||||
ptr = (char *) ALIGN_UP ((grub_addr_t) ptr, s->sh_addralign);
|
||||
+#endif
|
||||
addr = ptr;
|
||||
ptr += s->sh_size;
|
||||
|
||||
--
|
||||
1.8.3.1
|
@ -0,0 +1,704 @@
|
||||
From 4d0c5500be3cb776345e417c542d6d1fea1a3314 Mon Sep 17 00:00:00 2001
|
||||
From: Ram Pai <linuxram@us.ibm.com>
|
||||
Date: Tue, 25 Feb 2014 22:43:25 +0000
|
||||
Subject: [PATCH 22/23] fix parameter to firmware calls
|
||||
|
||||
all parameter to firmware calls should be BigEndian
|
||||
and the results should be CPU endian.
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
---
|
||||
grub-core/disk/ieee1275/nand.c | 41 +++++-----
|
||||
grub-core/disk/ieee1275/ofdisk.c | 22 ++++--
|
||||
grub-core/kern/ieee1275/ieee1275.c | 134 +++++++++++++++++++--------------
|
||||
grub-core/kern/ieee1275/openfw.c | 19 ++---
|
||||
grub-core/lib/ieee1275/datetime.c | 32 ++++----
|
||||
grub-core/net/drivers/ieee1275/ofnet.c | 6 +-
|
||||
include/grub/ieee1275/ieee1275.h | 8 +-
|
||||
7 files changed, 148 insertions(+), 114 deletions(-)
|
||||
|
||||
diff --git a/grub-core/disk/ieee1275/nand.c b/grub-core/disk/ieee1275/nand.c
|
||||
index 576e9cc..1846c23 100644
|
||||
--- a/grub-core/disk/ieee1275/nand.c
|
||||
+++ b/grub-core/disk/ieee1275/nand.c
|
||||
@@ -102,32 +102,33 @@ grub_nand_open (const char *name, grub_disk_t disk)
|
||||
data->handle = dev_ihandle;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 2);
|
||||
- args.method = (grub_ieee1275_cell_t) "block-size";
|
||||
- args.ihandle = dev_ihandle;
|
||||
- args.result = 1;
|
||||
+ args.method = IEEE1275_ADDR("block-size");
|
||||
+ args.ihandle = IEEE1275_VALUE(dev_ihandle);
|
||||
+ args.result = IEEE1275_VALUE(1);
|
||||
|
||||
- if ((IEEE1275_CALL_ENTRY_FN (&args) == -1) || (args.result))
|
||||
+ if ((IEEE1275_CALL_ENTRY_FN (&args) == -1) || IEEE1275_VALUE(args.result))
|
||||
{
|
||||
grub_error (GRUB_ERR_UNKNOWN_DEVICE, "can't get block size");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
+ args.size1 = IEEE1275_VALUE(args.size1);
|
||||
data->block_size = (args.size1 >> GRUB_DISK_SECTOR_BITS);
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 3);
|
||||
- args.method = (grub_ieee1275_cell_t) "size";
|
||||
- args.ihandle = dev_ihandle;
|
||||
- args.result = 1;
|
||||
+ args.method = IEEE1275_ADDR( "size");
|
||||
+ args.ihandle = IEEE1275_VALUE(dev_ihandle);
|
||||
+ args.result = IEEE1275_VALUE(1);
|
||||
|
||||
- if ((IEEE1275_CALL_ENTRY_FN (&args) == -1) || (args.result))
|
||||
+ if ((IEEE1275_CALL_ENTRY_FN (&args) == -1) || IEEE1275_VALUE(args.result))
|
||||
{
|
||||
grub_error (GRUB_ERR_UNKNOWN_DEVICE, "can't get disk size");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
- disk->total_sectors = args.size1;
|
||||
+ disk->total_sectors = IEEE1275_VALUE(args.size1);
|
||||
disk->total_sectors <<= 32;
|
||||
- disk->total_sectors += args.size2;
|
||||
+ disk->total_sectors += IEEE1275_VALUE(args.size2);
|
||||
disk->total_sectors >>= GRUB_DISK_SECTOR_BITS;
|
||||
|
||||
disk->id = dev_ihandle;
|
||||
@@ -170,10 +171,10 @@ grub_nand_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
} args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "call-method", 6, 1);
|
||||
- args.method = (grub_ieee1275_cell_t) "pio-read";
|
||||
- args.ihandle = data->handle;
|
||||
- args.buf = (grub_ieee1275_cell_t) buf;
|
||||
- args.page = (grub_ieee1275_cell_t) ((grub_size_t) sector / data->block_size);
|
||||
+ args.method = IEEE1275_ADDR("pio-read");
|
||||
+ args.ihandle = IEEE1275_VALUE(data->handle);
|
||||
+ args.buf = buf;
|
||||
+ args.page = (grub_size_t) sector / data->block_size;
|
||||
|
||||
ofs = ((grub_size_t) sector % data->block_size) << GRUB_DISK_SECTOR_BITS;
|
||||
size <<= GRUB_DISK_SECTOR_BITS;
|
||||
@@ -185,16 +186,20 @@ grub_nand_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
|
||||
len = (ofs + size > bsize) ? (bsize - ofs) : size;
|
||||
|
||||
- args.len = (grub_ieee1275_cell_t) len;
|
||||
- args.ofs = (grub_ieee1275_cell_t) ofs;
|
||||
- args.result = 1;
|
||||
+ args.len = IEEE1275_VALUE(len);
|
||||
+ args.ofs = IEEE1275_VALUE(ofs);
|
||||
+ args.result = IEEE1275_VALUE(1);
|
||||
+ args.buf = IEEE1275_ADDR(args.buf);
|
||||
+ args.page = IEEE1275_VALUE(args.page);
|
||||
|
||||
- if ((IEEE1275_CALL_ENTRY_FN (&args) == -1) || (args.result))
|
||||
+ if ((IEEE1275_CALL_ENTRY_FN (&args) == -1) || IEEE1275_VALUE(args.result))
|
||||
return grub_error (GRUB_ERR_READ_ERROR, N_("failure reading sector 0x%llx "
|
||||
"from `%s'"),
|
||||
(unsigned long long) sector,
|
||||
disk->name);
|
||||
|
||||
+ args.buf = IEEE1275_ADDR(args.buf);
|
||||
+ args.page = IEEE1275_VALUE(args.page);
|
||||
ofs = 0;
|
||||
size -= len;
|
||||
args.buf += len;
|
||||
diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c
|
||||
index d785d6a..72b36c5 100644
|
||||
--- a/grub-core/disk/ieee1275/ofdisk.c
|
||||
+++ b/grub-core/disk/ieee1275/ofdisk.c
|
||||
@@ -225,16 +225,19 @@ dev_iterate (const struct grub_ieee1275_devalias *alias)
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 3);
|
||||
args.method = IEEE1275_ADDR("vscsi-report-luns");
|
||||
- args.ihandle = ihandle;
|
||||
- args.table = 0;
|
||||
- args.nentries = 0;
|
||||
+ args.ihandle = IEEE1275_VALUE(ihandle);
|
||||
+ args.table = IEEE1275_ADDR(0);
|
||||
+ args.nentries = IEEE1275_VALUE(0);
|
||||
|
||||
- if (IEEE1275_CALL_ENTRY_FN (&args) == -1 || args.catch_result)
|
||||
+ if (IEEE1275_CALL_ENTRY_FN (&args) == -1 || IEEE1275_VALUE(args.catch_result))
|
||||
{
|
||||
grub_ieee1275_close (ihandle);
|
||||
return;
|
||||
}
|
||||
|
||||
+ args.table = IEEE1275_ADDR(args.table);
|
||||
+ args.nentries = IEEE1275_VALUE(args.nentries);
|
||||
+
|
||||
buf = grub_malloc (grub_strlen (alias->path) + 32);
|
||||
if (!buf)
|
||||
return;
|
||||
@@ -245,6 +248,7 @@ dev_iterate (const struct grub_ieee1275_devalias *alias)
|
||||
grub_uint64_t *ptr;
|
||||
|
||||
ptr = *(grub_uint64_t **) ((grub_addr_t)args.table + 4 + 8 * i);
|
||||
+ ptr = (grub_uint64_t *) (grub_addr_t) IEEE1275_ADDR(ptr);
|
||||
while (*ptr)
|
||||
{
|
||||
grub_snprintf (bufptr, 32, "/disk@%" PRIxGRUB_UINT64_T, *ptr++);
|
||||
@@ -614,18 +618,20 @@ grub_ofdisk_get_block_size (const char *device, grub_uint32_t *block_size)
|
||||
|
||||
INIT_IEEE1275_COMMON (&args_ieee1275.common, "call-method", 2, 2);
|
||||
args_ieee1275.method = IEEE1275_ADDR("block-size");
|
||||
- args_ieee1275.ihandle = last_ihandle;
|
||||
- args_ieee1275.result = 1;
|
||||
+ args_ieee1275.ihandle = IEEE1275_VALUE(last_ihandle);
|
||||
+ args_ieee1275.result = IEEE1275_VALUE(1);
|
||||
|
||||
*block_size = GRUB_DISK_SECTOR_SIZE;
|
||||
|
||||
- if ((IEEE1275_CALL_ENTRY_FN (&args_ieee1275) == -1) || (args_ieee1275.result))
|
||||
+ if ((IEEE1275_CALL_ENTRY_FN (&args_ieee1275) == -1) || IEEE1275_VALUE(args_ieee1275.result))
|
||||
grub_dprintf ("disk", "can't get block size\n");
|
||||
- else
|
||||
+ else {
|
||||
+ args_ieee1275.size1 = IEEE1275_VALUE(args_ieee1275.size1);
|
||||
if (args_ieee1275.size1
|
||||
&& !(args_ieee1275.size1 & (args_ieee1275.size1 - 1))
|
||||
&& args_ieee1275.size1 >= 512 && args_ieee1275.size1 <= 16384)
|
||||
*block_size = args_ieee1275.size1;
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
||||
diff --git a/grub-core/kern/ieee1275/ieee1275.c b/grub-core/kern/ieee1275/ieee1275.c
|
||||
index f933c89..df8943c 100644
|
||||
--- a/grub-core/kern/ieee1275/ieee1275.c
|
||||
+++ b/grub-core/kern/ieee1275/ieee1275.c
|
||||
@@ -42,7 +42,7 @@ grub_ieee1275_finddevice (const char *name, grub_ieee1275_phandle_t *phandlep)
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
- *phandlep = args.phandle;
|
||||
+ *phandlep = args.phandle = IEEE1275_VALUE(args.phandle);
|
||||
if (args.phandle == IEEE1275_PHANDLE_INVALID)
|
||||
return -1;
|
||||
return 0;
|
||||
@@ -65,13 +65,15 @@ grub_ieee1275_get_property (grub_ieee1275_phandle_t phandle,
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "getprop", 4, 1);
|
||||
- args.phandle = phandle;
|
||||
+ args.phandle = IEEE1275_VALUE(phandle);
|
||||
args.prop = IEEE1275_ADDR(property);
|
||||
args.buf = IEEE1275_ADDR(buf);
|
||||
- args.buflen = (grub_ieee1275_cell_t) size;
|
||||
+ args.buflen = IEEE1275_VALUE(size);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
+
|
||||
+ args.size = IEEE1275_VALUE(args.size);
|
||||
if (actual)
|
||||
*actual = (grub_ssize_t) args.size;
|
||||
if (args.size == IEEE1275_CELL_INVALID)
|
||||
@@ -79,6 +81,18 @@ grub_ieee1275_get_property (grub_ieee1275_phandle_t phandle,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+#ifdef __powerpc64le__
|
||||
+static void
|
||||
+grub_swap_bytes(grub_uint32_t *buf, grub_size_t len)
|
||||
+{
|
||||
+ /* Integer properties are always in big endian. */
|
||||
+ unsigned int i;
|
||||
+ len /= sizeof (grub_uint32_t);
|
||||
+ for (i = 0; i < len; i++)
|
||||
+ buf[i] = IEEE1275_VALUE(buf[i]);
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
int
|
||||
grub_ieee1275_get_integer_property (grub_ieee1275_phandle_t phandle,
|
||||
const char *property, grub_uint32_t *buf,
|
||||
@@ -86,16 +100,13 @@ grub_ieee1275_get_integer_property (grub_ieee1275_phandle_t phandle,
|
||||
{
|
||||
int ret;
|
||||
ret = grub_ieee1275_get_property (phandle, property, (void *) buf, size, actual);
|
||||
-#ifndef GRUB_CPU_WORDS_BIGENDIAN
|
||||
+
|
||||
+#ifdef __powerpc64le__
|
||||
/* Integer properties are always in big endian. */
|
||||
if (ret == 0)
|
||||
- {
|
||||
- unsigned int i;
|
||||
- size /= sizeof (grub_uint32_t);
|
||||
- for (i = 0; i < size; i++)
|
||||
- buf[i] = grub_be_to_cpu32 (buf[i]);
|
||||
- }
|
||||
+ grub_swap_bytes(buf, size);
|
||||
#endif
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -114,14 +125,14 @@ grub_ieee1275_next_property (grub_ieee1275_phandle_t phandle, char *prev_prop,
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "nextprop", 3, 1);
|
||||
- args.phandle = phandle;
|
||||
+ args.phandle = IEEE1275_VALUE(phandle);
|
||||
args.prev_prop = IEEE1275_ADDR(prev_prop);
|
||||
args.next_prop = IEEE1275_ADDR(prop);
|
||||
- args.flags = (grub_ieee1275_cell_t) -1;
|
||||
+ args.flags = IEEE1275_VALUE(-1);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
- return (int) args.flags;
|
||||
+ return (int) IEEE1275_VALUE(args.flags);
|
||||
}
|
||||
|
||||
int
|
||||
@@ -138,13 +149,13 @@ grub_ieee1275_get_property_length (grub_ieee1275_phandle_t phandle,
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "getproplen", 2, 1);
|
||||
- args.phandle = phandle;
|
||||
+ args.phandle = IEEE1275_VALUE(phandle);
|
||||
args.prop = IEEE1275_ADDR(prop);
|
||||
- args.length = (grub_ieee1275_cell_t) -1;
|
||||
+ args.length = IEEE1275_VALUE(-1);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
- *length = args.length;
|
||||
+ *length = args.length = IEEE1275_VALUE(args.length);
|
||||
if (args.length == IEEE1275_CELL_INVALID)
|
||||
return -1;
|
||||
return 0;
|
||||
@@ -163,11 +174,11 @@ grub_ieee1275_instance_to_package (grub_ieee1275_ihandle_t ihandle,
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "instance-to-package", 1, 1);
|
||||
- args.ihandle = ihandle;
|
||||
+ args.ihandle = IEEE1275_VALUE(ihandle);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
- *phandlep = args.phandle;
|
||||
+ *phandlep = args.phandle = IEEE1275_VALUE(args.phandle);
|
||||
if (args.phandle == IEEE1275_PHANDLE_INVALID)
|
||||
return -1;
|
||||
return 0;
|
||||
@@ -189,12 +200,14 @@ grub_ieee1275_package_to_path (grub_ieee1275_phandle_t phandle,
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "package-to-path", 3, 1);
|
||||
- args.phandle = phandle;
|
||||
+ args.phandle = IEEE1275_VALUE(phandle);
|
||||
args.buf = IEEE1275_ADDR(path);
|
||||
- args.buflen = (grub_ieee1275_cell_t) len;
|
||||
+ args.buflen = IEEE1275_VALUE(len);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
+
|
||||
+ args.actual = IEEE1275_VALUE(args.actual);
|
||||
if (actual)
|
||||
*actual = args.actual;
|
||||
if (args.actual == IEEE1275_CELL_INVALID)
|
||||
@@ -218,12 +231,14 @@ grub_ieee1275_instance_to_path (grub_ieee1275_ihandle_t ihandle,
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "instance-to-path", 3, 1);
|
||||
- args.ihandle = ihandle;
|
||||
+ args.ihandle = IEEE1275_VALUE(ihandle);
|
||||
args.buf = IEEE1275_ADDR(path);
|
||||
- args.buflen = (grub_ieee1275_cell_t) len;
|
||||
+ args.buflen = IEEE1275_VALUE(len);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
+
|
||||
+ args.actual = IEEE1275_VALUE(args.actual);
|
||||
if (actual)
|
||||
*actual = args.actual;
|
||||
if (args.actual == IEEE1275_CELL_INVALID)
|
||||
@@ -231,6 +246,7 @@ grub_ieee1275_instance_to_path (grub_ieee1275_ihandle_t ihandle,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+
|
||||
int
|
||||
grub_ieee1275_write (grub_ieee1275_ihandle_t ihandle, const void *buffer,
|
||||
grub_size_t len, grub_ssize_t *actualp)
|
||||
@@ -246,12 +262,13 @@ grub_ieee1275_write (grub_ieee1275_ihandle_t ihandle, const void *buffer,
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "write", 3, 1);
|
||||
- args.ihandle = ihandle;
|
||||
+ args.ihandle = IEEE1275_VALUE(ihandle);
|
||||
args.buf = IEEE1275_ADDR(buffer);
|
||||
- args.len = (grub_ieee1275_cell_t) len;
|
||||
+ args.len = IEEE1275_VALUE(len);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
+ args.actual = IEEE1275_VALUE(args.actual);
|
||||
if (actualp)
|
||||
*actualp = args.actual;
|
||||
return 0;
|
||||
@@ -272,14 +289,16 @@ grub_ieee1275_read (grub_ieee1275_ihandle_t ihandle, void *buffer,
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "read", 3, 1);
|
||||
- args.ihandle = ihandle;
|
||||
+ args.ihandle = IEEE1275_VALUE(ihandle);
|
||||
args.buf = IEEE1275_ADDR(buffer);
|
||||
- args.len = (grub_ieee1275_cell_t) len;
|
||||
+ args.len = IEEE1275_VALUE(len);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
+ args.actual = IEEE1275_VALUE(args.actual);
|
||||
if (actualp)
|
||||
*actualp = args.actual;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -298,20 +317,20 @@ grub_ieee1275_seek (grub_ieee1275_ihandle_t ihandle, grub_disk_addr_t pos,
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "seek", 3, 1);
|
||||
- args.ihandle = ihandle;
|
||||
+ args.ihandle = IEEE1275_VALUE(ihandle);
|
||||
/* To prevent stupid gcc warning. */
|
||||
#if GRUB_IEEE1275_CELL_SIZEOF >= 8
|
||||
args.pos_hi = 0;
|
||||
- args.pos_lo = pos;
|
||||
+ args.pos_lo = IEEE1275_VALUE(pos);
|
||||
#else
|
||||
- args.pos_hi = (grub_ieee1275_cell_t) (pos >> (8 * GRUB_IEEE1275_CELL_SIZEOF));
|
||||
- args.pos_lo = (grub_ieee1275_cell_t)
|
||||
- (pos & ((1ULL << (8 * GRUB_IEEE1275_CELL_SIZEOF)) - 1));
|
||||
+ args.pos_hi = IEEE1275_VALUE((pos >> (8 * GRUB_IEEE1275_CELL_SIZEOF)));
|
||||
+ args.pos_lo = IEEE1275_VALUE((pos & ((1ULL << (8 * GRUB_IEEE1275_CELL_SIZEOF)) - 1)));
|
||||
#endif
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
|
||||
+ args.result = IEEE1275_VALUE(args.result);
|
||||
if (result)
|
||||
*result = args.result;
|
||||
return 0;
|
||||
@@ -330,11 +349,11 @@ grub_ieee1275_peer (grub_ieee1275_phandle_t node,
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "peer", 1, 1);
|
||||
- args.node = node;
|
||||
+ args.node = IEEE1275_VALUE(node);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
- *result = args.result;
|
||||
+ *result = args.result = IEEE1275_VALUE(args.result);
|
||||
if (args.result == 0)
|
||||
return -1;
|
||||
return 0;
|
||||
@@ -353,12 +372,12 @@ grub_ieee1275_child (grub_ieee1275_phandle_t node,
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "child", 1, 1);
|
||||
- args.node = node;
|
||||
- args.result = IEEE1275_PHANDLE_INVALID;
|
||||
+ args.node = IEEE1275_VALUE(node);
|
||||
+ args.result = IEEE1275_VALUE(IEEE1275_PHANDLE_INVALID);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
- *result = args.result;
|
||||
+ *result = args.result = IEEE1275_VALUE(args.result);
|
||||
if (args.result == 0)
|
||||
return -1;
|
||||
return 0;
|
||||
@@ -377,12 +396,12 @@ grub_ieee1275_parent (grub_ieee1275_phandle_t node,
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "parent", 1, 1);
|
||||
- args.node = node;
|
||||
- args.result = IEEE1275_PHANDLE_INVALID;
|
||||
+ args.node = IEEE1275_VALUE(node);
|
||||
+ args.result = IEEE1275_VALUE(IEEE1275_PHANDLE_INVALID);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
- *result = args.result;
|
||||
+ *result = IEEE1275_VALUE(args.result);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -405,6 +424,7 @@ grub_ieee1275_interpret (const char *command, grub_ieee1275_cell_t *catch)
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
+ args.catch = IEEE1275_VALUE(args.catch);
|
||||
if (catch)
|
||||
*catch = args.catch;
|
||||
return 0;
|
||||
@@ -457,7 +477,7 @@ grub_ieee1275_open (const char *path, grub_ieee1275_ihandle_t *result)
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
- *result = args.result;
|
||||
+ *result = args.result = IEEE1275_VALUE(args.result);
|
||||
if (args.result == IEEE1275_IHANDLE_INVALID)
|
||||
return -1;
|
||||
return 0;
|
||||
@@ -474,7 +494,7 @@ grub_ieee1275_close (grub_ieee1275_ihandle_t ihandle)
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "close", 1, 0);
|
||||
- args.ihandle = ihandle;
|
||||
+ args.ihandle = IEEE1275_VALUE(ihandle);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
@@ -497,12 +517,14 @@ grub_ieee1275_claim (grub_addr_t addr, grub_size_t size, unsigned int align,
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "claim", 3, 1);
|
||||
- args.addr = (grub_ieee1275_cell_t) addr;
|
||||
- args.size = (grub_ieee1275_cell_t) size;
|
||||
- args.align = (grub_ieee1275_cell_t) align;
|
||||
+ args.addr = IEEE1275_VALUE(addr);
|
||||
+ args.size = IEEE1275_VALUE(size);
|
||||
+ args.align = IEEE1275_VALUE(align);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
+
|
||||
+ args.base = IEEE1275_VALUE(args.base);
|
||||
if (result)
|
||||
*result = args.base;
|
||||
if (args.base == IEEE1275_CELL_INVALID)
|
||||
@@ -522,8 +544,8 @@ grub_ieee1275_release (grub_addr_t addr, grub_size_t size)
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "release", 2, 0);
|
||||
- args.addr = addr;
|
||||
- args.size = size;
|
||||
+ args.addr = IEEE1275_VALUE(addr);
|
||||
+ args.size = IEEE1275_VALUE(size);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
@@ -547,14 +569,14 @@ grub_ieee1275_set_property (grub_ieee1275_phandle_t phandle,
|
||||
args;
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "setprop", 4, 1);
|
||||
- args.size = (grub_ieee1275_cell_t) size;
|
||||
+ args.size = IEEE1275_VALUE(size);
|
||||
args.buf = IEEE1275_ADDR(buf);
|
||||
args.propname = IEEE1275_ADDR(propname);
|
||||
- args.phandle = (grub_ieee1275_cell_t) phandle;
|
||||
+ args.phandle = IEEE1275_VALUE(phandle);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
- *actual = args.actual;
|
||||
+ *actual = args.actual = IEEE1275_VALUE(args.actual);
|
||||
if ((args.actual == IEEE1275_CELL_INVALID) || (args.actual != args.size))
|
||||
return -1;
|
||||
return 0;
|
||||
@@ -579,15 +601,15 @@ grub_ieee1275_set_color (grub_ieee1275_ihandle_t ihandle,
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "call-method", 6, 1);
|
||||
args.method = IEEE1275_ADDR("color!");
|
||||
- args.ihandle = ihandle;
|
||||
- args.index = index;
|
||||
- args.r = r;
|
||||
- args.g = g;
|
||||
- args.b = b;
|
||||
+ args.ihandle = IEEE1275_VALUE(ihandle);
|
||||
+ args.index = IEEE1275_VALUE(index);
|
||||
+ args.r = IEEE1275_VALUE(r);
|
||||
+ args.g = IEEE1275_VALUE(g);
|
||||
+ args.b = IEEE1275_VALUE(b);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
- return args.catch_result;
|
||||
+ return IEEE1275_VALUE(args.catch_result);
|
||||
}
|
||||
|
||||
int
|
||||
@@ -604,6 +626,6 @@ grub_ieee1275_milliseconds (grub_uint32_t *msecs)
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
- *msecs = args.msecs;
|
||||
+ *msecs = IEEE1275_VALUE(args.msecs);
|
||||
return 0;
|
||||
}
|
||||
diff --git a/grub-core/kern/ieee1275/openfw.c b/grub-core/kern/ieee1275/openfw.c
|
||||
index a8bbc71..ced8e3f 100644
|
||||
--- a/grub-core/kern/ieee1275/openfw.c
|
||||
+++ b/grub-core/kern/ieee1275/openfw.c
|
||||
@@ -286,20 +286,20 @@ grub_ieee1275_map (grub_addr_t phys, grub_addr_t virt, grub_size_t size,
|
||||
#endif
|
||||
1);
|
||||
args.method = IEEE1275_ADDR("map");
|
||||
- args.ihandle = grub_ieee1275_mmu;
|
||||
+ args.ihandle = IEEE1275_VALUE(grub_ieee1275_mmu);
|
||||
#ifdef __sparc__
|
||||
args.phys_high = 0;
|
||||
#endif
|
||||
- args.phys_low = phys;
|
||||
- args.virt = virt;
|
||||
- args.size = size;
|
||||
- args.mode = mode; /* Format is WIMG0PP. */
|
||||
- args.catch_result = (grub_ieee1275_cell_t) -1;
|
||||
+ args.phys_low = IEEE1275_ADDR(phys);
|
||||
+ args.virt = IEEE1275_ADDR(virt);
|
||||
+ args.size = IEEE1275_VALUE(size);
|
||||
+ args.mode = IEEE1275_VALUE(mode); /* Format is WIMG0PP. */
|
||||
+ args.catch_result = IEEE1275_VALUE((grub_ieee1275_cell_t) -1);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return -1;
|
||||
|
||||
- return args.catch_result;
|
||||
+ return IEEE1275_VALUE(args.catch_result);
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
@@ -545,10 +545,12 @@ grub_ieee1275_canonicalise_devname (const char *path)
|
||||
INIT_IEEE1275_COMMON (&args.common, "canon", 3, 1);
|
||||
args.path = IEEE1275_ADDR(path);
|
||||
args.buf = IEEE1275_ADDR(buf);
|
||||
- args.inlen = (grub_ieee1275_cell_t) (bufsize - 1);
|
||||
+ args.inlen = IEEE1275_VALUE(bufsize - 1);
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
return 0;
|
||||
+
|
||||
+ args.outlen = IEEE1275_VALUE(args.outlen);
|
||||
if (args.outlen > bufsize - 1)
|
||||
{
|
||||
bufsize = args.outlen + 2;
|
||||
@@ -560,4 +562,3 @@ grub_ieee1275_canonicalise_devname (const char *path)
|
||||
grub_free (buf);
|
||||
return NULL;
|
||||
}
|
||||
-
|
||||
diff --git a/grub-core/lib/ieee1275/datetime.c b/grub-core/lib/ieee1275/datetime.c
|
||||
index fa0d3b6..7ee1ae2 100644
|
||||
--- a/grub-core/lib/ieee1275/datetime.c
|
||||
+++ b/grub-core/lib/ieee1275/datetime.c
|
||||
@@ -83,22 +83,22 @@ grub_get_datetime (struct grub_datetime *datetime)
|
||||
return grub_error (GRUB_ERR_IO, "couldn't open RTC");
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 7);
|
||||
- args.device = (grub_ieee1275_cell_t) ihandle;
|
||||
+ args.device = IEEE1275_VALUE((grub_ieee1275_cell_t) ihandle);
|
||||
args.method = IEEE1275_ADDR("get-time");
|
||||
|
||||
status = IEEE1275_CALL_ENTRY_FN (&args);
|
||||
|
||||
grub_ieee1275_close (ihandle);
|
||||
|
||||
- if (status == -1 || args.catch_result)
|
||||
+ if (status == -1 || IEEE1275_VALUE(args.catch_result))
|
||||
return grub_error (GRUB_ERR_IO, "get-time failed");
|
||||
|
||||
- datetime->year = args.year;
|
||||
- datetime->month = args.month;
|
||||
- datetime->day = args.day;
|
||||
- datetime->hour = args.hour;
|
||||
- datetime->minute = args.minute;
|
||||
- datetime->second = args.second;
|
||||
+ datetime->year = IEEE1275_VALUE(args.year);
|
||||
+ datetime->month = IEEE1275_VALUE(args.month);
|
||||
+ datetime->day = IEEE1275_VALUE(args.day);
|
||||
+ datetime->hour = IEEE1275_VALUE(args.hour);
|
||||
+ datetime->minute = IEEE1275_VALUE(args.minute);
|
||||
+ datetime->second = IEEE1275_VALUE(args.second);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
@@ -135,21 +135,21 @@ grub_set_datetime (struct grub_datetime *datetime)
|
||||
return grub_error (GRUB_ERR_IO, "couldn't open RTC");
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "call-method", 8, 1);
|
||||
- args.device = (grub_ieee1275_cell_t) ihandle;
|
||||
+ args.device = IEEE1275_VALUE(ihandle);
|
||||
args.method = IEEE1275_ADDR("set-time");
|
||||
|
||||
- args.year = datetime->year;
|
||||
- args.month = datetime->month;
|
||||
- args.day = datetime->day;
|
||||
- args.hour = datetime->hour;
|
||||
- args.minute = datetime->minute;
|
||||
- args.second = datetime->second;
|
||||
+ args.year = IEEE1275_VALUE(datetime->year);
|
||||
+ args.month = IEEE1275_VALUE(datetime->month);
|
||||
+ args.day = IEEE1275_VALUE(datetime->day);
|
||||
+ args.hour = IEEE1275_VALUE(datetime->hour);
|
||||
+ args.minute = IEEE1275_VALUE(datetime->minute);
|
||||
+ args.second = IEEE1275_VALUE(datetime->second);
|
||||
|
||||
status = IEEE1275_CALL_ENTRY_FN (&args);
|
||||
|
||||
grub_ieee1275_close (ihandle);
|
||||
|
||||
- if (status == -1 || args.catch_result)
|
||||
+ if (status == -1 || IEEE1275_VALUE(args.catch_result))
|
||||
return grub_error (GRUB_ERR_IO, "set-time failed");
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
diff --git a/grub-core/net/drivers/ieee1275/ofnet.c b/grub-core/net/drivers/ieee1275/ofnet.c
|
||||
index 07c8446..01dfe85 100644
|
||||
--- a/grub-core/net/drivers/ieee1275/ofnet.c
|
||||
+++ b/grub-core/net/drivers/ieee1275/ofnet.c
|
||||
@@ -385,17 +385,17 @@ search_net_devices (struct grub_ieee1275_devalias *alias)
|
||||
}
|
||||
args;
|
||||
INIT_IEEE1275_COMMON (&args.common, "interpret", 2, 2);
|
||||
- args.len = card->txbufsize;
|
||||
+ args.len = IEEE1275_VALUE(card->txbufsize);
|
||||
args.method = IEEE1275_ADDR("alloc-mem");
|
||||
|
||||
if (IEEE1275_CALL_ENTRY_FN (&args) == -1
|
||||
- || args.catch)
|
||||
+ || IEEE1275_VALUE(args.catch))
|
||||
{
|
||||
card->txbuf = 0;
|
||||
grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory"));
|
||||
}
|
||||
else
|
||||
- card->txbuf = (void *) (grub_addr_t) args.result;
|
||||
+ card->txbuf = (void *) (grub_addr_t) IEEE1275_VALUE(args.result);
|
||||
}
|
||||
else
|
||||
card->txbuf = grub_zalloc (card->txbufsize);
|
||||
diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h
|
||||
index 2e5270c..be0c235 100644
|
||||
--- a/include/grub/ieee1275/ieee1275.h
|
||||
+++ b/include/grub/ieee1275/ieee1275.h
|
||||
@@ -49,12 +49,12 @@ struct grub_ieee1275_common_hdr
|
||||
grub_ieee1275_cell_t nr_outs;
|
||||
};
|
||||
|
||||
-#define IEEE1275_ADDR(x) (grub_uint32_t)(grub_addr_t)(x)
|
||||
-
|
||||
+#define IEEE1275_ADDR(x) (grub_uint32_t)grub_cpu_to_be32((grub_addr_t)(x))
|
||||
+#define IEEE1275_VALUE(x) (grub_uint32_t)grub_cpu_to_be32(x)
|
||||
#define INIT_IEEE1275_COMMON(p, xname, xins, xouts) \
|
||||
(p)->name = (grub_ieee1275_cell_t) IEEE1275_ADDR(xname); \
|
||||
- (p)->nr_ins = (grub_ieee1275_cell_t) xins; \
|
||||
- (p)->nr_outs = (grub_ieee1275_cell_t) xouts
|
||||
+ (p)->nr_ins = (grub_ieee1275_cell_t) IEEE1275_VALUE(xins); \
|
||||
+ (p)->nr_outs = (grub_ieee1275_cell_t) IEEE1275_VALUE(xouts)
|
||||
|
||||
typedef grub_uint32_t grub_ieee1275_ihandle_t;
|
||||
typedef grub_uint32_t grub_ieee1275_phandle_t;
|
||||
--
|
||||
1.8.3.1
|
@ -0,0 +1,35 @@
|
||||
From c7fbe6c1ae22ac9853b03a3d4d742712f31e69b9 Mon Sep 17 00:00:00 2001
|
||||
From: Ram Pai <linuxram@us.ibm.com>
|
||||
Date: Tue, 25 Feb 2014 23:31:06 +0000
|
||||
Subject: [PATCH 23/23] grub segfaults if initrd is specified before specifying
|
||||
|
||||
grub segfaults if initrd is specified before specifying
|
||||
the kernel. The problem is the initrd module sees that kernel is not
|
||||
specified and takes the fail path. In the fail path it checks if anything has
|
||||
be malloc'ed. Unfortunately the variable that it looks to check for is a
|
||||
uninitialized stack variable. The stack variable can incorrectly indicate
|
||||
something is malloced, which leads the module to free some unallocated
|
||||
memory. This patch fixes the problem by initializing the stack variable.
|
||||
|
||||
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
|
||||
---
|
||||
grub-core/loader/powerpc/ieee1275/linux.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/grub-core/loader/powerpc/ieee1275/linux.c b/grub-core/loader/powerpc/ieee1275/linux.c
|
||||
index 9dde053..0d94433 100644
|
||||
--- a/grub-core/loader/powerpc/ieee1275/linux.c
|
||||
+++ b/grub-core/loader/powerpc/ieee1275/linux.c
|
||||
@@ -335,6 +335,10 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||
grub_addr_t addr;
|
||||
struct grub_linux_initrd_context initrd_ctx;
|
||||
|
||||
+ // initialize, otherwise the fail path will try to
|
||||
+ // free up data and segfault
|
||||
+ initrd_ctx.components = NULL;
|
||||
+
|
||||
if (argc == 0)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||
--
|
||||
1.8.3.1
|
@ -1,31 +0,0 @@
|
||||
Index: grub-2.02~beta2/conf/Makefile.common
|
||||
===================================================================
|
||||
--- grub-2.02~beta2.orig/conf/Makefile.common
|
||||
+++ grub-2.02~beta2/conf/Makefile.common
|
||||
@@ -41,20 +41,20 @@ BUILD_CPPFLAGS += $(CPPFLAGS_DEFAULT)
|
||||
|
||||
LDADD_KERNEL = $(TARGET_LIBGCC)
|
||||
|
||||
-CFLAGS_KERNEL = $(CFLAGS_CPU) $(CFLAGS_PLATFORM) -ffreestanding
|
||||
+CFLAGS_KERNEL = $(CFLAGS_CPU) $(CFLAGS_PLATFORM) -ffreestanding -mbig-endian
|
||||
LDFLAGS_KERNEL = $(LDFLAGS_CPU) $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) $(TARGET_LDFLAGS_STATIC_LIBGCC)
|
||||
-CPPFLAGS_KERNEL = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM) -DGRUB_KERNEL=1
|
||||
+CPPFLAGS_KERNEL = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM) -DGRUB_KERNEL=1 -mbig-endian
|
||||
CCASFLAGS_KERNEL = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM)
|
||||
STRIPFLAGS_KERNEL = -R .rel.dyn -R .reginfo -R .note -R .comment -R .drectve -R .note.gnu.gold-version
|
||||
|
||||
-CFLAGS_MODULE = $(CFLAGS_CPU) $(CFLAGS_PLATFORM) -ffreestanding
|
||||
+CFLAGS_MODULE = $(CFLAGS_CPU) $(CFLAGS_PLATFORM) -ffreestanding -mbig-endian
|
||||
LDFLAGS_MODULE = $(LDFLAGS_CPU) $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) -Wl,-r,-d
|
||||
-CPPFLAGS_MODULE = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM)
|
||||
+CPPFLAGS_MODULE = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM) -mbig-endian
|
||||
CCASFLAGS_MODULE = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM)
|
||||
|
||||
-CFLAGS_IMAGE = $(CFLAGS_CPU) $(CFLAGS_PLATFORM) -fno-builtin
|
||||
+CFLAGS_IMAGE = $(CFLAGS_CPU) $(CFLAGS_PLATFORM) -fno-builtin -mbig-endian
|
||||
LDFLAGS_IMAGE = $(LDFLAGS_CPU) $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) -Wl,-S
|
||||
-CPPFLAGS_IMAGE = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM)
|
||||
+CPPFLAGS_IMAGE = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM) -mbig-endian
|
||||
CCASFLAGS_IMAGE = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM)
|
||||
|
||||
CFLAGS_PROGRAM =
|
@ -1,13 +0,0 @@
|
||||
Index: grub-2.02~beta2/configure.ac
|
||||
===================================================================
|
||||
--- grub-2.02~beta2.orig/configure.ac
|
||||
+++ grub-2.02~beta2/configure.ac
|
||||
@@ -137,6 +137,7 @@ case "$target_cpu"-"$platform" in
|
||||
x86_64-xen) ;;
|
||||
x86_64-*) target_cpu=i386 ;;
|
||||
powerpc64-ieee1275) target_cpu=powerpc ;;
|
||||
+ powerpc64le-ieee1275) target_cpu=powerpc ;;
|
||||
esac
|
||||
|
||||
# Check if the platform is supported, make final adjustments.
|
||||
|
325
grub2-s390x-02-kexec-module-added-to-emu.patch
Normal file
325
grub2-s390x-02-kexec-module-added-to-emu.patch
Normal file
@ -0,0 +1,325 @@
|
||||
---
|
||||
grub-core/Makefile.am | 1
|
||||
grub-core/Makefile.core.def | 2
|
||||
grub-core/kern/emu/main.c | 4
|
||||
grub-core/kern/emu/misc.c | 18 ++++
|
||||
grub-core/loader/emu/linux.c | 173 +++++++++++++++++++++++++++++++++++++++++++
|
||||
include/grub/emu/exec.h | 4
|
||||
include/grub/emu/hostfile.h | 3
|
||||
include/grub/emu/misc.h | 3
|
||||
8 files changed, 205 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/grub-core/Makefile.core.def
|
||||
+++ b/grub-core/Makefile.core.def
|
||||
@@ -1674,9 +1674,9 @@ module = {
|
||||
arm = loader/arm/linux.c;
|
||||
arm64 = loader/arm64/linux.c;
|
||||
fdt = lib/fdt.c;
|
||||
+ emu = loader/emu/linux.c;
|
||||
common = loader/linux.c;
|
||||
common = lib/cmdline.c;
|
||||
- enable = noemu;
|
||||
};
|
||||
|
||||
module = {
|
||||
--- /dev/null
|
||||
+++ b/grub-core/loader/emu/linux.c
|
||||
@@ -0,0 +1,173 @@
|
||||
+/*
|
||||
+ * GRUB -- GRand Unified Bootloader
|
||||
+ * Copyright (C) 2006,2007,2008,2009,2010 Free Software Foundation, Inc.
|
||||
+ *
|
||||
+ * GRUB is free software: you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License as published by
|
||||
+ * the Free Software Foundation, either version 3 of the License, or
|
||||
+ * (at your option) any later version.
|
||||
+ *
|
||||
+ * GRUB is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
+ */
|
||||
+
|
||||
+#include <grub/loader.h>
|
||||
+#include <grub/dl.h>
|
||||
+#include <grub/command.h>
|
||||
+#include <grub/time.h>
|
||||
+
|
||||
+#include <grub/emu/exec.h>
|
||||
+#include <grub/emu/hostfile.h>
|
||||
+#include <grub/emu/misc.h>
|
||||
+
|
||||
+GRUB_MOD_LICENSE ("GPLv3+");
|
||||
+
|
||||
+static grub_dl_t my_mod;
|
||||
+
|
||||
+static char *kernel_path;
|
||||
+static char *initrd_path;
|
||||
+static char *boot_cmdline;
|
||||
+
|
||||
+static grub_err_t
|
||||
+grub_linux_boot (void)
|
||||
+{
|
||||
+ grub_err_t rc = GRUB_ERR_NONE;
|
||||
+ char *initrd_param;
|
||||
+ const char *kexec[] = { "kexec", "-l", kernel_path, boot_cmdline, NULL, NULL };
|
||||
+ const char *systemctl[] = { "systemctl", "kexec", NULL };
|
||||
+ int kexecute = grub_util_get_kexecute();
|
||||
+
|
||||
+ if (initrd_path) {
|
||||
+ initrd_param = grub_xasprintf("--initrd=%s", initrd_path);
|
||||
+ kexec[3] = initrd_param;
|
||||
+ kexec[4] = boot_cmdline;
|
||||
+ } else {
|
||||
+ initrd_param = grub_xasprintf("%s", "");
|
||||
+ //return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("initrd required!"));
|
||||
+ }
|
||||
+
|
||||
+ grub_printf("%serforming 'kexec -l %s %s %s'\n",
|
||||
+ (kexecute) ? "P" : "Not p",
|
||||
+ kernel_path, initrd_param, boot_cmdline);
|
||||
+
|
||||
+ if (kexecute)
|
||||
+ rc = grub_util_exec(kexec);
|
||||
+
|
||||
+ grub_free(initrd_param);
|
||||
+
|
||||
+ if (rc != GRUB_ERR_NONE) {
|
||||
+ grub_error (rc, N_("Error trying to perform kexec load operation."));
|
||||
+ grub_sleep (3);
|
||||
+ return rc;
|
||||
+ }
|
||||
+ if (kexecute < 1)
|
||||
+ grub_fatal (N_("Use '--kexec' if you really want to load&restart from here."));
|
||||
+
|
||||
+ grub_printf("Performing 'systemctl kexec' (%s) ",
|
||||
+ (kexecute==1) ? "do-or-die" : "just-in-case");
|
||||
+ rc = grub_util_exec (systemctl);
|
||||
+
|
||||
+ if (kexecute == 1)
|
||||
+ grub_fatal (N_("Error trying to perform 'systemctl kexec'"));
|
||||
+
|
||||
+ /* need to check read-only root before resetting hard!? */
|
||||
+ grub_printf("Performing 'kexec -e'");
|
||||
+ kexec[1] = "-e";
|
||||
+ kexec[2] = NULL;
|
||||
+ rc = grub_util_exec(kexec);
|
||||
+ if ( rc != GRUB_ERR_NONE )
|
||||
+ grub_fatal (N_("Error trying to directly perform 'kexec -e'."));
|
||||
+
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+static grub_err_t
|
||||
+grub_linux_unload (void)
|
||||
+{
|
||||
+ grub_dl_unref (my_mod);
|
||||
+ if ( boot_cmdline != NULL )
|
||||
+ grub_free (boot_cmdline);
|
||||
+ boot_cmdline = NULL;
|
||||
+ return GRUB_ERR_NONE;
|
||||
+}
|
||||
+
|
||||
+static grub_err_t
|
||||
+grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), int argc, char *argv[])
|
||||
+{
|
||||
+ int i;
|
||||
+ char *tempstr;
|
||||
+
|
||||
+ grub_dl_ref (my_mod);
|
||||
+
|
||||
+ if (argc == 0)
|
||||
+ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||
+
|
||||
+ if ( !grub_util_is_regular(argv[0]) )
|
||||
+ return grub_error(GRUB_ERR_FILE_NOT_FOUND, N_("Cannot find kernel file %s"), argv[0]);
|
||||
+
|
||||
+ if ( kernel_path != NULL )
|
||||
+ grub_free(kernel_path);
|
||||
+
|
||||
+ kernel_path = grub_xasprintf("%s", argv[0]);
|
||||
+
|
||||
+ if ( boot_cmdline != NULL ) {
|
||||
+ grub_free(boot_cmdline);
|
||||
+ boot_cmdline = NULL;
|
||||
+ }
|
||||
+
|
||||
+ if ( argc > 1 )
|
||||
+ {
|
||||
+ boot_cmdline = grub_xasprintf("--command-line=%s", argv[1]);
|
||||
+ for ( i = 2; i < argc; i++ ) {
|
||||
+ tempstr = grub_xasprintf("%s %s", boot_cmdline, argv[i]);
|
||||
+ grub_free(boot_cmdline);
|
||||
+ boot_cmdline = tempstr;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ grub_loader_set (grub_linux_boot, grub_linux_unload, 0);
|
||||
+
|
||||
+ return GRUB_ERR_NONE;
|
||||
+}
|
||||
+
|
||||
+static grub_err_t
|
||||
+grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), int argc, char *argv[])
|
||||
+{
|
||||
+ if (argc == 0)
|
||||
+ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||
+
|
||||
+ if ( !grub_util_is_regular(argv[0]) )
|
||||
+ return grub_error(GRUB_ERR_FILE_NOT_FOUND, N_("Cannot find initrd file %s"), argv[0]);
|
||||
+
|
||||
+ if ( initrd_path != NULL )
|
||||
+ grub_free(initrd_path);
|
||||
+
|
||||
+ initrd_path = grub_xasprintf("%s", argv[0]);
|
||||
+
|
||||
+ grub_dl_unref (my_mod);
|
||||
+
|
||||
+ return GRUB_ERR_NONE;
|
||||
+}
|
||||
+
|
||||
+static grub_command_t cmd_linux, cmd_initrd;
|
||||
+
|
||||
+GRUB_MOD_INIT(linux)
|
||||
+{
|
||||
+ cmd_linux = grub_register_command ("linux", grub_cmd_linux, 0, N_("Load Linux."));
|
||||
+ cmd_initrd = grub_register_command ("initrd", grub_cmd_initrd, 0, N_("Load initrd."));
|
||||
+ my_mod = mod;
|
||||
+ kernel_path = NULL;
|
||||
+ initrd_path = NULL;
|
||||
+ boot_cmdline = NULL;
|
||||
+}
|
||||
+
|
||||
+GRUB_MOD_FINI(linux)
|
||||
+{
|
||||
+ grub_unregister_command (cmd_linux);
|
||||
+ grub_unregister_command (cmd_initrd);
|
||||
+}
|
||||
--- a/include/grub/emu/hostfile.h
|
||||
+++ b/include/grub/emu/hostfile.h
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <grub/disk.h>
|
||||
#include <grub/partition.h>
|
||||
#include <sys/types.h>
|
||||
+#include <grub/symbol.h>
|
||||
#include <grub/osdep/hostfile.h>
|
||||
|
||||
int
|
||||
@@ -29,7 +30,7 @@ grub_util_is_directory (const char *path
|
||||
int
|
||||
grub_util_is_special_file (const char *path);
|
||||
int
|
||||
-grub_util_is_regular (const char *path);
|
||||
+EXPORT_FUNC(grub_util_is_regular) (const char *path);
|
||||
|
||||
char *
|
||||
grub_util_path_concat (size_t n, ...);
|
||||
--- a/include/grub/emu/exec.h
|
||||
+++ b/include/grub/emu/exec.h
|
||||
@@ -23,6 +23,8 @@
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
+#include <grub/symbol.h>
|
||||
+
|
||||
pid_t
|
||||
grub_util_exec_pipe (const char *const *argv, int *fd);
|
||||
pid_t
|
||||
@@ -32,7 +34,7 @@ int
|
||||
grub_util_exec_redirect_all (const char *const *argv, const char *stdin_file,
|
||||
const char *stdout_file, const char *stderr_file);
|
||||
int
|
||||
-grub_util_exec (const char *const *argv);
|
||||
+EXPORT_FUNC(grub_util_exec) (const char *const *argv);
|
||||
int
|
||||
grub_util_exec_redirect (const char *const *argv, const char *stdin_file,
|
||||
const char *stdout_file);
|
||||
--- a/grub-core/Makefile.am
|
||||
+++ b/grub-core/Makefile.am
|
||||
@@ -243,6 +243,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/inc
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/hostdisk.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/hostfile.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||
+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/exec.h
|
||||
if COND_GRUB_EMU_SDL
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/sdl.h
|
||||
endif
|
||||
--- a/grub-core/kern/emu/main.c
|
||||
+++ b/grub-core/kern/emu/main.c
|
||||
@@ -95,6 +95,7 @@ static struct argp_option options[] = {
|
||||
N_("use GRUB files in the directory DIR [default=%s]"), 0},
|
||||
{"verbose", 'v', 0, 0, N_("print verbose messages."), 0},
|
||||
{"hold", 'H', N_("SECS"), OPTION_ARG_OPTIONAL, N_("wait until a debugger will attach"), 0},
|
||||
+ {"kexec", 'X', 0, 0, N_("try the untryable."), 0},
|
||||
{ 0, 0, 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
@@ -148,6 +149,9 @@ argp_parser (int key, char *arg, struct
|
||||
case 'v':
|
||||
verbosity++;
|
||||
break;
|
||||
+ case 'X':
|
||||
+ grub_util_set_kexecute();
|
||||
+ break;
|
||||
|
||||
case ARGP_KEY_ARG:
|
||||
{
|
||||
--- a/grub-core/kern/emu/misc.c
|
||||
+++ b/grub-core/kern/emu/misc.c
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <grub/emu/misc.h>
|
||||
|
||||
int verbosity;
|
||||
+int kexecute;
|
||||
|
||||
void
|
||||
grub_util_warn (const char *fmt, ...)
|
||||
@@ -81,9 +82,23 @@ grub_util_error (const char *fmt, ...)
|
||||
vfprintf (stderr, fmt, ap);
|
||||
va_end (ap);
|
||||
fprintf (stderr, ".\n");
|
||||
+ grub_exit ();
|
||||
+ /* NOTREACHED but needed to get small diff... */
|
||||
exit (1);
|
||||
}
|
||||
|
||||
+void
|
||||
+grub_util_set_kexecute(void)
|
||||
+{
|
||||
+ kexecute++;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+grub_util_get_kexecute(void)
|
||||
+{
|
||||
+ return kexecute;
|
||||
+}
|
||||
+
|
||||
void *
|
||||
xmalloc (grub_size_t size)
|
||||
{
|
||||
@@ -138,6 +153,9 @@ xasprintf (const char *fmt, ...)
|
||||
void
|
||||
grub_exit (void)
|
||||
{
|
||||
+#if defined (GRUB_KERNEL)
|
||||
+ grub_reboot();
|
||||
+#endif
|
||||
exit (1);
|
||||
}
|
||||
|
||||
--- a/include/grub/emu/misc.h
|
||||
+++ b/include/grub/emu/misc.h
|
||||
@@ -59,6 +59,9 @@ void EXPORT_FUNC(grub_util_warn) (const
|
||||
void EXPORT_FUNC(grub_util_info) (const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
|
||||
void EXPORT_FUNC(grub_util_error) (const char *fmt, ...) __attribute__ ((format (printf, 1, 2), noreturn));
|
||||
|
||||
+void EXPORT_FUNC(grub_util_set_kexecute) (void);
|
||||
+int EXPORT_FUNC(grub_util_get_kexecute) (void) WARN_UNUSED_RESULT;
|
||||
+
|
||||
grub_uint64_t EXPORT_FUNC (grub_util_get_cpu_time_ms) (void);
|
||||
|
||||
extern char * canonicalize_file_name (const char *path);
|
439
grub2-s390x-03-output-7-bit-ascii.patch
Normal file
439
grub2-s390x-03-output-7-bit-ascii.patch
Normal file
@ -0,0 +1,439 @@
|
||||
---
|
||||
grub-core/normal/menu_text.c | 43 ++++++-
|
||||
grub-core/normal/term.c | 2
|
||||
grub-core/osdep/unix/emuconsole.c | 224 ++++++++++++++++++++++++++++++++++++--
|
||||
3 files changed, 257 insertions(+), 12 deletions(-)
|
||||
|
||||
--- a/grub-core/osdep/unix/emuconsole.c
|
||||
+++ b/grub-core/osdep/unix/emuconsole.c
|
||||
@@ -39,17 +39,61 @@
|
||||
|
||||
#include <grub/emu/console.h>
|
||||
|
||||
+#include <stdio.h>
|
||||
+#include <errno.h>
|
||||
+
|
||||
extern struct grub_terminfo_output_state grub_console_terminfo_output;
|
||||
static int original_fl;
|
||||
static int saved_orig;
|
||||
static struct termios orig_tty;
|
||||
static struct termios new_tty;
|
||||
+static int console_mode = 0;
|
||||
+
|
||||
+#define MAX_LEN 1023
|
||||
+#if defined(__s390x__)
|
||||
+static int
|
||||
+dummy (void)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif
|
||||
+#if 0
|
||||
+static char msg[MAX_LEN+1];
|
||||
+static void
|
||||
+dprint (int len)
|
||||
+{
|
||||
+ if (len < 0)
|
||||
+ return;
|
||||
+ if (len > MAX_LEN)
|
||||
+ len = MAX_LEN;
|
||||
+ write (2, msg, len);
|
||||
+}
|
||||
+#define dprintf(fmt, vargs...) dprint(snprintf(msg, MAX_LEN, fmt, ## vargs))
|
||||
+#else
|
||||
+#define dprintf(fmt, vargs...) {}
|
||||
+#endif
|
||||
|
||||
static void
|
||||
-put (struct grub_term_output *term __attribute__ ((unused)), const int c)
|
||||
+put (struct grub_term_output *term, const int c)
|
||||
{
|
||||
char chr = c;
|
||||
ssize_t actual;
|
||||
+ struct grub_terminfo_output_state *data
|
||||
+ = (struct grub_terminfo_output_state *) term->data;
|
||||
+
|
||||
+ if (term->flags & GRUB_TERM_DUMB) {
|
||||
+ if (c == '\n') {
|
||||
+ data->pos.y++;
|
||||
+ data->pos.x = 0;
|
||||
+ } else {
|
||||
+ data->pos.x++;
|
||||
+ }
|
||||
+ if (0) {
|
||||
+ if (c == ' ') chr = '_';
|
||||
+ if (c == GRUB_TERM_BACKSPACE) chr = '{';
|
||||
+ if (c == '\b') chr = '<';
|
||||
+ }
|
||||
+ }
|
||||
|
||||
actual = write (STDOUT_FILENO, &chr, 1);
|
||||
if (actual < 1)
|
||||
@@ -60,20 +104,145 @@ put (struct grub_term_output *term __att
|
||||
}
|
||||
|
||||
static int
|
||||
-readkey (struct grub_term_input *term __attribute__ ((unused)))
|
||||
+readkey (struct grub_term_input *term)
|
||||
{
|
||||
grub_uint8_t c;
|
||||
ssize_t actual;
|
||||
|
||||
+ fd_set readfds;
|
||||
+ struct timeval timeout;
|
||||
+ int sel;
|
||||
+ FD_SET (0, &readfds);
|
||||
+ timeout.tv_sec = 0;
|
||||
+ timeout.tv_usec = 500000;
|
||||
+ if ((sel=select (1, &readfds, (fd_set *)0, (fd_set *)0, &timeout)) <= 0)
|
||||
+ return -1;
|
||||
+
|
||||
actual = read (STDIN_FILENO, &c, 1);
|
||||
- if (actual > 0)
|
||||
- return c;
|
||||
- return -1;
|
||||
+ if (actual <= 0)
|
||||
+ return -1;
|
||||
+ return c;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+readkey_dumb (struct grub_term_input *term)
|
||||
+{
|
||||
+ grub_uint8_t c;
|
||||
+ static grub_uint8_t p = 0;
|
||||
+
|
||||
+ c = readkey (term);
|
||||
+ if (c == (grub_uint8_t)-1)
|
||||
+ return -1;
|
||||
+ if ((c == '\n' || c == '^') && p != c)
|
||||
+ {
|
||||
+ p = c;
|
||||
+ return -1;
|
||||
+ }
|
||||
+ if (p == '^' && c != '^')
|
||||
+ c &= 0x1F;
|
||||
+ p = c;
|
||||
+ return c;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+grub_dumb_putchar (struct grub_term_output *term,
|
||||
+ const struct grub_unicode_glyph *c)
|
||||
+{
|
||||
+ unsigned i;
|
||||
+
|
||||
+ /* For now, do not try to use a surrogate pair. */
|
||||
+ if (c->base > 0xffff)
|
||||
+ put (term, '?');
|
||||
+ else
|
||||
+ put (term, (c->base & 0xffff));
|
||||
+
|
||||
+ if (0) {
|
||||
+ for (i = 0; i < c->ncomb; i++)
|
||||
+ if (c->base < 0xffff)
|
||||
+ put (term, grub_unicode_get_comb (c)[i].code);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static struct grub_term_coordinate
|
||||
+grub_dumb_getxy (struct grub_term_output *term)
|
||||
+{
|
||||
+ struct grub_terminfo_output_state *data
|
||||
+ = (struct grub_terminfo_output_state *) term->data;
|
||||
+
|
||||
+ dprintf ("<%d,%d>", data->pos.x, data->pos.y);
|
||||
+ return data->pos;
|
||||
+}
|
||||
+
|
||||
+static struct grub_term_coordinate
|
||||
+grub_dumb_getwh (struct grub_term_output *term)
|
||||
+{
|
||||
+ static int once = 0;
|
||||
+ struct grub_terminfo_output_state *data
|
||||
+ = (struct grub_terminfo_output_state *) term->data;
|
||||
+
|
||||
+ if (!once++)
|
||||
+ dprintf ("dumb_getwh: w=%d h=%d\n", data->size.x, data->size.y);
|
||||
+ return data->size;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+grub_dumb_gotoxy (struct grub_term_output *term,
|
||||
+ struct grub_term_coordinate pos)
|
||||
+{
|
||||
+ struct grub_terminfo_output_state *data
|
||||
+ = (struct grub_terminfo_output_state *) term->data;
|
||||
+
|
||||
+ if (pos.x > grub_term_width (term) || pos.y > grub_term_height (term))
|
||||
+ {
|
||||
+ grub_error (GRUB_ERR_BUG, "invalid point (%u,%u)", pos.x, pos.y);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ dprintf("goto(%d,%d)", pos.x, pos.y);
|
||||
+ if (pos.x > (grub_term_width (term) - 4)) {
|
||||
+ dprintf (" really?");
|
||||
+ //return;
|
||||
+ }
|
||||
+
|
||||
+ if (data->gotoxy)
|
||||
+ {
|
||||
+ int i;
|
||||
+ dprintf ("data-gotoxy");
|
||||
+ if (data->pos.y != pos.y) {
|
||||
+ put (term, '\n');
|
||||
+
|
||||
+ for (i = 1; i < pos.x; i++ )
|
||||
+ put (term, ' ');
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ int i = 0;
|
||||
+ if (data->pos.y != pos.y || data->pos.x > pos.x) {
|
||||
+ if (data->pos.y >= pos.y) data->pos.y = pos.y - 1;
|
||||
+ if (pos.y - data->pos.y > 3) data->pos.y = pos.y - 2;
|
||||
+ dprintf (" <%dnl>+%d", (pos.y - data->pos.y), pos.x);
|
||||
+ for (i = data->pos.y; i < pos.y; i++ )
|
||||
+ put (term, '\n');
|
||||
+ }
|
||||
+ for (i = data->pos.x; i < pos.x; i++ )
|
||||
+ put (term, ' ');
|
||||
+ dprintf ("#%d", i);
|
||||
+ grub_dumb_getxy (term);
|
||||
+ }
|
||||
+
|
||||
+ dprintf ("\n");
|
||||
+ data->pos = pos;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_console_init_input (struct grub_term_input *term)
|
||||
{
|
||||
+ if (console_mode > 3200)
|
||||
+ {
|
||||
+ new_tty = orig_tty;
|
||||
+ return GRUB_ERR_NONE;
|
||||
+ }
|
||||
if (!saved_orig)
|
||||
{
|
||||
original_fl = fcntl (STDIN_FILENO, F_GETFL);
|
||||
@@ -105,7 +274,8 @@ static grub_err_t
|
||||
grub_console_init_output (struct grub_term_output *term)
|
||||
{
|
||||
struct winsize size;
|
||||
- if (ioctl (STDOUT_FILENO, TIOCGWINSZ, &size) >= 0)
|
||||
+ if (ioctl (STDOUT_FILENO, TIOCGWINSZ, &size) >= 0 &&
|
||||
+ size.ws_col > 0 && size.ws_row > 0)
|
||||
{
|
||||
grub_console_terminfo_output.size.x = size.ws_col;
|
||||
grub_console_terminfo_output.size.y = size.ws_row;
|
||||
@@ -115,6 +285,8 @@ grub_console_init_output (struct grub_te
|
||||
grub_console_terminfo_output.size.x = 80;
|
||||
grub_console_terminfo_output.size.y = 24;
|
||||
}
|
||||
+ if (console_mode == 3215)
|
||||
+ grub_console_terminfo_output.size.x -= 1;
|
||||
|
||||
grub_terminfo_output_init (term);
|
||||
|
||||
@@ -161,15 +333,53 @@ static struct grub_term_output grub_cons
|
||||
void
|
||||
grub_console_init (void)
|
||||
{
|
||||
+#if ! defined(__s390x__)
|
||||
const char *cs = nl_langinfo (CODESET);
|
||||
if (cs && grub_strcasecmp (cs, "UTF-8"))
|
||||
grub_console_term_output.flags = GRUB_TERM_CODE_TYPE_UTF8_LOGICAL;
|
||||
else
|
||||
grub_console_term_output.flags = GRUB_TERM_CODE_TYPE_ASCII;
|
||||
+#else
|
||||
+ char link[MAX_LEN+1];
|
||||
+ ssize_t len = readlink ("/proc/self/fd/0", link, MAX_LEN);
|
||||
+
|
||||
+ if (len > 0)
|
||||
+ link[len] = 0;
|
||||
+ else
|
||||
+ link[0] = 0;
|
||||
+ if (grub_strncmp ("/dev/ttyS", link, 9) == 0 )
|
||||
+ console_mode = 3215;
|
||||
+ if (grub_strncmp ("/dev/3270/tty", link, 13) == 0 )
|
||||
+ console_mode = 3270;
|
||||
+ grub_console_term_output.flags = GRUB_TERM_CODE_TYPE_ASCII;
|
||||
+ switch (console_mode)
|
||||
+ {
|
||||
+ case 3215:
|
||||
+ grub_console_term_output.flags |= GRUB_TERM_DUMB;
|
||||
+ /* FALLTHROUGH */
|
||||
+ case 3270:
|
||||
+ grub_console_terminfo_input.readkey = readkey_dumb;
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
+#endif
|
||||
+ if (grub_console_term_output.flags & GRUB_TERM_DUMB)
|
||||
+ {
|
||||
+ grub_console_term_output.putchar = grub_dumb_putchar,
|
||||
+ grub_console_term_output.getxy = grub_dumb_getxy;
|
||||
+ grub_console_term_output.getwh = grub_dumb_getwh;
|
||||
+ grub_console_term_output.gotoxy = grub_dumb_gotoxy;
|
||||
+ grub_console_term_output.cls = (void *) dummy;
|
||||
+ grub_console_term_output.setcolorstate = (void *) dummy;
|
||||
+ grub_console_term_output.setcursor = (void *) dummy;
|
||||
+ grub_console_term_output.progress_update_divisor = GRUB_PROGRESS_NO_UPDATE;
|
||||
+ }
|
||||
grub_term_register_input ("console", &grub_console_term_input);
|
||||
grub_term_register_output ("console", &grub_console_term_output);
|
||||
grub_terminfo_init ();
|
||||
- grub_terminfo_output_register (&grub_console_term_output, "vt100-color");
|
||||
+ grub_terminfo_output_register (&grub_console_term_output,
|
||||
+ (grub_console_term_output.flags & GRUB_TERM_DUMB)?"dumb":"vt100-color");
|
||||
}
|
||||
|
||||
void
|
||||
--- a/grub-core/normal/menu_text.c
|
||||
+++ b/grub-core/normal/menu_text.c
|
||||
@@ -113,6 +113,7 @@ draw_border (struct grub_term_output *te
|
||||
{
|
||||
int i;
|
||||
|
||||
+ if (! (term->flags & GRUB_TERM_DUMB)) {
|
||||
grub_term_setcolorstate (term, GRUB_TERM_COLOR_NORMAL);
|
||||
|
||||
grub_term_gotoxy (term, (struct grub_term_coordinate) { geo->first_entry_x - 1,
|
||||
@@ -142,7 +143,7 @@ draw_border (struct grub_term_output *te
|
||||
grub_putcode (GRUB_UNICODE_CORNER_LR, term);
|
||||
|
||||
grub_term_setcolorstate (term, GRUB_TERM_COLOR_NORMAL);
|
||||
-
|
||||
+ }
|
||||
grub_term_gotoxy (term,
|
||||
(struct grub_term_coordinate) { geo->first_entry_x - 1,
|
||||
(geo->first_entry_y - 1 + geo->num_entries
|
||||
@@ -165,6 +166,11 @@ command-line or ESC to discard edits and
|
||||
}
|
||||
else
|
||||
{
|
||||
+#if defined(__s390x__hotkey)
|
||||
+ ret += grub_print_message_indented_real
|
||||
+ (_("Select a menu option by pressing the hotkey specified."),
|
||||
+ STANDARD_MARGIN, STANDARD_MARGIN, term, dry_run);
|
||||
+#else
|
||||
char *msg_translated;
|
||||
|
||||
msg_translated = grub_xasprintf (_("Use the %C and %C keys to select which "
|
||||
@@ -177,6 +183,7 @@ command-line or ESC to discard edits and
|
||||
STANDARD_MARGIN, term, dry_run);
|
||||
|
||||
grub_free (msg_translated);
|
||||
+#endif
|
||||
|
||||
if (nested)
|
||||
{
|
||||
@@ -211,6 +218,10 @@ print_entry (int y, int highlight, grub_
|
||||
|
||||
title = entry ? entry->title : "";
|
||||
title_len = grub_strlen (title);
|
||||
+
|
||||
+ if ((data->term->flags & GRUB_TERM_DUMB) && title[0] == '\0')
|
||||
+ return;
|
||||
+
|
||||
unicode_title = grub_malloc (title_len * sizeof (*unicode_title));
|
||||
if (! unicode_title)
|
||||
/* XXX How to show this error? */
|
||||
@@ -244,6 +255,14 @@ print_entry (int y, int highlight, grub_
|
||||
if (data->geo.num_entries > 1)
|
||||
grub_putcode (highlight ? '*' : ' ', data->term);
|
||||
|
||||
+ if ((data->term->flags & GRUB_TERM_DUMB) && title[0] != '\0') {
|
||||
+ grub_putcode('(', data->term);
|
||||
+ grub_putcode((entry && entry->hotkey >= '0' && entry->hotkey <= 'z') ?
|
||||
+ entry->hotkey : ' ', data->term);
|
||||
+ grub_putcode(')', data->term);
|
||||
+ grub_putcode(' ', data->term);
|
||||
+ }
|
||||
+
|
||||
grub_print_ucs4_menu (unicode_title,
|
||||
unicode_title + len,
|
||||
0,
|
||||
@@ -413,6 +432,8 @@ grub_menu_init_page (int nested, int edi
|
||||
grub_term_highlight_color = old_color_highlight;
|
||||
geo->timeout_y = geo->first_entry_y + geo->num_entries
|
||||
+ geo->border + empty_lines;
|
||||
+ if (term->flags & GRUB_TERM_DUMB)
|
||||
+ geo->timeout_y = 1;
|
||||
if (bottom_message)
|
||||
{
|
||||
grub_term_gotoxy (term,
|
||||
@@ -422,6 +443,8 @@ grub_menu_init_page (int nested, int edi
|
||||
print_message (nested, edit, term, 0);
|
||||
geo->timeout_y += msg_num_lines;
|
||||
}
|
||||
+ if (term->flags & GRUB_TERM_DUMB)
|
||||
+ geo->timeout_y = 1;
|
||||
geo->right_margin = grub_term_width (term)
|
||||
- geo->first_entry_x
|
||||
- geo->entry_width - 1;
|
||||
@@ -433,12 +456,19 @@ menu_text_print_timeout (int timeout, vo
|
||||
struct menu_viewer_data *data = dataptr;
|
||||
char *msg_translated = 0;
|
||||
|
||||
- grub_term_gotoxy (data->term,
|
||||
+ if (data->geo.timeout_y)
|
||||
+ grub_term_gotoxy (data->term,
|
||||
(struct grub_term_coordinate) { 0, data->geo.timeout_y });
|
||||
|
||||
+ if (data->term->flags & GRUB_TERM_DUMB)
|
||||
+ {
|
||||
+ if (! data->geo.timeout_y)
|
||||
+ data->timeout_msg = TIMEOUT_TERSE;
|
||||
+ data->geo.timeout_y = 0;
|
||||
+ }
|
||||
if (data->timeout_msg == TIMEOUT_TERSE
|
||||
|| data->timeout_msg == TIMEOUT_TERSE_NO_MARGIN)
|
||||
- msg_translated = grub_xasprintf (_("%ds"), timeout);
|
||||
+ msg_translated = grub_xasprintf (_(" %ds"), timeout);
|
||||
else
|
||||
msg_translated = grub_xasprintf (_("The highlighted entry will be executed automatically in %ds."), timeout);
|
||||
if (!msg_translated)
|
||||
@@ -468,6 +498,8 @@ menu_text_print_timeout (int timeout, vo
|
||||
data->term);
|
||||
grub_free (msg_translated);
|
||||
|
||||
+ if (data->term->flags & GRUB_TERM_DUMB)
|
||||
+ return;
|
||||
grub_term_gotoxy (data->term,
|
||||
(struct grub_term_coordinate) {
|
||||
grub_term_cursor_x (&data->geo),
|
||||
@@ -495,7 +527,7 @@ menu_text_set_chosen_entry (int entry, v
|
||||
data->first = entry;
|
||||
complete_redraw = 1;
|
||||
}
|
||||
- if (complete_redraw)
|
||||
+ if (complete_redraw || (data->term->flags & GRUB_TERM_DUMB))
|
||||
print_entries (data->menu, data);
|
||||
else
|
||||
{
|
||||
@@ -525,6 +557,9 @@ menu_text_clear_timeout (void *dataptr)
|
||||
struct menu_viewer_data *data = dataptr;
|
||||
int i;
|
||||
|
||||
+ if ((data->term->flags & GRUB_TERM_DUMB))
|
||||
+ return;
|
||||
+
|
||||
for (i = 0; i < data->geo.timeout_lines;i++)
|
||||
{
|
||||
grub_term_gotoxy (data->term, (struct grub_term_coordinate) {
|
||||
--- a/grub-core/normal/term.c
|
||||
+++ b/grub-core/normal/term.c
|
||||
@@ -981,7 +981,7 @@ grub_print_ucs4_menu (const grub_uint32_
|
||||
{
|
||||
print_ucs4_real (str, last_position, margin_left, margin_right,
|
||||
term, 0, 0, 1, skip_lines, max_lines,
|
||||
- contchar, 1, pos);
|
||||
+ contchar, (term->flags & GRUB_TERM_DUMB)? 0 : 1, pos);
|
||||
}
|
||||
|
||||
void
|
887
grub2-s390x-04-grub2-install.patch
Normal file
887
grub2-s390x-04-grub2-install.patch
Normal file
@ -0,0 +1,887 @@
|
||||
From: Raymund Will <rw@suse.com>
|
||||
Subject: Allow s390x-emu to be "installed"
|
||||
References: fate#314213
|
||||
Patch-Mainline: no
|
||||
|
||||
---
|
||||
Makefile.util.def | 39 +++
|
||||
configure.ac | 9
|
||||
grub-core/Makefile.core.def | 7
|
||||
grub-core/osdep/basic/no_platform.c | 7
|
||||
grub-core/osdep/unix/platform.c | 13 +
|
||||
grub-core/osdep/windows/platform.c | 6
|
||||
include/grub/util/install.h | 4
|
||||
util/grub-install-common.c | 1
|
||||
util/grub-install.c | 51 +++++
|
||||
util/s390x/dracut-grub2.sh.in | 69 ++++++
|
||||
util/s390x/dracut-module-setup.sh.in | 17 +
|
||||
util/s390x/zipl2grub.conf.in | 26 ++
|
||||
util/s390x/zipl2grub.pl.in | 346 +++++++++++++++++++++++++++++++++++
|
||||
13 files changed, 591 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/Makefile.util.def
|
||||
+++ b/Makefile.util.def
|
||||
@@ -350,6 +350,7 @@ program = {
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
cppflags = '-DGRUB_SETUP_FUNC=grub_util_bios_setup';
|
||||
+ emu_condition = COND_NOT_s390x;
|
||||
};
|
||||
|
||||
program = {
|
||||
@@ -370,6 +371,7 @@ program = {
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
cppflags = '-DGRUB_SETUP_FUNC=grub_util_sparc_setup';
|
||||
+ emu_condition = COND_NOT_s390x;
|
||||
};
|
||||
|
||||
program = {
|
||||
@@ -385,6 +387,7 @@ program = {
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBGEOM)';
|
||||
+ emu_condition = COND_NOT_s390x;
|
||||
};
|
||||
|
||||
program = {
|
||||
@@ -415,6 +418,7 @@ program = {
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
+ emu_condition = COND_NOT_s390x;
|
||||
};
|
||||
|
||||
data = {
|
||||
@@ -620,7 +624,7 @@ program = {
|
||||
common = grub-core/disk/host.c;
|
||||
|
||||
common = util/resolve.c;
|
||||
- enable = noemu;
|
||||
+ emu_condition = COND_s390x;
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
|
||||
@@ -688,6 +692,38 @@ script = {
|
||||
};
|
||||
|
||||
script = {
|
||||
+ name = zipl2grub.pl;
|
||||
+ common = util/s390x/zipl2grub.pl.in;
|
||||
+ enable = emu;
|
||||
+ emu_condition = COND_s390x;
|
||||
+ installdir = platform;
|
||||
+};
|
||||
+
|
||||
+data = {
|
||||
+ name = zipl2grub.conf.in;
|
||||
+ common = util/s390x/zipl2grub.conf.in;
|
||||
+ installdir = grubconf;
|
||||
+ enable = emu;
|
||||
+ emu_condition = COND_s390x;
|
||||
+};
|
||||
+
|
||||
+script = {
|
||||
+ name = dracut-module-setup.sh;
|
||||
+ common = util/s390x/dracut-module-setup.sh.in;
|
||||
+ enable = emu;
|
||||
+ emu_condition = COND_s390x;
|
||||
+ installdir = platform;
|
||||
+};
|
||||
+
|
||||
+script = {
|
||||
+ name = dracut-grub.sh;
|
||||
+ common = util/s390x/dracut-grub2.sh.in;
|
||||
+ enable = emu;
|
||||
+ emu_condition = COND_s390x;
|
||||
+ installdir = platform;
|
||||
+};
|
||||
+
|
||||
+script = {
|
||||
name = grub-mkconfig_lib;
|
||||
common = util/grub-mkconfig_lib.in;
|
||||
installdir = noinst;
|
||||
@@ -1281,6 +1317,7 @@ program = {
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
+ emu_condition = COND_NOT_s390x;
|
||||
};
|
||||
|
||||
program = {
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -177,9 +177,9 @@ if test x$platform != xemu ; then
|
||||
esac
|
||||
fi
|
||||
|
||||
-if test x"$target_cpu-$platform" = xsparc64-emu ; then
|
||||
- target_m64=1 ;
|
||||
-fi
|
||||
+case x"$target_cpu-$platform" in
|
||||
+ xsparc64-emu | xs390x-emu) target_m64=1 ;;
|
||||
+esac
|
||||
|
||||
case "$target_os" in
|
||||
windows* | mingw32*) target_os=cygwin ;;
|
||||
@@ -1665,6 +1665,9 @@ AM_CONDITIONAL([COND_arm_uboot], [test x
|
||||
AM_CONDITIONAL([COND_arm_efi], [test x$target_cpu = xarm -a x$platform = xefi])
|
||||
AM_CONDITIONAL([COND_arm64], [test x$target_cpu = xarm64 ])
|
||||
AM_CONDITIONAL([COND_arm64_efi], [test x$target_cpu = xarm64 -a x$platform = xefi])
|
||||
+AM_CONDITIONAL([COND_s390x], [test x$target_cpu = xs390x ])
|
||||
+AM_CONDITIONAL([COND_NOT_s390x], [test x$target_cpu != xs390x ])
|
||||
+AM_CONDITIONAL([COND_s390x_emu], [test x$target_cpu = xs390x -a x$platform = xemu])
|
||||
|
||||
AM_CONDITIONAL([COND_HOST_HURD], [test x$host_kernel = xhurd])
|
||||
AM_CONDITIONAL([COND_HOST_LINUX], [test x$host_kernel = xlinux])
|
||||
--- a/grub-core/Makefile.core.def
|
||||
+++ b/grub-core/Makefile.core.def
|
||||
@@ -1064,6 +1064,7 @@ module = {
|
||||
module = {
|
||||
name = videotest;
|
||||
common = commands/videotest.c;
|
||||
+ emu_condition = COND_NOT_s390x;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -1477,6 +1478,7 @@ module = {
|
||||
common = gfxmenu/gui_progress_bar.c;
|
||||
common = gfxmenu/gui_util.c;
|
||||
common = gfxmenu/gui_string_util.c;
|
||||
+ emu_condition = COND_NOT_s390x;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -1856,11 +1858,13 @@ module = {
|
||||
name = gfxterm;
|
||||
common = term/gfxterm.c;
|
||||
enable = videomodules;
|
||||
+ emu_condition = COND_NOT_s390x;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = gfxterm_background;
|
||||
common = term/gfxterm_background.c;
|
||||
+ emu_condition = COND_NOT_s390x;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -1975,6 +1979,7 @@ module = {
|
||||
enable = x86_64_efi;
|
||||
enable = emu;
|
||||
enable = xen;
|
||||
+ emu_condition = COND_NOT_s390x;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -1990,6 +1995,7 @@ module = {
|
||||
module = {
|
||||
name = gfxterm_menu;
|
||||
common = tests/gfxterm_menu.c;
|
||||
+ emu_condition = COND_NOT_s390x;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -2142,6 +2148,7 @@ module = {
|
||||
enable = x86_64_efi;
|
||||
enable = emu;
|
||||
enable = xen;
|
||||
+ emu_condition = COND_NOT_s390x;
|
||||
};
|
||||
|
||||
module = {
|
||||
--- a/grub-core/osdep/basic/no_platform.c
|
||||
+++ b/grub-core/osdep/basic/no_platform.c
|
||||
@@ -44,3 +44,10 @@ grub_install_sgi_setup (const char *inst
|
||||
{
|
||||
grub_util_error ("%s", _("no SGI routines are available for your platform"));
|
||||
}
|
||||
+
|
||||
+void
|
||||
+grub_install_zipl (const char *D, const char *s, const char *d, int i, int f)
|
||||
+{
|
||||
+ grub_util_error ("%s", _("no zIPL routines are available for your platform"));
|
||||
+}
|
||||
+
|
||||
--- a/grub-core/osdep/unix/platform.c
|
||||
+++ b/grub-core/osdep/unix/platform.c
|
||||
@@ -233,3 +233,16 @@ grub_install_sgi_setup (const char *inst
|
||||
imgfile, destname, NULL });
|
||||
grub_util_warn ("%s", _("You will have to set `SystemPartition' and `OSLoader' manually."));
|
||||
}
|
||||
+
|
||||
+void
|
||||
+grub_install_zipl (const char *scriptdir, const char *script,
|
||||
+ const char *dest, int install, int force)
|
||||
+{
|
||||
+ char *path = grub_util_path_concat (2, scriptdir, script);
|
||||
+ if (grub_util_exec ((const char * []){ path,
|
||||
+ install ? "" : "--debug",
|
||||
+ verbosity ? "-v" : "",
|
||||
+ force ? "--force" : "",
|
||||
+ "-z", dest, NULL }))
|
||||
+ grub_util_error (_("`%s' failed.\n"), script);
|
||||
+}
|
||||
--- a/grub-core/osdep/windows/platform.c
|
||||
+++ b/grub-core/osdep/windows/platform.c
|
||||
@@ -422,3 +422,9 @@ grub_install_sgi_setup (const char *inst
|
||||
{
|
||||
grub_util_error ("%s", _("no SGI routines are available for your platform"));
|
||||
}
|
||||
+
|
||||
+void
|
||||
+grub_install_zipl (const char *D, const char *s, const char *d, int i, int f)
|
||||
+{
|
||||
+ grub_util_error ("%s", _("no zIPL routines are available for your platform"));
|
||||
+}
|
||||
--- a/include/grub/util/install.h
|
||||
+++ b/include/grub/util/install.h
|
||||
@@ -99,6 +99,7 @@ enum grub_install_plat
|
||||
GRUB_INSTALL_PLATFORM_I386_XEN,
|
||||
GRUB_INSTALL_PLATFORM_X86_64_XEN,
|
||||
GRUB_INSTALL_PLATFORM_ARM64_EFI,
|
||||
+ GRUB_INSTALL_PLATFORM_S390X_EMU,
|
||||
GRUB_INSTALL_PLATFORM_MAX
|
||||
};
|
||||
|
||||
@@ -217,6 +218,9 @@ void
|
||||
grub_install_sgi_setup (const char *install_device,
|
||||
const char *imgfile, const char *destname);
|
||||
|
||||
+void
|
||||
+grub_install_zipl (const char *D, const char *s, const char *d, int i, int f);
|
||||
+
|
||||
int
|
||||
grub_install_compress_gzip (const char *src, const char *dest);
|
||||
int
|
||||
--- a/util/grub-install-common.c
|
||||
+++ b/util/grub-install-common.c
|
||||
@@ -665,6 +665,7 @@ static struct
|
||||
[GRUB_INSTALL_PLATFORM_ARM_EFI] = { "arm", "efi" },
|
||||
[GRUB_INSTALL_PLATFORM_ARM64_EFI] = { "arm64", "efi" },
|
||||
[GRUB_INSTALL_PLATFORM_ARM_UBOOT] = { "arm", "uboot" },
|
||||
+ [GRUB_INSTALL_PLATFORM_S390X_EMU] = { "s390x", "emu" },
|
||||
};
|
||||
|
||||
char *
|
||||
--- a/util/grub-install.c
|
||||
+++ b/util/grub-install.c
|
||||
@@ -66,6 +66,7 @@ static int force_file_id = 0;
|
||||
static char *disk_module = NULL;
|
||||
static char *efidir = NULL;
|
||||
static char *macppcdir = NULL;
|
||||
+static char *zipldir = NULL;
|
||||
static int force = 0;
|
||||
static int have_abstractions = 0;
|
||||
static int have_cryptodisk = 0;
|
||||
@@ -107,6 +108,7 @@ enum
|
||||
OPTION_NO_BOOTSECTOR,
|
||||
OPTION_NO_RS_CODES,
|
||||
OPTION_MACPPC_DIRECTORY,
|
||||
+ OPTION_ZIPL_DIRECTORY,
|
||||
OPTION_LABEL_FONT,
|
||||
OPTION_LABEL_COLOR,
|
||||
OPTION_LABEL_BGCOLOR,
|
||||
@@ -182,6 +184,11 @@ argp_parser (int key, char *arg, struct
|
||||
efidir = xstrdup (arg);
|
||||
return 0;
|
||||
|
||||
+ case OPTION_ZIPL_DIRECTORY:
|
||||
+ free (zipldir);
|
||||
+ zipldir = xstrdup (arg);
|
||||
+ return 0;
|
||||
+
|
||||
case OPTION_DISK_MODULE:
|
||||
free (disk_module);
|
||||
disk_module = xstrdup (arg);
|
||||
@@ -299,6 +306,8 @@ static struct argp_option options[] = {
|
||||
N_("use DIR as the EFI System Partition root."), 2},
|
||||
{"macppc-directory", OPTION_MACPPC_DIRECTORY, N_("DIR"), 0,
|
||||
N_("use DIR for PPC MAC install."), 2},
|
||||
+ {"zipl-directory", OPTION_ZIPL_DIRECTORY, N_("DIR"), 0,
|
||||
+ N_("use DIR as the zIPL Boot Partition root."), 2},
|
||||
{"label-font", OPTION_LABEL_FONT, N_("FILE"), 0, N_("use FILE as font for label"), 2},
|
||||
{"label-color", OPTION_LABEL_COLOR, N_("COLOR"), 0, N_("use COLOR for label"), 2},
|
||||
{"label-bgcolor", OPTION_LABEL_BGCOLOR, N_("COLOR"), 0, N_("use COLOR for label background"), 2},
|
||||
@@ -325,6 +334,8 @@ get_default_platform (void)
|
||||
return "arm64-efi";
|
||||
#elif defined (__amd64__) || defined (__x86_64__) || defined (__i386__)
|
||||
return grub_install_get_default_x86_platform ();
|
||||
+#elif defined (__s390x__)
|
||||
+ return "s390x-emu";
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
@@ -484,6 +495,8 @@ have_bootdev (enum grub_install_plat pl)
|
||||
|
||||
case GRUB_INSTALL_PLATFORM_I386_XEN:
|
||||
case GRUB_INSTALL_PLATFORM_X86_64_XEN:
|
||||
+
|
||||
+ case GRUB_INSTALL_PLATFORM_S390X_EMU:
|
||||
return 0;
|
||||
|
||||
/* pacify warning. */
|
||||
@@ -895,6 +908,7 @@ main (int argc, char *argv[])
|
||||
case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
|
||||
case GRUB_INSTALL_PLATFORM_I386_XEN:
|
||||
case GRUB_INSTALL_PLATFORM_X86_64_XEN:
|
||||
+ case GRUB_INSTALL_PLATFORM_S390X_EMU:
|
||||
break;
|
||||
|
||||
case GRUB_INSTALL_PLATFORM_I386_QEMU:
|
||||
@@ -940,6 +954,7 @@ main (int argc, char *argv[])
|
||||
case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS:
|
||||
case GRUB_INSTALL_PLATFORM_I386_XEN:
|
||||
case GRUB_INSTALL_PLATFORM_X86_64_XEN:
|
||||
+ case GRUB_INSTALL_PLATFORM_S390X_EMU:
|
||||
free (install_device);
|
||||
install_device = NULL;
|
||||
break;
|
||||
@@ -1201,6 +1216,20 @@ main (int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
+ if (platform == GRUB_INSTALL_PLATFORM_S390X_EMU)
|
||||
+ {
|
||||
+ if (!zipldir)
|
||||
+ {
|
||||
+ char *d = grub_util_path_concat (2, bootdir, "zipl");
|
||||
+ if (!grub_util_is_directory (d))
|
||||
+ {
|
||||
+ free (d);
|
||||
+ grub_util_error ("%s", _("cannot find zIPL directory"));
|
||||
+ }
|
||||
+ zipldir = d;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
grub_install_copy_files (grub_install_source_directory,
|
||||
grubdir, platform);
|
||||
|
||||
@@ -1445,6 +1474,7 @@ main (int argc, char *argv[])
|
||||
case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
|
||||
case GRUB_INSTALL_PLATFORM_I386_XEN:
|
||||
case GRUB_INSTALL_PLATFORM_X86_64_XEN:
|
||||
+ case GRUB_INSTALL_PLATFORM_S390X_EMU:
|
||||
grub_util_warn ("%s", _("no hints available for your platform. Expect reduced performance"));
|
||||
break;
|
||||
/* pacify warning. */
|
||||
@@ -1557,6 +1587,10 @@ main (int argc, char *argv[])
|
||||
strcpy (mkimage_target, "sparc64-ieee1275-raw");
|
||||
core_name = "core.img";
|
||||
break;
|
||||
+ case GRUB_INSTALL_PLATFORM_S390X_EMU:
|
||||
+ strcpy (mkimage_target, "grub2-emu");
|
||||
+ core_name = mkimage_target;
|
||||
+ break;
|
||||
/* pacify warning. */
|
||||
case GRUB_INSTALL_PLATFORM_MAX:
|
||||
break;
|
||||
@@ -1572,6 +1606,7 @@ main (int argc, char *argv[])
|
||||
core_name);
|
||||
char *prefix = xasprintf ("%s%s", prefix_drive ? : "",
|
||||
relative_grubdir);
|
||||
+ if (core_name != mkimage_target)
|
||||
grub_install_make_image_wrap (/* source dir */ grub_install_source_directory,
|
||||
/*prefix */ prefix,
|
||||
/* output */ imgfile,
|
||||
@@ -1610,6 +1645,17 @@ main (int argc, char *argv[])
|
||||
/* image target */ mkimage_target, 0);
|
||||
}
|
||||
break;
|
||||
+
|
||||
+ case GRUB_INSTALL_PLATFORM_S390X_EMU:
|
||||
+#if 0
|
||||
+ {
|
||||
+ char *dst = grub_util_path_concat (2, platdir, "grub2-emu");
|
||||
+ grub_install_copy_file ("/usr/bin/grub2-emu", dst, 1);
|
||||
+ free (dst);
|
||||
+ }
|
||||
+#endif
|
||||
+ break;
|
||||
+
|
||||
case GRUB_INSTALL_PLATFORM_ARM_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_ARM64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_IA64_EFI:
|
||||
@@ -1871,6 +1917,11 @@ main (int argc, char *argv[])
|
||||
}
|
||||
break;
|
||||
|
||||
+ case GRUB_INSTALL_PLATFORM_S390X_EMU:
|
||||
+ grub_install_zipl (grub_install_source_directory, "zipl2grub.pl",
|
||||
+ zipldir, install_bootsector, force);
|
||||
+ break;
|
||||
+
|
||||
case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON:
|
||||
case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS:
|
||||
case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS:
|
||||
--- /dev/null
|
||||
+++ b/util/s390x/dracut-grub2.sh.in
|
||||
@@ -0,0 +1,69 @@
|
||||
+#!/bin/sh
|
||||
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
+# ex: ts=8 sw=4 sts=4 et filetype=sh
|
||||
+#getargbool() { true; }
|
||||
+
|
||||
+if getargbool 0 initgrub && [ ! -e /grub2b0rken ] || [ -e /grub2force ]; then
|
||||
+ #type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
|
||||
+ checkro() {
|
||||
+ local dev mp fs opts dc
|
||||
+ local rofs=false
|
||||
+ while read dev mp fs opts dc; do
|
||||
+ [ "$mp" = "/sysroot" ] || continue
|
||||
+ case ",$opts," in
|
||||
+ (*,ro,*) rofs=true;;
|
||||
+ esac
|
||||
+ done < /proc/mounts
|
||||
+ echo $rofs
|
||||
+ }
|
||||
+ checkd() {
|
||||
+ [ -d $1 ] && echo true || echo false
|
||||
+ }
|
||||
+ getterm() {
|
||||
+ local term="$(getarg TERM)"
|
||||
+ [ -z "$term" ] && term=dumb
|
||||
+ echo $term
|
||||
+ }
|
||||
+
|
||||
+ exec_prefix=@exec_prefix@
|
||||
+ bindir=@bindir@
|
||||
+ if [ -e /sysroot$bindir/grub2-emu ]; then
|
||||
+
|
||||
+
|
||||
+ export TERM=$(getterm)
|
||||
+ export grub2rofs=$(checkro)
|
||||
+ export grub2sysfs=$(checkd /sysroot/sys/kernel)
|
||||
+ export grub2procfs=$(checkd /sysroot/proc/slef)
|
||||
+ export -p > /tmp/grub2env
|
||||
+ cat /proc/mounts > /tmp/grub2mounts
|
||||
+
|
||||
+ _ctty="$(RD_DEBUG= getarg rd.ctty=)" && _ctty="/dev/${_ctty##*/}"
|
||||
+ if [ -z "$_ctty" ]; then
|
||||
+ _ctty=console
|
||||
+ while [ -f /sys/class/tty/$_ctty/active ]; do
|
||||
+ _ctty=$(cat /sys/class/tty/$_ctty/active)
|
||||
+ _ctty=${_ctty##* } # last one in the list
|
||||
+ done
|
||||
+ _ctty=/dev/$_ctty
|
||||
+ fi
|
||||
+ [ -c "$_ctty" ] || _ctty=/dev/tty1
|
||||
+ case "$(/usr/bin/setsid --help 2>&1)" in *--ctty*) CTTY="--ctty";; esac
|
||||
+
|
||||
+ CTTY="$CTTY --wait"
|
||||
+ $grub2rofs || mount -o remount,ro /sysroot
|
||||
+ $grub2sysfs || mount --bind {,/sysroot}/sys
|
||||
+ $grub2procfs || mount --bind {,/sysroot}/proc
|
||||
+
|
||||
+ info "Trying grub2emu (ro=$grub2rofs, TERM=$TERM)..."
|
||||
+ setsid $CTTY -- chroot /sysroot $bindir/grub2-emu -X -X 0<>$_ctty 1>&0 2>&0
|
||||
+ if [ -e /grub2force ] && [ $(cat /sys/kernel/kexec_loaded) = 1 ]; then
|
||||
+ systemctl kexec
|
||||
+ fi
|
||||
+ $grub2procfs || umount /sysroot/proc
|
||||
+ $grub2sysfs || umount /sysroot/sys
|
||||
+ $grub2rofs || mount -o remount,rw /sysroot
|
||||
+ else
|
||||
+ info "No $bindir/grub2-emu in /sysroot--trying to proceed without kexec..."
|
||||
+ fi
|
||||
+fi
|
||||
+
|
||||
--- /dev/null
|
||||
+++ b/util/s390x/dracut-module-setup.sh.in
|
||||
@@ -0,0 +1,17 @@
|
||||
+#!/bin/bash
|
||||
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
+# ex: ts=8 sw=4 sts=4 et filetype=sh
|
||||
+
|
||||
+# called by dracut
|
||||
+check() {
|
||||
+ local _arch=$(uname -m)
|
||||
+ [ "$_arch" = "s390" -o "$_arch" = "s390x" ] || return 1
|
||||
+ return 0
|
||||
+}
|
||||
+
|
||||
+# called by dracut
|
||||
+install() {
|
||||
+ inst_hook cleanup 99 "$moddir/grub2.sh"
|
||||
+ #inst_multiple grub2-emu kexec
|
||||
+}
|
||||
+
|
||||
--- /dev/null
|
||||
+++ b/util/s390x/zipl2grub.conf.in
|
||||
@@ -0,0 +1,26 @@
|
||||
+## This is the template for '@zipldir@/config' and is subject to
|
||||
+## rpm's %config file handling in case of grub2-s390x-emu package update.
|
||||
+
|
||||
+[defaultboot]
|
||||
+defaultmenu = menu
|
||||
+
|
||||
+[grub2]
|
||||
+ target = @zipldir@
|
||||
+ ramdisk = @zipldir@/initrd,0x2000000
|
||||
+ image = @zipldir@/image
|
||||
+ parameters = "root=@GRUB_DEVICE@ @GRUB_CMDLINE_LINUX@ @GRUB_CMDLINE_LINUX_DEFAULT@ initgrub quiet splash=silent "
|
||||
+
|
||||
+[skip-grub2]
|
||||
+ target = @zipldir@
|
||||
+ ramdisk = @zipldir@/initrd,0x2000000
|
||||
+ image = @zipldir@/image
|
||||
+ parameters = "root=@GRUB_DEVICE@ @GRUB_CMDLINE_LINUX@ @GRUB_CMDLINE_LINUX_DEFAULT@ "
|
||||
+
|
||||
+:menu
|
||||
+ target = @zipldir@
|
||||
+ timeout = 16
|
||||
+ default = 1
|
||||
+ prompt = 1
|
||||
+ 1 = grub2
|
||||
+ 2 = skip-grub2
|
||||
+
|
||||
--- /dev/null
|
||||
+++ b/util/s390x/zipl2grub.pl.in
|
||||
@@ -0,0 +1,346 @@
|
||||
+#!/usr/bin/perl
|
||||
+use strict;
|
||||
+
|
||||
+my $C = $0; $C =~ s{^.*/}{};
|
||||
+
|
||||
+my $in = '@sysconfdir@/default/zipl2grub.conf.in';
|
||||
+my $default = '@sysconfdir@/default/grub';
|
||||
+my $fallback = '@sysconfdir@/zipl.conf';
|
||||
+my $sysconfbl = '@sysconfdir@/sysconfig/bootloader';
|
||||
+my $zipldir = "";
|
||||
+my $running = "";
|
||||
+my $refresh = 1; # needs to default to "on" until most bugs are shaken out!
|
||||
+my $force = 0;
|
||||
+my $verbose = 0;
|
||||
+my $debug = 0;
|
||||
+my $miss = 0;
|
||||
+my $cfg = "";
|
||||
+my %C;
|
||||
+
|
||||
+$C{GRUB_CMDLINE_LINUX} = ""; # force existence!
|
||||
+
|
||||
+sub Panic($$) {
|
||||
+ printf( STDERR "%s", $_[1]);
|
||||
+ exit( $_[0]);
|
||||
+}
|
||||
+sub Info($$) {
|
||||
+ printf( STDERR "%s", $_[1]) if ($_[0] <= $verbose);
|
||||
+}
|
||||
+sub System(@) {
|
||||
+ my (@C) =@_;
|
||||
+ Info( 1, "+ " . join( " ", @C) . "\n");
|
||||
+ return 0 if ($debug);
|
||||
+ system( @C);
|
||||
+ if ($? == -1) {
|
||||
+ Panic( $?, "$C[0]: Failed to execute: $!\n");
|
||||
+ } elsif ($? & 127) {
|
||||
+ Panic( $?, sprintf( "$C[0]: Died with signal %d with%s coredump\n",
|
||||
+ ($? & 127), ($? & 128) ? '' : 'out'));
|
||||
+ } elsif ( $? >> 8 != 0 ) {
|
||||
+ Panic( $?, "$C[0]: Failed\n");
|
||||
+ }
|
||||
+ return( 0);
|
||||
+}
|
||||
+sub cp($$) {
|
||||
+ my @C = ( "cp", "-p", $_[0], $_[1]);
|
||||
+ System( @C);
|
||||
+}
|
||||
+sub rm($) {
|
||||
+ return( 0) unless ( -l $_[0] || -e $_[0]);
|
||||
+ Info( 2, "+ rm $_[0]\n");
|
||||
+ return 0 if ($debug);
|
||||
+ unlink( $_[0]) || Panic( 1, "$C: unlink: $!.\n");
|
||||
+}
|
||||
+sub mv($$) {
|
||||
+ Info( 1, "+ mv $_[0] $_[1]\n");
|
||||
+ return 0 if ($debug);
|
||||
+ rename($_[0], $_[1]) || Panic( 1, "$C: rename: $!.\n");
|
||||
+}
|
||||
+sub ln($$) {
|
||||
+ Info( 1, "+ ln -sf $_[0] $_[1]\n");
|
||||
+ return 0 if ($debug);
|
||||
+ rm( $_[1]);
|
||||
+ symlink($_[0], $_[1]) || Panic( 1, "$C: symlink: $!.\n");
|
||||
+}
|
||||
+sub BootCopy($$$) {
|
||||
+ my( $file, $dir, $tgt) = @_;
|
||||
+ my $curr = "$dir/$tgt";
|
||||
+ my $prev = "$dir/$tgt.prev";
|
||||
+ Info(4, "Copy /boot/$file $dir $tgt\n");
|
||||
+ if ( -l $curr ) {
|
||||
+ my $curf = readlink( $curr);
|
||||
+ if ( $curf ne $file ) {
|
||||
+ if ( -l $prev ) {
|
||||
+ my $pref = readlink( $prev);
|
||||
+ rm( $pref);
|
||||
+ }
|
||||
+ mv( $curr, $prev);
|
||||
+ }
|
||||
+ }
|
||||
+ cp( "/boot/$file", "$dir/$file");
|
||||
+ ln( $file, $curr);
|
||||
+}
|
||||
+sub MkInitrd($$$) {
|
||||
+ my( $initrd, $dir, $version) = @_;
|
||||
+ my @C = ( "dracut", "--hostonly", "--force", "$dir/$initrd", $version);
|
||||
+ System( @C);
|
||||
+ ln( $initrd, "$dir/initrd");
|
||||
+}
|
||||
+sub ChkInitrd($$) {
|
||||
+ my( $dir, $initrd) = @_;
|
||||
+ my $found = 0;
|
||||
+ my $d = $dir;
|
||||
+ my $pattern = qr{lib/dracut/hooks/cleanup/99-grub2.sh};
|
||||
+ my $show = "cleanup/99-grub2.sh";
|
||||
+
|
||||
+ return $found unless (-r "$dir/$initrd");
|
||||
+
|
||||
+ my $modinst = "/usr/lib/dracut/modules.d/99grub2/module-setup.sh";
|
||||
+ if ( -r $modinst ) {
|
||||
+ my( $hook, $ord, $script);
|
||||
+ my $pat = qr{^\s*inst_hook\s+(\S+)\s+([0-9]+)\s+\"\$moddir/(grub2\.sh)\"};
|
||||
+ open( IN, "< $modinst") || die;
|
||||
+ while ( <IN> ) {
|
||||
+ next unless ($_ =~ $pat);
|
||||
+ $show = "$1/$2-$3";
|
||||
+ $pattern = qr{lib/dracut/hooks/$show}o;
|
||||
+ last;
|
||||
+ }
|
||||
+ close( IN);
|
||||
+ }
|
||||
+
|
||||
+ Info( 3, "+ zcat $d/$initrd | cpio -it | grep '$show'\n");
|
||||
+ open( IN, "zcat $d/$initrd | cpio -it 2>/dev/null |") ||
|
||||
+ Panic( 1, "$C: cpio: $!.\n");
|
||||
+ while ( <IN> ) {
|
||||
+ $found = 1 if ($_ =~ $pattern);
|
||||
+ }
|
||||
+ close( IN);
|
||||
+ return $found;
|
||||
+}
|
||||
+
|
||||
+sub Usage($) {
|
||||
+ my @cat = ("",
|
||||
+ "Parameter error.",
|
||||
+ "zIPL directory missing.",
|
||||
+ "Configuration template missing.",
|
||||
+ "Configuration template unreadable.",
|
||||
+ "zIPL directory not accesible.",
|
||||
+ ""
|
||||
+ );
|
||||
+ my $msg = "";
|
||||
+
|
||||
+ $msg .= sprintf( "%s: %s\n", $C, $cat[$_[0]]) if ($_[0] > 0);
|
||||
+ $msg .= "Usage: $C [-v] [-d] [-f] [-T template] [-z ZIPLDIR]\n";
|
||||
+ Panic( $_[0], $msg . "\n");
|
||||
+}
|
||||
+
|
||||
+die if ($[ != 0);
|
||||
+while ( $#ARGV >= 0 ) {
|
||||
+ $_ = shift;
|
||||
+ next if /^$/;
|
||||
+ last if /^--$/;
|
||||
+ (/^--verbose$/ || /^-v$/) && ($verbose++, next);
|
||||
+ (/^--quiet$/ || /^-q$/) && ($verbose = 0, next);
|
||||
+ (/^--debug$/ || /^-d$/) && ($debug = 1, $verbose++, next);
|
||||
+ (/^--force$/ || /^-f$/) && ($force = $refresh = 1, next);
|
||||
+ (/^--refresh$/ || /^-r$/) && ($refresh = 1, next);
|
||||
+ (/^--keep$/ || /^-k$/) && ($refresh = 0, next);
|
||||
+ (/^--?help/ || /^-h/) && (Usage(0));
|
||||
+ (/^--zipldir$/ || /^-z$/) && ($zipldir = shift || Usage(2), next);
|
||||
+ (/^--template$/ || /^-T$/) && ($in = shift || Usage(3), next);
|
||||
+ (/^-/) && (Usage(1));
|
||||
+ Usage(1);
|
||||
+}
|
||||
+Usage(4) if (! -r $in);
|
||||
+
|
||||
+if ($zipldir) {
|
||||
+ $C{zipldir} = $zipldir; # command-line wins
|
||||
+} elsif ( exists( $C{zipldir}) ) {
|
||||
+ $zipldir = $C{zipldir}; # otherwise fall back to config
|
||||
+} else {
|
||||
+ $zipldir = $C{zipldir} = "/boot/zipl"; # but don't proceed without...
|
||||
+}
|
||||
+Usage(5) if (! -d $zipldir);
|
||||
+if ( $zipldir eq "/boot" ) {
|
||||
+ Panic( 5, "$C: zIPL directory '/boot' not supported!\n");
|
||||
+}
|
||||
+
|
||||
+if ( ! -r $default && ! -r $fallback && ! -r $sysconfbl ) {
|
||||
+ Panic( 0, "$C: No configuration files found. Retry later!\n");
|
||||
+}
|
||||
+if ( -r $default ) {
|
||||
+ open( IN, "< $default") || die;
|
||||
+ while ( <IN> ) {
|
||||
+ chomp;
|
||||
+ s{^\s*#.*$}{};
|
||||
+ next if m{^\s*$};
|
||||
+ s{x}{\x01xx\x01}g;
|
||||
+ s{\\\"}{\x01x1\x01}g;
|
||||
+ s{\\\'}{\x01x2\x01}g;
|
||||
+ Info( 5, "<$_>\n");
|
||||
+ if ( m{^([^\s=]+)='([^']*)'\s*(?:#.*)?$} ||
|
||||
+ m{^([^\s=]+)="([^"]*)"\s*(?:#.*)?$} ||
|
||||
+ m{^([^\s=]+)=(\S*)\s*(?:#.*)?$} ) {
|
||||
+ my ( $k, $v) = ($1, $2);
|
||||
+ $v =~ s{\x01x2\x01}{\\'}g;
|
||||
+ $v =~ s{\x01x1\x01}{\\"}g;
|
||||
+ $v =~ s{\x01xx\x01}{x}g;
|
||||
+ $C{$k} = $v;
|
||||
+ next;
|
||||
+ }
|
||||
+ print( STDERR "$default:$.: parse error ignored.\n");
|
||||
+ }
|
||||
+ close( IN);
|
||||
+}
|
||||
+
|
||||
+if ( ! exists( $C{GRUB_DEVICE}) &&
|
||||
+ (! exists( $C{GRUB_CMDLINE_LINUX_DEFAULT}) ||
|
||||
+ $C{GRUB_CMDLINE_LINUX_DEFAULT} eq "quiet splash=silent") &&
|
||||
+ -r $fallback ) {
|
||||
+ # configuration incomplete, let's try fallback
|
||||
+ open( IN, "< $fallback") || die;
|
||||
+ my $section = "";
|
||||
+ while( <IN> ){
|
||||
+ if ( m{^\[([^\]]+)\]\s*$} ) {
|
||||
+ $section = $1;
|
||||
+ }
|
||||
+ if ( $section eq "ipl" &&
|
||||
+ m{^\s*parameters\s*=\s*\"root=(\S+)(?:\s*|\s+([^\"]+))\"} ) {
|
||||
+ $C{GRUB_DEVICE} = $1;
|
||||
+ $C{GRUB_CMDLINE_LINUX_DEFAULT} = $2 if (defined($2) && $2 !~ m{^\s*$});
|
||||
+ last;
|
||||
+ }
|
||||
+ }
|
||||
+ close( IN);
|
||||
+ $default = $fallback;
|
||||
+}
|
||||
+if ( ! exists( $C{GRUB_DEVICE}) ) {
|
||||
+ my( $dev, $uuid, $type, $subvol) = ("", "", "", "");
|
||||
+ chomp( $dev = qx{grub2-probe --target=device /});
|
||||
+ chomp( $uuid = qx{grub2-probe --device $dev --target=fs_uuid});
|
||||
+ $subvol =~ s{^/}{};
|
||||
+ if ($dev && $uuid) {
|
||||
+ $C{GRUB_DEVICE} = "UUID=$uuid";
|
||||
+ chomp( $type = qx{stat -f --printf='%T' /});
|
||||
+ chomp( $subvol = qx{grub2-mkrelpath /}) if ( $type eq "btrfs" );
|
||||
+ $C{GRUB_DEVICE} .= " rootflags=subvol=$subvol" if ($subvol);
|
||||
+ }
|
||||
+}
|
||||
+if ( ! exists( $C{GRUB_DEVICE}) && -r "/etc/fstab" ) {
|
||||
+ my( $dev, $type);
|
||||
+ open( IN, "< /etc/fstab") || die;
|
||||
+ while ( <IN> ) {
|
||||
+ next if ( m{^\s*#} );
|
||||
+ ($dev, $type) = (m{^(\S+)\s+/\s+(\S+)\s+\S+\s+\S+\s+\S+\s*(?:#.*)?$});
|
||||
+ last if (defined( $dev));
|
||||
+ }
|
||||
+ close( IN);
|
||||
+ $C{GRUB_DEVICE} = $dev;
|
||||
+ # ToDo: is static 'subvol=@' good enough?
|
||||
+ $C{GRUB_DEVICE} .= ' rootflags=subvol=@' if ($type eq "btrfs");
|
||||
+}
|
||||
+if ( (! exists( $C{GRUB_CMDLINE_LINUX_DEFAULT}) ||
|
||||
+ $C{GRUB_CMDLINE_LINUX_DEFAULT} eq "quiet splash=silent") &&
|
||||
+ -r $sysconfbl) {
|
||||
+ open( IN, "< $sysconfbl") || die;
|
||||
+ while ( <IN> ) {
|
||||
+ next if ( m{^\s*#} );
|
||||
+ if ( m{^DEFAULT_APPEND=".*"(?:\s*|\s+#.*)$} ) {
|
||||
+ $C{GRUB_CMDLINE_LINUX_DEFAULT} = $1;
|
||||
+ }
|
||||
+ }
|
||||
+ close( IN);
|
||||
+}
|
||||
+
|
||||
+ if ( ! exists( $C{GRUB_DEVICE})) {
|
||||
+ Panic( 0, "$C: Default not ready and no fallback. Please retry later!\n");
|
||||
+ }
|
||||
+
|
||||
+if ( $debug && $verbose > 2 ) {
|
||||
+ foreach ( sort( keys( %C)) ) {
|
||||
+ printf( "%s=\"%s\"\n", $_, $C{$_});
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+open( IN, "< $in") ||
|
||||
+ Panic( 1, "$C: Failed to open 'zipl.conf' template: $!.\n");
|
||||
+while ( <IN> ) {
|
||||
+ Info( 3, "$.. <$_$.. >");
|
||||
+ if ( $. == 1 && m{^## This} ) {
|
||||
+ $_ = "## This file was written by 'grub2-install/$C'\n" .
|
||||
+ "## filling '$in' as template\n";
|
||||
+ } elsif ( $. == 2 && m{^## rpm's} ) {
|
||||
+ $_ = "## with values from '$default'.\n" .
|
||||
+ "## In-place modifications will eventually go missing!\n";
|
||||
+ }
|
||||
+ while ( m{\@([^\@\s]+)\@} ) {
|
||||
+ my $k = $1;
|
||||
+ my $v;
|
||||
+ if ( exists( $C{$k}) ) {
|
||||
+ $v = $C{$k};
|
||||
+ } else {
|
||||
+ $v = $k;
|
||||
+ $miss++;
|
||||
+ }
|
||||
+ s{\@$k\@}{$v}g;
|
||||
+ }
|
||||
+ Info( 2, $_);
|
||||
+ $cfg .= $_;
|
||||
+}
|
||||
+if ( $miss ) {
|
||||
+ Info( 1, "Partially filled config:\n===\n$cfg===\n");
|
||||
+ Panic( 1, "$C: 'zipl.conf' template could not be filled. \n");
|
||||
+}
|
||||
+
|
||||
+my $ziplconf = "$zipldir/config";
|
||||
+if ( ! $debug ) {
|
||||
+ open( OUT, "> $ziplconf") || die;
|
||||
+ print( OUT $cfg) || die;
|
||||
+ close( OUT);
|
||||
+}
|
||||
+
|
||||
+# copy out kernel and initrd
|
||||
+my $defimage = "/boot/image";
|
||||
+my $definitrd = "/boot/initrd";
|
||||
+my $ziplimage = "$zipldir/image";
|
||||
+my $ziplinitrd = "$zipldir/initrd";
|
||||
+my $Image = "$defimage";
|
||||
+
|
||||
+if ( ! $running && ! $force ) {
|
||||
+ chomp( $running = qx{uname -r});
|
||||
+ Info( 1, "preferred kernel: '$running'\n");
|
||||
+ $Image .= "-$running";
|
||||
+}
|
||||
+if ( ! -r $Image ) {
|
||||
+ $Image = $defimage;
|
||||
+}
|
||||
+Panic( 1, "$C: kernel '$Image' not readable!?\n") unless (-r $Image);
|
||||
+
|
||||
+if ( -l $Image ) {
|
||||
+ $Image = readlink( $Image);
|
||||
+}
|
||||
+my ($image, $version) = ($Image =~ m{^(?:/boot/)?([^-]+-(.+))$});
|
||||
+my $initrd = "initrd-$version";
|
||||
+
|
||||
+if ( !defined($image) || !defined($version) || ! -r "/boot/$image" ) {
|
||||
+ Panic( 1, "$C: weird $Image. This should never happen!\n");
|
||||
+}
|
||||
+
|
||||
+if ( ! -r $ziplimage || ! -r $ziplinitrd || $refresh ) {
|
||||
+ BootCopy( $image, $zipldir, "image");
|
||||
+ BootCopy( $initrd, $zipldir, "initrd") if (-r "/boot/$initrd");
|
||||
+}
|
||||
+if ( ! ChkInitrd( $zipldir, "initrd")) {
|
||||
+ MkInitrd( $initrd, $zipldir, $version);
|
||||
+}
|
||||
+if ( ! ChkInitrd( $zipldir, "initrd")) {
|
||||
+ Info( 0, "$C: dracut does not work as expected! Help needed!\n");
|
||||
+ $miss++;
|
||||
+}
|
||||
+
|
||||
+# now: go for it!
|
||||
+my @C = ( "/sbin/zipl", (($verbose) ? "-Vnc" : "-nc"), "$ziplconf" );
|
||||
+System( @C);
|
||||
+exit( $miss);
|
||||
+
|
128
grub2-s390x-05-grub2-mkconfig.patch
Normal file
128
grub2-s390x-05-grub2-mkconfig.patch
Normal file
@ -0,0 +1,128 @@
|
||||
From: Raymund Will <rw@suse.com>
|
||||
Subject: Enable grub2-mkconfig for s390x-emu
|
||||
References: fate#314213
|
||||
Patch-Mainline: no
|
||||
|
||||
---
|
||||
util/grub.d/10_linux.in | 59 ++++++++++++++++++++++++++++++++++++++----------
|
||||
1 file changed, 47 insertions(+), 12 deletions(-)
|
||||
|
||||
--- a/util/grub.d/10_linux.in
|
||||
+++ b/util/grub.d/10_linux.in
|
||||
@@ -67,6 +67,21 @@ esac
|
||||
|
||||
title_correction_code=
|
||||
|
||||
+hotkey=1
|
||||
+incr_hotkey()
|
||||
+{
|
||||
+ [ -z "$hotkey" ] && return
|
||||
+ expr $hotkey + 1
|
||||
+}
|
||||
+print_hotkey()
|
||||
+{
|
||||
+ keys="123456789abdfgijklmnoprstuvwyz"
|
||||
+ if [ -z "$hotkey" ]||[ $hotkey -eq 0 ]||[ $hotkey -gt 30 ]; then
|
||||
+ return
|
||||
+ fi
|
||||
+ echo "--hotkey=$(expr substr $keys $hotkey 1)"
|
||||
+}
|
||||
+
|
||||
linux_entry ()
|
||||
{
|
||||
os="$1"
|
||||
@@ -90,9 +105,11 @@ linux_entry ()
|
||||
title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;"
|
||||
grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "gnulinux-advanced-$boot_device_id>gnulinux-$version-$type-$boot_device_id")"
|
||||
fi
|
||||
- echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
|
||||
+ echo "menuentry '$(echo "$title" | grub_quote)' $(print_hotkey) ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
|
||||
+ hotkey=$(incr_hotkey)
|
||||
else
|
||||
- echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
|
||||
+ echo "menuentry '$(echo "$os" | grub_quote)' $(print_hotkey) ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
|
||||
+ hotkey=$(incr_hotkey)
|
||||
fi
|
||||
if [ x$type != xrecovery ] ; then
|
||||
save_default_entry | grub_add_tab
|
||||
@@ -115,6 +132,7 @@ linux_entry ()
|
||||
|
||||
echo " insmod gzio" | sed "s/^/$submenu_indentation/"
|
||||
|
||||
+ if [ $PLATFORM != emu ]; then # 'search' does not work for now
|
||||
if [ x$dirname = x/ ]; then
|
||||
if [ -z "${prepare_root_cache}" ]; then
|
||||
prepare_root_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE} | grub_add_tab)"
|
||||
@@ -126,6 +144,7 @@ linux_entry ()
|
||||
fi
|
||||
printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/"
|
||||
fi
|
||||
+ fi
|
||||
message="$(gettext_printf "Loading Linux %s ..." ${version})"
|
||||
if [ -d /sys/firmware/efi ] && [ "x${GRUB_USE_LINUXEFI}" = "xtrue" ]; then
|
||||
sed "s/^/$submenu_indentation/" << EOF
|
||||
@@ -159,16 +178,17 @@ EOF
|
||||
}
|
||||
|
||||
machine=`uname -m`
|
||||
-case "x$machine" in
|
||||
- xi?86 | xx86_64)
|
||||
- list=`for i in /boot/vmlinuz-* /vmlinuz-* /boot/kernel-* ; do
|
||||
- if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
|
||||
- done` ;;
|
||||
- *)
|
||||
- list=`for i in /boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* /boot/kernel-* ; do
|
||||
- if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
|
||||
- done` ;;
|
||||
+case "$machine" in
|
||||
+ i?86 | x86_64) klist="/boot/vmlinuz-* /vmlinuz-* /boot/kernel-*" ;;
|
||||
+ s390 | s390x) klist="/boot/image-* /boot/kernel-*" ;;
|
||||
+ *) klist="/boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* \
|
||||
+ /boot/kernel-*" ;;
|
||||
esac
|
||||
+list=`for i in $klist; do
|
||||
+ if grub_file_is_not_garbage "$i" ; then
|
||||
+ echo -n "$i " ;
|
||||
+ fi
|
||||
+ done`
|
||||
|
||||
case "$machine" in
|
||||
i?86) GENKERNEL_ARCH="x86" ;;
|
||||
@@ -178,6 +198,15 @@ case "$machine" in
|
||||
*) GENKERNEL_ARCH="$machine" ;;
|
||||
esac
|
||||
|
||||
+PLATFORM="native"
|
||||
+if [ -d /sys/firmware/efi ]&&[ "x${GRUB_USE_LINUXEFI}" = "xtrue" ]; then
|
||||
+ PLATFORM="efi"
|
||||
+else
|
||||
+ case "$machine" in
|
||||
+ s390*) PLATFORM="emu" ;;
|
||||
+ esac
|
||||
+fi
|
||||
+
|
||||
prepare_boot_cache=
|
||||
prepare_root_cache=
|
||||
boot_device_id=
|
||||
@@ -194,6 +223,11 @@ while [ "x$list" != "x" ] ; do
|
||||
basename=`basename $linux`
|
||||
dirname=`dirname $linux`
|
||||
rel_dirname=`make_system_path_relative_to_its_root $dirname`
|
||||
+ if [ $PLATFORM != "emu" ]; then
|
||||
+ hotkey=0
|
||||
+ else
|
||||
+ rel_dirname=$dirname
|
||||
+ fi
|
||||
version=`echo $basename | sed -e "s,^[^0-9]*-,,g"`
|
||||
alt_version=`echo $version | sed -e "s,\.old$,,g"`
|
||||
linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"
|
||||
@@ -278,7 +312,8 @@ while [ "x$list" != "x" ] ; do
|
||||
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
|
||||
fi
|
||||
# TRANSLATORS: %s is replaced with an OS name
|
||||
- echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {"
|
||||
+ echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' $(print_hotkey) \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {"
|
||||
+ hotkey=$(incr_hotkey)
|
||||
is_top_level=false
|
||||
fi
|
||||
|
@ -18,32 +18,76 @@ set -e
|
||||
|
||||
grub_mkconfig="/usr/sbin/grub2-mkconfig"
|
||||
grub_mkrelpath="/usr/bin/grub2-mkrelpath"
|
||||
grub_script_check="/usr/bin/grub2-script-check"
|
||||
grub_setting="/etc/default/grub"
|
||||
grub_cfg="/boot/grub2/grub.cfg"
|
||||
grub_snapshot_cfg="/boot/grub2/snapshot_submenu.cfg"
|
||||
|
||||
snapper_snapshot_path="/.snapshots"
|
||||
snapshot_submenu_name="snapshot_submenu.cfg"
|
||||
snapshot_menuentry_name="snapshot_menuentry.cfg"
|
||||
snapshot_menuentry_cfg="boot/grub2/${snapshot_menuentry_name}"
|
||||
snapper_snapshots_cfg="${snapper_snapshot_path}/snapshot_submenu.cfg"
|
||||
|
||||
rel_root=`"$grub_mkrelpath" /`
|
||||
case x"`uname -m`" in
|
||||
x"powerpc"* | x"ppc"*)
|
||||
target="powerpc-ieee1275";;
|
||||
x"sparc"*)
|
||||
target="sparc64-ieee1275";;
|
||||
x"mips"*"el")
|
||||
target="mipsel-loongson";;
|
||||
x"mips"*)
|
||||
target="mips-arc";;
|
||||
x"ia64"*)
|
||||
target="ia64-efi";;
|
||||
x"x86_64"* | x"amd64"*)
|
||||
modprobe -q efivars 2>/dev/null || true
|
||||
if [ -d /sys/firmware/efi ]; then
|
||||
target="x86_64-efi"
|
||||
else
|
||||
target=i386-pc
|
||||
fi
|
||||
;;
|
||||
x"i"?"86"*)
|
||||
modprobe -q efivars 2>/dev/null || true
|
||||
if [ -d /sys/firmware/efi ]; then
|
||||
target="i386-efi"
|
||||
elif [ -e /proc/device-tree ]; then
|
||||
target=i386-pc
|
||||
for x in /proc/device-tree/*; do
|
||||
if [ -e "$x" ]; then
|
||||
target="i386-ieee1275"
|
||||
fi
|
||||
done
|
||||
else
|
||||
target=i386-pc
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
target=""
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ "x${target}" != "xi386-pc" ] &&
|
||||
[ "x${target}" != "xx86_64-efi" ] &&
|
||||
[ "x${target}" != "xi386-efi" ]; then
|
||||
exit 0;
|
||||
fi
|
||||
|
||||
snapshot_submenu_refresh () {
|
||||
|
||||
for s_dir in /.snapshots/*; do
|
||||
for s_dir in ${snapper_snapshot_path}/*; do
|
||||
|
||||
snapshot="${s_dir}/snapshot"
|
||||
snapper_cfg="${s_dir}/${snapshot_submenu_name}"
|
||||
num="`basename $s_dir`"
|
||||
|
||||
if [ ! -d "$snapshot" ]; then
|
||||
rm -f "${snapper_cfg}"
|
||||
rm -f "${s_dir}/${snapshot_menuentry_name}"
|
||||
rmdir "$s_dir" 2>/dev/null || true
|
||||
continue
|
||||
fi
|
||||
|
||||
# bnc#864842 Important snapshots are not marked as such in grub2 menu
|
||||
# the format is "important distribution version (kernel_version, timestamp, pre/post)"
|
||||
cfgs="${s_dir}/${snapshot_menuentry_name} ${snapshot}/${snapshot_menuentry_cfg}"
|
||||
date=`xmllint --xpath '/snapshot/date/text()' "${s_dir}/info.xml" || echo ""`
|
||||
date=`echo $date | sed 's/\(.*\) \(.*\):.*/\1,\2/'`
|
||||
important=`xmllint --xpath "/snapshot/userdata[key='important']/value/text()" "${s_dir}/info.xml" || echo ""`
|
||||
@ -60,25 +104,21 @@ for s_dir in /.snapshots/*; do
|
||||
fi
|
||||
|
||||
cat <<EOF > "${snapper_cfg}.new"
|
||||
|
||||
for x in $cfgs; do
|
||||
snap="${rel_root}${snapshot}"
|
||||
snap_cfg="${rel_root}\$x"
|
||||
|
||||
if [ -f "\$snap_cfg" ]; then
|
||||
snapshot_found=true
|
||||
submenu "$title" "\$snap" "\$snap_cfg" {
|
||||
set subvol="\$2"
|
||||
export subvol
|
||||
source "\$3"
|
||||
}
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ -f "${snapper_snapshot_path}/$num/snapshot/boot/grub2/grub.cfg" ]; then
|
||||
snapshot_found=true
|
||||
saved_subvol=\$btrfs_subvol
|
||||
menuentry "$title" "${snapper_snapshot_path}/$num/snapshot" "`$grub_mkrelpath ${snapper_snapshot_path}/${num}/snapshot`" {
|
||||
btrfs_subvol="\$2"
|
||||
extra_cmdline="rootflags=subvol=\$3"
|
||||
configfile /boot/grub2/grub.cfg
|
||||
btrfs_subvol=\$saved_subvol
|
||||
}
|
||||
fi
|
||||
|
||||
EOF
|
||||
|
||||
if grub2-script-check "${snapper_cfg}.new"; then
|
||||
if ${grub_script_check} "${snapper_cfg}.new"; then
|
||||
mv -f "${snapper_cfg}.new" "${snapper_cfg}"
|
||||
fi
|
||||
|
||||
@ -86,49 +126,65 @@ done
|
||||
|
||||
}
|
||||
|
||||
grub_snapshot_cfg_refresh () {
|
||||
snapper_snapshots_cfg_refresh () {
|
||||
|
||||
: > "${grub_snapshot_cfg}.tmp"
|
||||
for s_dir in /.snapshots/*; do
|
||||
|
||||
snapshot="${s_dir}/snapshot"
|
||||
snapper_cfg="${s_dir}/${snapshot_submenu_name}"
|
||||
|
||||
if [ -f "${snapper_cfg}" ]; then
|
||||
echo "source ${rel_root}${snapper_cfg}" >>"${grub_snapshot_cfg}.tmp"
|
||||
continue
|
||||
if [ ! -d "$snapper_snapshot_path" ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
done
|
||||
for s_dir in ${snapper_snapshot_path}/*; do
|
||||
|
||||
cat <<EOF >"${grub_snapshot_cfg}.new"
|
||||
snapshot="${s_dir}/snapshot"
|
||||
snapper_cfg="${s_dir}/${snapshot_submenu_name}"
|
||||
|
||||
if [ -f "${snapper_cfg}" ]; then
|
||||
cs="${s_dir}\n${cs}"
|
||||
continue
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
for c in `echo -e "${cs}" | sort -V`; do
|
||||
snapshot_cfg="\
|
||||
if [ -f "$c/snapshot_submenu.cfg" ]; then
|
||||
source "$c/snapshot_submenu.cfg"
|
||||
fi
|
||||
${snapshot_cfg}"
|
||||
done
|
||||
|
||||
cat <<EOF >"${snapper_snapshots_cfg}.new"
|
||||
submenu "Bootable snapshots" {
|
||||
`sort -V "${grub_snapshot_cfg}.tmp"`
|
||||
${snapshot_cfg}
|
||||
if [ x\$snapshot_found != xtrue ]; then
|
||||
submenu "Not Found" {true}
|
||||
fi
|
||||
}
|
||||
EOF
|
||||
|
||||
if grub2-script-check "${grub_snapshot_cfg}.new"; then
|
||||
mv -f "${grub_snapshot_cfg}.new" "${grub_snapshot_cfg}"
|
||||
fi
|
||||
if ${grub_script_check} "${snapper_snapshots_cfg}.new"; then
|
||||
mv -f "${snapper_snapshots_cfg}.new" "${snapper_snapshots_cfg}"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
|
||||
snapshot_submenu_clean () {
|
||||
|
||||
for s_dir in /.snapshots/*; do
|
||||
for s_dir in ${snapper_snapshot_path}/*; do
|
||||
|
||||
snapshot="${s_dir}/snapshot"
|
||||
snapper_cfg="${s_dir}/${snapshot_submenu_name}"
|
||||
|
||||
if [ -f "$snapper_cfg" ]; then
|
||||
rm -f "$snapper_cfg"
|
||||
rmdir "$s_dir" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
if [ -f "${snapper_snapshot_path}/${snapshot_submenu_name}" ]; then
|
||||
rm -f "${snapper_snapshot_path}/${snapshot_submenu_name}"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
set_grub_setting () {
|
||||
@ -137,15 +193,22 @@ set_grub_setting () {
|
||||
val=$2
|
||||
|
||||
if grep -q "$name" "$grub_setting"; then
|
||||
sed -i -e "s/.*\($name\)=.*/\1=$val/" "$grub_setting"
|
||||
sed -i -e "s!.*\($name\)=.*!\1=\"$val\"!" "$grub_setting"
|
||||
else
|
||||
echo "$name=$val" >> "$grub_setting"
|
||||
echo "$name=\"$val\"" >> "$grub_setting"
|
||||
fi
|
||||
}
|
||||
|
||||
update_grub_cfg () {
|
||||
enable_grub_settings () {
|
||||
set_grub_setting SUSE_BTRFS_SNAPSHOT_BOOTING "true"
|
||||
}
|
||||
|
||||
"$grub_mkconfig" -o "$grub_cfg"
|
||||
disable_grub_settings () {
|
||||
set_grub_setting SUSE_BTRFS_SNAPSHOT_BOOTING "false"
|
||||
}
|
||||
|
||||
update_grub () {
|
||||
"${grub_mkconfig}" -o "${grub_cfg}"
|
||||
}
|
||||
|
||||
# Check the arguments.
|
||||
@ -173,32 +236,22 @@ do
|
||||
done
|
||||
|
||||
if [ "x${opt_enable}" = "xtrue" ]; then
|
||||
|
||||
set_grub_setting SUSE_DISABLE_BOOTING_SNAPSHOT false
|
||||
set_grub_setting SUSE_ENABLE_CUSTOM_SNAPSHOT_SUBMENU true
|
||||
update_grub_cfg
|
||||
#enable_grub_settings
|
||||
#update_grub
|
||||
snapshot_submenu_refresh
|
||||
grub_snapshot_cfg_refresh
|
||||
|
||||
snapper_snapshots_cfg_refresh
|
||||
elif [ "x${opt_enable}" = "xfalse" ]; then
|
||||
|
||||
#disable_grub_settings
|
||||
update_grub
|
||||
snapshot_submenu_clean
|
||||
set_grub_setting SUSE_DISABLE_BOOTING_SNAPSHOT true
|
||||
set_grub_setting SUSE_ENABLE_CUSTOM_SNAPSHOT_SUBMENU false
|
||||
update_grub_cfg
|
||||
|
||||
fi
|
||||
|
||||
if [ x${opt_refresh} = "xtrue" ]; then
|
||||
|
||||
snapshot_submenu_refresh
|
||||
grub_snapshot_cfg_refresh
|
||||
|
||||
snapper_snapshots_cfg_refresh
|
||||
fi
|
||||
|
||||
if [ x${opt_clean} = "xtrue" ]; then
|
||||
|
||||
snapshot_submenu_clean
|
||||
grub_snapshot_cfg_refresh
|
||||
|
||||
fi
|
||||
|
||||
|
307
grub2.changes
307
grub2.changes
@ -1,3 +1,304 @@
|
||||
-------------------------------------------------------------------
|
||||
Mon Mar 31 10:48:39 UTC 2014 - mchang@suse.com
|
||||
|
||||
- snapper rollback support (fate#317062)
|
||||
* add btrfs_follow_default.patch
|
||||
* add suse_btrfs_grub2_install.sh
|
||||
* add 80_suse_btrfs_snapshot
|
||||
* refresh grub2-snapper-plugin.sh
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Fri Mar 28 02:38:07 UTC 2014 - mchang@suse.com
|
||||
|
||||
- add grub2-x86_64-xen subpackage (bnc#863821)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Mar 26 14:37:18 UTC 2014 - dvaleev@suse.com
|
||||
|
||||
- ieee1275: check for IBM pseries emulated machine (bnc#869964)
|
||||
|
||||
- added patches:
|
||||
* grub2-ppc64-build-ppc64-32bit.patch
|
||||
-------------------------------------------------------------------
|
||||
Wed Mar 26 12:21:55 UTC 2014 - dvaleev@suse.com
|
||||
|
||||
- Build ppc64 as 32bit
|
||||
|
||||
- added patches:
|
||||
* grub2-ppc64-build-ppc64-32bit.patch
|
||||
-------------------------------------------------------------------
|
||||
Wed Mar 26 12:03:21 UTC 2014 - dvaleev@suse.com
|
||||
|
||||
- Rename PowerPC patches so it will have architecture in it's name
|
||||
|
||||
- added patches:
|
||||
* grub2-ppc64le-01-Add-Little-Endian-support-for-Power64-to-the-build.patch
|
||||
* grub2-ppc64le-02-Build-grub-as-O1-until-we-add-savegpr-and-restgpr-ro.patch
|
||||
* grub2-ppc64le-03-disable-creation-of-vsx-and-altivec-instructions.patch
|
||||
* grub2-ppc64le-04-powerpc64-LE-s-linker-knows-how-to-handle-the-undefi.patch
|
||||
* grub2-ppc64le-05-grub-install-can-now-recognize-and-install-a-LE-grub.patch
|
||||
* grub2-ppc64le-06-set-the-ABI-version-to-0x02-in-the-e_flag-of-the-PPC.patch
|
||||
* grub2-ppc64le-07-Add-IEEE1275_ADDR-helper.patch
|
||||
* grub2-ppc64le-08-Fix-some-more-warnings-when-casting.patch
|
||||
* grub2-ppc64le-09-Add-powerpc64-types.patch
|
||||
* grub2-ppc64le-10-powerpc64-is-not-necessarily-BigEndian-anymore.patch
|
||||
* grub2-ppc64le-11-Fix-warnings-when-building-powerpc-linux-loader-64bi.patch
|
||||
* grub2-ppc64le-12-GRUB_ELF_R_PPC_-processing-is-applicable-only-for-32.patch
|
||||
* grub2-ppc64le-13-Fix-powerpc-setjmp-longjmp-64bit-issues.patch
|
||||
* grub2-ppc64le-14-Add-powerpc64-ieee1275-trampoline.patch
|
||||
* grub2-ppc64le-15-Add-64bit-support-to-powerpc-startup-code.patch
|
||||
* grub2-ppc64le-16-Add-grub_dl_find_section_addr.patch
|
||||
* grub2-ppc64le-17-Add-ppc64-relocations.patch
|
||||
* grub2-ppc64le-18-ppc64-doesn-t-need-libgcc-routines.patch
|
||||
* grub2-ppc64le-19-Use-FUNC_START-FUNC_END-for-powerpc-function-definit.patch
|
||||
* grub2-ppc64le-20-.TOC.-symbol-is-special-in-ppc64le-.-It-maps-to-the-.patch
|
||||
* grub2-ppc64le-21-the-.toc-section-in-powerpc64le-modules-are-sometime.patch
|
||||
* grub2-ppc64le-22-all-parameter-to-firmware-calls-should-to-be-BigEndi.patch
|
||||
* grub2-ppc64le-23-grub-segfaults-if-initrd-is-specified-before-specify.patch
|
||||
- removed patches:
|
||||
* 0001-Add-Little-Endian-support-for-Power64-to-the-build.patch
|
||||
* 0002-Build-grub-as-O1-until-we-add-savegpr-and-restgpr-ro.patch
|
||||
* 0003-disable-creation-of-vsx-and-altivec-instructions.patch
|
||||
* 0004-powerpc64-LE-s-linker-knows-how-to-handle-the-undefi.patch
|
||||
* 0005-grub-install-can-now-recognize-and-install-a-LE-grub.patch
|
||||
* 0006-set-the-ABI-version-to-0x02-in-the-e_flag-of-the-PPC.patch
|
||||
* 0007-Add-IEEE1275_ADDR-helper.patch
|
||||
* 0008-Fix-some-more-warnings-when-casting.patch
|
||||
* 0009-Add-powerpc64-types.patch
|
||||
* 0010-powerpc64-is-not-necessarily-BigEndian-anymore.patch
|
||||
* 0011-Fix-warnings-when-building-powerpc-linux-loader-64bi.patch
|
||||
* 0012-GRUB_ELF_R_PPC_-processing-is-applicable-only-for-32.patch
|
||||
* 0013-Fix-powerpc-setjmp-longjmp-64bit-issues.patch
|
||||
* 0014-Add-powerpc64-ieee1275-trampoline.patch
|
||||
* 0015-Add-64bit-support-to-powerpc-startup-code.patch
|
||||
* 0016-Add-grub_dl_find_section_addr.patch
|
||||
* 0017-Add-ppc64-relocations.patch
|
||||
* 0018-ppc64-doesn-t-need-libgcc-routines.patch
|
||||
* 0019-Use-FUNC_START-FUNC_END-for-powerpc-function-definit.patch
|
||||
* 0020-.TOC.-symbol-is-special-in-ppc64le-.-It-maps-to-the-.patch
|
||||
* 0020-all-parameter-to-firmware-calls-should-to-be-BigEndi.patch
|
||||
* 0021-the-.toc-section-in-powerpc64le-modules-are-sometime.patch
|
||||
* 0022-all-parameter-to-firmware-calls-should-to-be-BigEndi.patch
|
||||
* 0023-grub-segfaults-if-initrd-is-specified-before-specify.patch
|
||||
-------------------------------------------------------------------
|
||||
Wed Mar 26 11:51:42 UTC 2014 - dvaleev@suse.com
|
||||
|
||||
- Require powerpc-utils for grub2-powerpc-ieee1275 package
|
||||
(grub2-install calls nvram from it)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Mar 18 21:10:59 UTC 2014 - rw@suse.de
|
||||
|
||||
- grub2-s390x-03-output-7-bit-ascii.patch:
|
||||
* first usable interface on 3215 from initrd. [bnc#867258]
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Mar 18 06:01:46 UTC 2014 - rw@suse.de
|
||||
|
||||
- reflect s390x-specifics in '/etc/default/grub'. [fate#314213]
|
||||
- grub2-s390x-02-kexec-module-added-to-emu.patch:
|
||||
* boot-attempts are final, except if 'kexec -l' fails.
|
||||
* try to restore terminal on exit (via grub_reboot()).
|
||||
- grub2-s390x-03-output-7-bit-ascii.patch:
|
||||
* use less CPU cycles waiting for user. [bnc#868650]
|
||||
* first usable interface on 3215. [bnc#867258]
|
||||
* strip newlines on input for 3270 and 3215.
|
||||
- grub2-s390x-04-grub2-install.patch:
|
||||
* append 'quiet splash=silent' for 'initgrub'-boot.
|
||||
* properly check for dracut script during 'grub2-install'.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Mar 5 20:44:56 UTC 2014 - rw@suse.com
|
||||
|
||||
- grub2-s390x-04-grub2-install.patch:
|
||||
* refresh initrd by default, prefer running kernel and
|
||||
re-zipl despite minor issues. [bnc#866867, fate#314213]
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Mar 4 22:35:25 UTC 2014 - rw@suse.com
|
||||
|
||||
- grub2-s390x-03-output-7-bit-ascii.patch:
|
||||
* force terminfo to ASCII.
|
||||
- grub2-s390x-04-grub2-install.patch:
|
||||
* try harder to find root filesystem (incl. subvol-handling)
|
||||
* read /etc/sysconfig/bootloader as final fallback
|
||||
- grub2-s390x-05-grub2-mkconfig.patch:
|
||||
* omit subvolume-prefix for platform "emu"
|
||||
- refresh 0001-script-provide-overridable-root-by-subvol.patch.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Mar 3 11:41:56 UTC 2014 - rw@suse.com
|
||||
|
||||
- build grub2-emu for s390 non-static, with device-mapper support,
|
||||
but without grub2-mount and start to move arch-specific parts
|
||||
to appropriate sub-packages. [fate#314213]
|
||||
- grub2-s390x-02-kexec-module-added-to-emu.patch:
|
||||
* introduce '--kexec/-X' to grub2-emu command-line to prevent
|
||||
inadvertent system interruption.
|
||||
* first give 'systemctl kexec' a chance on '-X' and
|
||||
fall back to 'kexec -e' only '-X' is present twice.
|
||||
- disable grub2-s390x-03-output-7-bit-ascii.patch for now.
|
||||
- grub2-s390x-04-grub2-install.patch:
|
||||
* add 's390x-emu' platform-support to grub2-install.
|
||||
* provide all parts to zIPL into a grub2-emu shell,
|
||||
including 'zipl.conf'-generator and 'dracut'-scriptlets.
|
||||
- grub2-s390x-05-grub2-mkconfig.patch:
|
||||
* allow 's390x' "image"-files to '10_linux' kernel enumeration.
|
||||
- refresh 0001-script-provide-overridable-root-by-subvol.patch to
|
||||
resolve conflict in util/grub.d/10_linux.in.
|
||||
- refresh powerpc64le-as-powerpc.patch to resolve conflict
|
||||
in configure.ac.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Mar 3 11:40:21 UTC 2014 - dvaleev@suse.com
|
||||
|
||||
- Refresh PowerLE patches
|
||||
|
||||
- added patches:
|
||||
* 0001-Add-Little-Endian-support-for-Power64-to-the-build.patch
|
||||
* 0003-disable-creation-of-vsx-and-altivec-instructions.patch
|
||||
* 0004-powerpc64-LE-s-linker-knows-how-to-handle-the-undefi.patch
|
||||
* 0005-grub-install-can-now-recognize-and-install-a-LE-grub.patch
|
||||
* 0006-set-the-ABI-version-to-0x02-in-the-e_flag-of-the-PPC.patch
|
||||
* 0007-Add-IEEE1275_ADDR-helper.patch
|
||||
* 0008-Fix-some-more-warnings-when-casting.patch
|
||||
* 0009-Add-powerpc64-types.patch
|
||||
* 0010-powerpc64-is-not-necessarily-BigEndian-anymore.patch
|
||||
* 0011-Fix-warnings-when-building-powerpc-linux-loader-64bi.patch
|
||||
* 0012-GRUB_ELF_R_PPC_-processing-is-applicable-only-for-32.patch
|
||||
* 0013-Fix-powerpc-setjmp-longjmp-64bit-issues.patch
|
||||
* 0014-Add-powerpc64-ieee1275-trampoline.patch
|
||||
* 0015-Add-64bit-support-to-powerpc-startup-code.patch
|
||||
* 0016-Add-grub_dl_find_section_addr.patch
|
||||
* 0017-Add-ppc64-relocations.patch
|
||||
* 0018-ppc64-doesn-t-need-libgcc-routines.patch
|
||||
* 0019-Use-FUNC_START-FUNC_END-for-powerpc-function-definit.patch
|
||||
* 0020-.TOC.-symbol-is-special-in-ppc64le-.-It-maps-to-the-.patch
|
||||
* 0021-the-.toc-section-in-powerpc64le-modules-are-sometime.patch
|
||||
* 0022-all-parameter-to-firmware-calls-should-to-be-BigEndi.patch
|
||||
* 0023-grub-segfaults-if-initrd-is-specified-before-specify.patch
|
||||
- removed patches:
|
||||
* 0001-Add-a-new-architecture-to-the-build-process.patch
|
||||
* 0003-powerpc64-LE-s-linker-knows-how-to-handle-the-undefi.patch
|
||||
* 0004-grub-install-can-now-recognize-and-install-a-LE-grub.patch
|
||||
* 0005-set-the-ABI-version-to-0x02-in-the-e_flag-of-the-PPC.patch
|
||||
* 0006-Add-IEEE1275_ADDR-helper.patch
|
||||
* 0007-Fix-some-more-warnings-when-casting.patch
|
||||
* 0008-Add-powerpc64-types.patch
|
||||
* 0009-Fix-warnings-when-building-powerpc-linux-loader-64bi.patch
|
||||
* 0010-GRUB_ELF_R_PPC_-processing-is-applicable-only-for-32.patch
|
||||
* 0011-Fix-powerpc-setjmp-longjmp-64bit-issues.patch
|
||||
* 0012-Add-powerpc64-ieee1275-trampoline.patch
|
||||
* 0013-Add-64bit-support-to-powerpc-startup-code.patch
|
||||
* 0014-Add-grub_dl_find_section_addr.patch
|
||||
* 0015-Add-ppc64-relocations.patch
|
||||
* 0016-ppc64-doesn-t-need-libgcc-routines.patch
|
||||
* 0017-Use-FUNC_START-FUNC_END-for-powerpc-function-definit.patch
|
||||
* 0018-.TOC.-symbol-is-special-in-ppc64le-.-It-maps-to-the-.patch
|
||||
* 0019-the-.toc-section-in-powerpc64le-modules-are-sometime.patch
|
||||
* 0021-powerpc64-is-not-necessarily-BigEndian-anymore.patch
|
||||
* 0022-grub-segfaults-if-initrd-is-specified-before-specify.patch
|
||||
* 0023-Power7-cannot-handle-VSX-instructions-correctly.-It-.patch
|
||||
* powerpc-novsx-noaltivec.patch
|
||||
* powerpc64le-as-powerpc.patch
|
||||
- modified patches:
|
||||
* 0002-Build-grub-as-O1-until-we-add-savegpr-and-restgpr-ro.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Fri Feb 28 01:14:10 UTC 2014 - dvaleev@suse.com
|
||||
|
||||
- build with -mno-vsx and -mno-altivec on powerpc
|
||||
|
||||
- added patches:
|
||||
* powerpc-novsx-noaltivec.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Feb 27 10:42:25 UTC 2014 - dvaleev@suse.com
|
||||
|
||||
- The following patches enable grub to support
|
||||
64bit Little Endian Power architecture. (bnc#865913)
|
||||
|
||||
Anton Blanchard (12):
|
||||
Add IEEE1275_ADDR helper
|
||||
Fix some more warnings when casting.
|
||||
Add powerpc64 types
|
||||
Fix warnings when building powerpc linux loader 64bit
|
||||
Fix powerpc setjmp/longjmp 64bit issues
|
||||
Add powerpc64 ieee1275 trampoline
|
||||
Add 64bit support to powerpc startup code
|
||||
Add grub_dl_find_section_addr
|
||||
Add ppc64 relocations
|
||||
ppc64 doesn't need libgcc routines
|
||||
Use FUNC_START/FUNC_END for powerpc function definitions
|
||||
powerpc64 is not necessarily BigEndian anymore! :)
|
||||
|
||||
Ram Pai (11):
|
||||
Add a new architecture to the build process
|
||||
Build grub as O1 until we add savegpr and restgpr routines
|
||||
powerpc64 LE's linker knows how to handle the undefined symbol .TOC.
|
||||
in grub modules. So just ignore that symbol during build.
|
||||
grub-install can now recognize and install a LE grub boot loader
|
||||
set the ABI version to 0x02 in the e_flag of the PPC64LE ELF image.
|
||||
GRUB_ELF_R_PPC_* processing is applicable only for 32 bit bootloader.
|
||||
.TOC. symbol is special in ppc64le . It maps to the address of the
|
||||
.toc section.
|
||||
the .toc section in powerpc64le modules are sometimes not aligned on a
|
||||
four byte boundary. This fails the module linker especially when
|
||||
processing R_PPC64_TOC16_LO_DS, since the addresses are expected
|
||||
to be aligned on 4byte boundary.
|
||||
all parameter to firmware calls should to be BigEndian and the results
|
||||
should be CPU endian.
|
||||
grub segfaults if initrd is specified before specifying the kernel.
|
||||
The problem is the initrd module sees that kernel is not specified
|
||||
and takes the fail path. In the fail path it checks if anything
|
||||
has be malloc'ed. Unfortunately the variable that it looks to
|
||||
check for is a uninitialized stack variable. The stack variable
|
||||
can incorrectly indicate something is malloced, which leads the
|
||||
module to free some unallocated memory. This patch fixes the
|
||||
problem by initializing the stack variable.
|
||||
Power7 cannot handle VSX instructions correctly. It segfaults.
|
||||
This patch is applicable only for power7 systems.
|
||||
|
||||
Thomas Falcon (1):
|
||||
Add a new architecture to the build process
|
||||
|
||||
Tomohiro B Berry (1):
|
||||
Add a new architecture to the build process
|
||||
|
||||
- added patches:
|
||||
* 0001-Add-a-new-architecture-to-the-build-process.patch
|
||||
* 0002-Build-grub-as-O1-until-we-add-savegpr-and-restgpr-ro.patch
|
||||
* 0003-powerpc64-LE-s-linker-knows-how-to-handle-the-undefi.patch
|
||||
* 0004-grub-install-can-now-recognize-and-install-a-LE-grub.patch
|
||||
* 0005-set-the-ABI-version-to-0x02-in-the-e_flag-of-the-PPC.patch
|
||||
* 0006-Add-IEEE1275_ADDR-helper.patch
|
||||
* 0007-Fix-some-more-warnings-when-casting.patch
|
||||
* 0008-Add-powerpc64-types.patch
|
||||
* 0009-Fix-warnings-when-building-powerpc-linux-loader-64bi.patch
|
||||
* 0010-GRUB_ELF_R_PPC_-processing-is-applicable-only-for-32.patch
|
||||
* 0011-Fix-powerpc-setjmp-longjmp-64bit-issues.patch
|
||||
* 0012-Add-powerpc64-ieee1275-trampoline.patch
|
||||
* 0013-Add-64bit-support-to-powerpc-startup-code.patch
|
||||
* 0014-Add-grub_dl_find_section_addr.patch
|
||||
* 0015-Add-ppc64-relocations.patch
|
||||
* 0016-ppc64-doesn-t-need-libgcc-routines.patch
|
||||
* 0017-Use-FUNC_START-FUNC_END-for-powerpc-function-definit.patch
|
||||
* 0018-.TOC.-symbol-is-special-in-ppc64le-.-It-maps-to-the-.patch
|
||||
* 0019-the-.toc-section-in-powerpc64le-modules-are-sometime.patch
|
||||
* 0020-all-parameter-to-firmware-calls-should-to-be-BigEndi.patch
|
||||
* 0021-powerpc64-is-not-necessarily-BigEndian-anymore.patch
|
||||
* 0022-grub-segfaults-if-initrd-is-specified-before-specify.patch
|
||||
* 0023-Power7-cannot-handle-VSX-instructions-correctly.-It-.patch
|
||||
- removed patches:
|
||||
* grub2-powerpc-libgcc.patch
|
||||
* grub2-ppc64le-core-bigendian.patch
|
||||
* grub2-ppc64le-platform.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Feb 27 09:26:49 UTC 2014 - jjolly@suse.com
|
||||
|
||||
- kexec performed as linux/initrd/boot under emu environment
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Feb 27 04:30:07 UTC 2014 - mchang@suse.com
|
||||
|
||||
@ -6,6 +307,12 @@ Thu Feb 27 04:30:07 UTC 2014 - mchang@suse.com
|
||||
"important distribution version (kernel_version, timestamp, pre/post)"
|
||||
(bnc#864842)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Feb 25 06:41:41 UTC 2014 - jjolly@suse.com
|
||||
|
||||
- Fixed output on s390 3270 terminal. Strictly serial on s390 now
|
||||
- kexec command added for emu platform
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Feb 24 07:28:42 UTC 2014 - mchang@suse.com
|
||||
|
||||
|
@ -1,10 +1,10 @@
|
||||
addFilter("zero-length /boot/grub2/grub.cfg")
|
||||
addFilter("zero-length /boot/grub2-efi/grub.cfg")
|
||||
addFilter("non-etc-or-var-file-marked-as-conffile /boot/grub2/grub.cfg")
|
||||
addFilter("non-etc-or-var-file-marked-as-conffile /boot/grub2-efi/grub.cfg")
|
||||
addFilter("non-conffile-in-etc /etc/bash_completion.d/grub")
|
||||
addFilter("non-conffile-in-etc /etc/grub.d/README")
|
||||
addFilter("statically-linked-binary .*/grub2/i386-pc/kernel.img")
|
||||
addFilter("statically-linked-binary .*/grub2/*/kernel.img")
|
||||
addFilter("patch-not-applied")
|
||||
# We need to supply unstripped files for grub
|
||||
addFilter("unstripped-binary-or-object .*/grub2/i386-pc/.*.mod")
|
||||
addFilter("unstripped-binary-or-object .*/grub2-efi/.*/.*.mod")
|
||||
addFilter("unstripped-binary-or-object .*/grub2/*/.*.mod")
|
||||
# TODO: s390 Experts: is this sensible?!
|
||||
addFilter("s390x: W: executable-stack")
|
||||
|
272
grub2.spec
272
grub2.spec
@ -26,9 +26,6 @@ BuildRequires: glibc-devel-32bit
|
||||
%else
|
||||
BuildRequires: gcc
|
||||
BuildRequires: glibc-devel
|
||||
%ifarch s390x
|
||||
BuildRequires: glibc-static
|
||||
%endif
|
||||
%endif
|
||||
BuildRequires: automake
|
||||
BuildRequires: bison
|
||||
@ -55,6 +52,7 @@ BuildRequires: xz-devel
|
||||
BuildRequires: openssl >= 0.9.8
|
||||
BuildRequires: pesign-obs-integration
|
||||
%endif
|
||||
BuildRequires: xen-devel
|
||||
%endif
|
||||
|
||||
# Modules code is dynamically loaded and collected from a _fixed_ path.
|
||||
@ -114,6 +112,8 @@ Source7: 20_memtest86+
|
||||
Source10: openSUSE-UEFI-CA-Certificate.crt
|
||||
Source11: SLES-UEFI-CA-Certificate.crt
|
||||
Source12: grub2-snapper-plugin.sh
|
||||
Source13: suse_btrfs_grub2_install.sh
|
||||
Source14: 80_suse_btrfs_snapshot
|
||||
Source1000: PATCH_POLICY
|
||||
Patch1: rename-grub-info-file-to-grub2.patch
|
||||
Patch2: grub2-linux.patch
|
||||
@ -138,19 +138,50 @@ Patch35: grub2-linguas.sh-no-rsync.patch
|
||||
Patch36: 0001-look-for-DejaVu-also-in-usr-share-fonts-truetype.patch
|
||||
Patch37: grub2-use-DejaVuSansMono-for-starfield-theme.patch
|
||||
Patch38: grub2-s390x-01-Changes-made-and-files-added-in-order-to-allow-s390x.patch
|
||||
Patch39: grub2-s390x-02-kexec-module-added-to-emu.patch
|
||||
Patch40: grub2-s390x-03-output-7-bit-ascii.patch
|
||||
Patch41: grub2-s390x-04-grub2-install.patch
|
||||
Patch42: grub2-s390x-05-grub2-mkconfig.patch
|
||||
# Btrfs snapshot booting related patches
|
||||
Patch101: 0002-btrfs-add-ability-to-boot-from-subvolumes.patch
|
||||
Patch102: 0003-cmdline-add-envvar-loader_cmdline_append.patch
|
||||
Patch103: 0004-btrfs-export-subvolume-envvars.patch
|
||||
Patch104: btrfs_follow_default.patch
|
||||
Patch105: SUSE_BTRFS_SNAPSHOT_BOOTING.patch
|
||||
Patch110: 0001-script-provide-overridable-root-by-subvol.patch
|
||||
Patch111: 0002-script-create-menus-for-btrfs-snapshot.patch
|
||||
Patch200: grub2-ppc64le-platform.patch
|
||||
Patch201: grub2-powerpc-libgcc.patch
|
||||
Patch202: grub2-ppc64le-core-bigendian.patch
|
||||
# PowerPC LE support
|
||||
Patch201: grub2-ppc64le-01-Add-Little-Endian-support-for-Power64-to-the-build.patch
|
||||
Patch202: grub2-ppc64le-02-Build-grub-as-O1-until-we-add-savegpr-and-restgpr-ro.patch
|
||||
Patch203: grub2-ppc64le-03-disable-creation-of-vsx-and-altivec-instructions.patch
|
||||
Patch204: grub2-ppc64le-04-powerpc64-LE-s-linker-knows-how-to-handle-the-undefi.patch
|
||||
Patch205: grub2-ppc64le-05-grub-install-can-now-recognize-and-install-a-LE-grub.patch
|
||||
Patch206: grub2-ppc64le-06-set-the-ABI-version-to-0x02-in-the-e_flag-of-the-PPC.patch
|
||||
Patch207: grub2-ppc64le-07-Add-IEEE1275_ADDR-helper.patch
|
||||
Patch208: grub2-ppc64le-08-Fix-some-more-warnings-when-casting.patch
|
||||
Patch209: grub2-ppc64le-09-Add-powerpc64-types.patch
|
||||
Patch210: grub2-ppc64le-10-powerpc64-is-not-necessarily-BigEndian-anymore.patch
|
||||
Patch211: grub2-ppc64le-11-Fix-warnings-when-building-powerpc-linux-loader-64bi.patch
|
||||
Patch212: grub2-ppc64le-12-GRUB_ELF_R_PPC_-processing-is-applicable-only-for-32.patch
|
||||
Patch213: grub2-ppc64le-13-Fix-powerpc-setjmp-longjmp-64bit-issues.patch
|
||||
Patch214: grub2-ppc64le-14-Add-powerpc64-ieee1275-trampoline.patch
|
||||
Patch215: grub2-ppc64le-15-Add-64bit-support-to-powerpc-startup-code.patch
|
||||
Patch216: grub2-ppc64le-16-Add-grub_dl_find_section_addr.patch
|
||||
Patch217: grub2-ppc64le-17-Add-ppc64-relocations.patch
|
||||
Patch218: grub2-ppc64le-18-ppc64-doesn-t-need-libgcc-routines.patch
|
||||
Patch219: grub2-ppc64le-19-Use-FUNC_START-FUNC_END-for-powerpc-function-definit.patch
|
||||
Patch220: grub2-ppc64le-20-.TOC.-symbol-is-special-in-ppc64le-.-It-maps-to-the-.patch
|
||||
Patch221: grub2-ppc64le-21-the-.toc-section-in-powerpc64le-modules-are-sometime.patch
|
||||
Patch222: grub2-ppc64le-22-all-parameter-to-firmware-calls-should-to-be-BigEndi.patch
|
||||
Patch223: grub2-ppc64le-23-grub-segfaults-if-initrd-is-specified-before-specify.patch
|
||||
Patch224: grub2-ppc64-build-ppc64-32bit.patch
|
||||
Patch225: grub2-ppc64-qemu.patch
|
||||
Requires: gettext-runtime
|
||||
%if 0%{?suse_version} >= 1140
|
||||
%ifnarch s390x
|
||||
Requires: os-prober
|
||||
%endif
|
||||
%endif
|
||||
Requires(post): /sbin/install-info
|
||||
Requires(preun):/sbin/install-info
|
||||
%if ! 0%{?only_efi:1}
|
||||
@ -201,6 +232,9 @@ Requires: %{name} = %{version}-%{release}
|
||||
Requires(post): %{name} = %{version}-%{release}
|
||||
Requires: perl-Bootloader
|
||||
Requires(post): perl-Bootloader
|
||||
%ifarch s390x
|
||||
Requires: s390-tools
|
||||
%endif
|
||||
|
||||
%description %{grubarch}
|
||||
The GRand Unified Bootloader (GRUB) is a highly configurable and customizable
|
||||
@ -219,6 +253,9 @@ Group: System/Boot
|
||||
Requires: efibootmgr
|
||||
Requires(post): efibootmgr
|
||||
%endif
|
||||
%ifarch ppc ppc64 ppc64le
|
||||
Requires: powerpc-utils
|
||||
%endif
|
||||
Requires: %{name} = %{version}-%{release}
|
||||
Requires(post): %{name} = %{version}-%{release}
|
||||
Requires: perl-Bootloader >= 0.706
|
||||
@ -234,6 +271,23 @@ provides support for EFI systems.
|
||||
|
||||
%endif
|
||||
|
||||
%ifarch x86_64
|
||||
|
||||
%package %{_target_cpu}-xen
|
||||
|
||||
Summary: Bootloader with support for Linux, Multiboot and more
|
||||
Group: System/Boot
|
||||
Provides: %{name}-xen = %{version}-%{release}
|
||||
Obsoletes: %{name}-xen < %{version}-%{release}
|
||||
|
||||
%description %{_target_cpu}-xen
|
||||
The GRand Unified Bootloader (GRUB) is a highly configurable and customizable
|
||||
bootloader with modular architecture. It supports rich variety of kernel formats,
|
||||
file systems, computer architectures and hardware devices. This subpackage
|
||||
provides support for XEN systems.
|
||||
|
||||
%endif
|
||||
|
||||
%package snapper-plugin
|
||||
|
||||
Summary: Grub2's snapper plugin
|
||||
@ -268,7 +322,7 @@ mv po/grub.pot po/%{name}.pot
|
||||
# we could enable it when
|
||||
# 1 we have background with better contrast to the font's color
|
||||
# 2 we confirm it's eligible to set the terminal background this way
|
||||
#%patch13 -p1
|
||||
#patch13 -p1
|
||||
%patch15 -p1
|
||||
%patch16 -p1
|
||||
%patch17 -p1
|
||||
@ -283,17 +337,42 @@ mv po/grub.pot po/%{name}.pot
|
||||
%patch36 -p1
|
||||
%patch37 -p1
|
||||
%patch38 -p1
|
||||
%patch39 -p1
|
||||
%patch40 -p1
|
||||
%patch41 -p1
|
||||
%patch42 -p1
|
||||
%patch101 -p1
|
||||
%patch102 -p1
|
||||
%patch103 -p1
|
||||
%patch110 -p1
|
||||
%patch111 -p1
|
||||
%patch200 -p1
|
||||
%patch104 -p1
|
||||
%patch105 -p1
|
||||
#%patch110 -p1
|
||||
#%patch111 -p1
|
||||
%patch201 -p1
|
||||
#We want to override endianess on Power LE only
|
||||
%ifarch ppc64le
|
||||
%patch202 -p1
|
||||
%endif
|
||||
%patch203 -p1
|
||||
%patch204 -p1
|
||||
%patch205 -p1
|
||||
%patch206 -p1
|
||||
%patch207 -p1
|
||||
%patch208 -p1
|
||||
%patch209 -p1
|
||||
%patch210 -p1
|
||||
%patch211 -p1
|
||||
%patch212 -p1
|
||||
%patch213 -p1
|
||||
%patch214 -p1
|
||||
%patch215 -p1
|
||||
%patch216 -p1
|
||||
%patch217 -p1
|
||||
%patch218 -p1
|
||||
%patch219 -p1
|
||||
%patch220 -p1
|
||||
%patch221 -p1
|
||||
%patch222 -p1
|
||||
%patch223 -p1
|
||||
%patch224 -p1
|
||||
%patch225 -p1
|
||||
|
||||
# Generate po/LINGUAS for message catalogs ...
|
||||
./linguas.sh
|
||||
@ -306,6 +385,9 @@ mkdir build
|
||||
%ifarch %{efi}
|
||||
mkdir build-efi
|
||||
%endif
|
||||
%ifarch x86_64
|
||||
mkdir build-xen
|
||||
%endif
|
||||
|
||||
%build
|
||||
# autogen calls autoreconf -vi
|
||||
@ -321,6 +403,37 @@ CXXFLAGS=" "
|
||||
FFLAGS=" "
|
||||
export CFLAGS CXXFLAGS FFLAGS
|
||||
|
||||
%ifarch x86_64
|
||||
cd build-xen
|
||||
../configure \
|
||||
TARGET_LDFLAGS=-static \
|
||||
--prefix=%{_prefix} \
|
||||
--sysconfdir=%{_sysconfdir} \
|
||||
--target=%{_target_platform} \
|
||||
--libdir=%{_libdir} \
|
||||
--with-platform=xen \
|
||||
--program-transform-name=s,grub,%{name},
|
||||
make %{?_smp_mflags}
|
||||
|
||||
cat > ./grub.cfg <<EOF
|
||||
insmod part_msdos
|
||||
insmod part_gpt
|
||||
insmod search
|
||||
insmod configfile
|
||||
insmod legacy_configfile
|
||||
if search -s root -f /boot/grub2/grub.cfg ; then
|
||||
configfile /boot/grub2/grub.cfg
|
||||
elif search -s root -f /@/boot/grub2/grub.cfg ; then
|
||||
configfile /@/boot/grub2/grub.cfg
|
||||
elif search -s root -f /boot/grub/menu.lst ; then
|
||||
legacy_configfile /boot/grub/menu.lst
|
||||
fi
|
||||
EOF
|
||||
./grub-mkstandalone --grub-mkimage=./grub-mkimage -o grub.xen -O %{_target_cpu}-xen -d grub-core/ "/boot/grub/grub.cfg=./grub.cfg"
|
||||
|
||||
cd ..
|
||||
%endif
|
||||
|
||||
%ifarch %{efi}
|
||||
cd build-efi
|
||||
../configure \
|
||||
@ -395,24 +508,34 @@ cd build
|
||||
%endif
|
||||
|
||||
%ifarch s390x
|
||||
%define _devmapper --disable-device-mapper
|
||||
%define arch_specific --enable-device-mapper --disable-grub-mount
|
||||
TFLAGS="-fPIC"
|
||||
%else
|
||||
%define _devmapper --enable-device-mapper
|
||||
%define arch_specific --enable-device-mapper
|
||||
TFLAGS="-static"
|
||||
%endif
|
||||
|
||||
# -static is needed so that autoconf script is able to link
|
||||
# test that looks for _start symbol on 64 bit platforms
|
||||
../configure TARGET_LDFLAGS=-static \
|
||||
../configure TARGET_LDFLAGS=$TFLAGS \
|
||||
--prefix=%{_prefix} \
|
||||
--sysconfdir=%{_sysconfdir} \
|
||||
--target=%{_target_platform} \
|
||||
--with-platform=%{platform} \
|
||||
%{_devmapper} \
|
||||
%{arch_specific} \
|
||||
--program-transform-name=s,grub,%{name},
|
||||
make %{?_smp_mflags}
|
||||
%endif
|
||||
|
||||
%install
|
||||
|
||||
%ifarch x86_64
|
||||
cd build-xen
|
||||
make DESTDIR=$RPM_BUILD_ROOT install
|
||||
install -m 644 grub.xen $RPM_BUILD_ROOT%{_libdir}/%{name}/%{_target_cpu}-xen/.
|
||||
cd ..
|
||||
%endif
|
||||
|
||||
%ifarch %{efi}
|
||||
cd build-efi
|
||||
make DESTDIR=$RPM_BUILD_ROOT install
|
||||
@ -472,9 +595,58 @@ rm $RPM_BUILD_ROOT%{_datadir}/%{name}/*.h
|
||||
install -m 644 -D %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/default/grub
|
||||
install -m 755 -D %{SOURCE6} $RPM_BUILD_ROOT%{_sbindir}/grub2-once
|
||||
install -m 755 -D %{SOURCE12} $RPM_BUILD_ROOT%{_libdir}/snapper/plugins/grub
|
||||
install -m 755 -D %{SOURCE13} $RPM_BUILD_ROOT%{_sbindir}/suse_btrfs_grub2_install.sh
|
||||
install -m 755 -D %{SOURCE14} $RPM_BUILD_ROOT%{_sysconfdir}/grub.d/80_suse_btrfs_snapshot
|
||||
|
||||
R=$RPM_BUILD_ROOT
|
||||
%ifarch %{ix86} x86_64
|
||||
%else
|
||||
rm -f $R%{_sysconfdir}/grub.d/20_memtest86+
|
||||
%endif
|
||||
|
||||
%ifarch ppc ppc64 ppc64le
|
||||
%else
|
||||
rm -f $R%{_sysconfdir}/grub.d/20_ppc_terminfo
|
||||
%endif
|
||||
|
||||
%ifarch s390x
|
||||
mv $R%{_sysconfdir}/{grub.d,default}/zipl2grub.conf.in
|
||||
chmod 600 $R%{_sysconfdir}/default/zipl2grub.conf.in
|
||||
mv $R%{_libdir}/%{name}/%{grubarch}/zipl2grub{2,}.pl
|
||||
|
||||
%define dracutlibdir %{_prefix}/lib/dracut
|
||||
%define dracutgrubmoddir %{dracutlibdir}/modules.d/99grub2
|
||||
install -m 755 -d $R%{dracutgrubmoddir}
|
||||
for f in module-setup.sh grub2.sh; do
|
||||
mv $R%{_libdir}/%{name}/%{grubarch}/dracut-$f $R%{dracutgrubmoddir}/$f
|
||||
done
|
||||
rm -f $R%{_sysconfdir}/grub.d/30_os-prober
|
||||
|
||||
perl -ni -e '
|
||||
sub END() {
|
||||
print "\n# on s390x always:\nGRUB_DISABLE_OS_PROBER=true\n";
|
||||
}
|
||||
if ( s{^#(GRUB_DISABLE_LINUX_RECOVERY)=\"?(true)\"?}{$1=$2} ) {
|
||||
$_ .= "GRUB_DISABLE_RECOVERY=true\n";
|
||||
}
|
||||
if ( s{^#?(GRUB_TERMINAL)=(console|gfxterm)}{$1=console} ) {
|
||||
$_ .= "GRUB_GFXPAYLOAD_LINUX=text\n";
|
||||
}
|
||||
if ( m{^# The resolution used on graphical} ||
|
||||
m{^# # note that you can use only modes} ||
|
||||
m{^# you can see them in real GRUB} ||
|
||||
m{^#?GRUB_GFXMODE=} ) {
|
||||
next;
|
||||
}
|
||||
s{openSUSE}{SUSE Linux Enterprise Server} if (m{^GRUB_DISTRIBUTOR});
|
||||
print;
|
||||
' $RPM_BUILD_ROOT%{_sysconfdir}/default/grub
|
||||
%else
|
||||
%endif
|
||||
|
||||
%find_lang %{name}
|
||||
%fdupes %buildroot%{_bindir}
|
||||
%fdupes %buildroot%{_libdir}
|
||||
|
||||
%post
|
||||
/sbin/install-info %{_infodir}/grub-dev.info %{_infodir}/dir || :
|
||||
@ -524,6 +696,10 @@ elif [ "x${LOADER_TYPE}" = "xgrub2" ]; then
|
||||
/sbin/update-bootloader --reinit 2>&1 | grep -q 'Unknown option: reinit' &&
|
||||
/sbin/update-bootloader --refresh || true
|
||||
fi
|
||||
%ifarch s390x
|
||||
# until dracut is finally fixed...
|
||||
rm -rf /usr/lib/dracut/modules.d/95grub2
|
||||
%endif
|
||||
%endif
|
||||
|
||||
%ifarch %{efi}
|
||||
@ -613,20 +789,23 @@ fi
|
||||
%config(noreplace) %{_sysconfdir}/default/grub
|
||||
%dir %{_sysconfdir}/grub.d
|
||||
%{_sysconfdir}/grub.d/README
|
||||
%config %{_sysconfdir}/grub.d/??_*
|
||||
%{_sbindir}/%{name}-bios-setup
|
||||
%{_sbindir}/%{name}-macbless
|
||||
%config %{_sysconfdir}/grub.d/00_header
|
||||
%config %{_sysconfdir}/grub.d/10_linux
|
||||
%config %{_sysconfdir}/grub.d/20_linux_xen
|
||||
%config %{_sysconfdir}/grub.d/40_custom
|
||||
%config %{_sysconfdir}/grub.d/41_custom
|
||||
#%config %{_sysconfdir}/grub.d/80_btrfs_snapshot
|
||||
%config %{_sysconfdir}/grub.d/90_persistent
|
||||
%{_sbindir}/%{name}-install
|
||||
%{_sbindir}/%{name}-mkconfig
|
||||
%{_sbindir}/%{name}-once
|
||||
%{_sbindir}/%{name}-ofpathname
|
||||
%{_sbindir}/%{name}-probe
|
||||
%{_sbindir}/%{name}-reboot
|
||||
%{_sbindir}/%{name}-set-default
|
||||
%{_sbindir}/%{name}-sparc64-setup
|
||||
%{_sbindir}/suse_btrfs_grub2_install.sh
|
||||
%{_bindir}/%{name}-editenv
|
||||
%{_bindir}/%{name}-file
|
||||
%{_bindir}/%{name}-fstest
|
||||
%{_bindir}/%{name}-glue-efi
|
||||
%{_bindir}/%{name}-kbdcomp
|
||||
%{_bindir}/%{name}-menulst2cfg
|
||||
%{_bindir}/%{name}-mkfont
|
||||
@ -637,16 +816,9 @@ fi
|
||||
%{_bindir}/%{name}-mkrelpath
|
||||
%{_bindir}/%{name}-mkrescue
|
||||
%{_bindir}/%{name}-mkstandalone
|
||||
%{_bindir}/%{name}-mount
|
||||
%{_bindir}/%{name}-render-label
|
||||
%{_bindir}/%{name}-script-check
|
||||
%{_bindir}/%{name}-syslinux2cfg
|
||||
%ifarch s390x
|
||||
%{_bindir}/%{name}-emu
|
||||
%{_bindir}/%{name}-emu-lite
|
||||
%else
|
||||
%{_sbindir}/%{name}-install
|
||||
%endif
|
||||
%dir %{_libdir}/%{name}
|
||||
%dir %{_datadir}/%{name}
|
||||
%dir %{_datadir}/%{name}/themes
|
||||
@ -659,9 +831,7 @@ fi
|
||||
%{_mandir}/man1/%{name}-editenv.1.*
|
||||
%{_mandir}/man1/%{name}-file.1.*
|
||||
%{_mandir}/man1/%{name}-fstest.1.*
|
||||
%{_mandir}/man1/%{name}-glue-efi.1.*
|
||||
%{_mandir}/man1/%{name}-kbdcomp.1.*
|
||||
%{_mandir}/man1/%{name}-macbless.1.*
|
||||
%{_mandir}/man1/%{name}-menulst2cfg.1.*
|
||||
%{_mandir}/man1/%{name}-mkfont.1.*
|
||||
%{_mandir}/man1/%{name}-mkimage.1.*
|
||||
@ -671,32 +841,48 @@ fi
|
||||
%{_mandir}/man1/%{name}-mkrelpath.1.*
|
||||
%{_mandir}/man1/%{name}-mkrescue.1.*
|
||||
%{_mandir}/man1/%{name}-mkstandalone.1.*
|
||||
%{_mandir}/man1/%{name}-mount.1.*
|
||||
%{_mandir}/man1/%{name}-render-label.1.*
|
||||
%{_mandir}/man1/%{name}-script-check.1.*
|
||||
%{_mandir}/man1/%{name}-syslinux2cfg.1.*
|
||||
%{_mandir}/man8/%{name}-bios-setup.8.*
|
||||
%{_mandir}/man8/%{name}-install.8.*
|
||||
%{_mandir}/man8/%{name}-mkconfig.8.*
|
||||
%{_mandir}/man8/%{name}-ofpathname.8.*
|
||||
%{_mandir}/man8/%{name}-probe.8.*
|
||||
%{_mandir}/man8/%{name}-reboot.8.*
|
||||
%{_mandir}/man8/%{name}-set-default.8.*
|
||||
%{_mandir}/man8/%{name}-sparc64-setup.8.*
|
||||
%ifarch s390x
|
||||
%{_bindir}/%{name}-emu
|
||||
%{_bindir}/%{name}-emu-lite
|
||||
%{_mandir}/man1/%{name}-emu.1.*
|
||||
%else
|
||||
%{_mandir}/man8/%{name}-install.8.*
|
||||
%config %{_sysconfdir}/grub.d/30_os-prober
|
||||
%{_bindir}/%{name}-glue-efi
|
||||
%{_bindir}/%{name}-mount
|
||||
%{_sbindir}/%{name}-bios-setup
|
||||
%{_sbindir}/%{name}-macbless
|
||||
%{_sbindir}/%{name}-ofpathname
|
||||
%{_sbindir}/%{name}-sparc64-setup
|
||||
%{_mandir}/man1/%{name}-glue-efi.1.*
|
||||
%{_mandir}/man1/%{name}-macbless.1.*
|
||||
%{_mandir}/man1/%{name}-mount.1.*
|
||||
%{_mandir}/man8/%{name}-bios-setup.8.*
|
||||
%{_mandir}/man8/%{name}-ofpathname.8.*
|
||||
%{_mandir}/man8/%{name}-sparc64-setup.8.*
|
||||
%endif
|
||||
|
||||
%files branding-upstream
|
||||
%defattr(-,root,root,-)
|
||||
%{_datadir}/%{name}/themes/starfield
|
||||
|
||||
%if ! 0%{?only_efi:1}
|
||||
|
||||
%files %{grubarch}
|
||||
%defattr(-,root,root,-)
|
||||
%ifarch %{ix86} x86_64
|
||||
%config %{_sysconfdir}/grub.d/20_memtest86+
|
||||
%endif
|
||||
%dir %{_libdir}/%{name}/%{grubarch}
|
||||
%ifarch ppc ppc64 ppc64le
|
||||
%config %{_sysconfdir}/grub.d/20_ppc_terminfo
|
||||
%{_libdir}/%{name}/%{grubarch}/%{name}.chrp
|
||||
%{_libdir}/%{name}/%{grubarch}/bootinfo.txt
|
||||
%endif
|
||||
@ -715,6 +901,11 @@ fi
|
||||
%{_libdir}/%{name}/%{grubarch}/kernel.exec
|
||||
%{_libdir}/%{name}/%{grubarch}/modinfo.sh
|
||||
%endif
|
||||
%ifarch s390x
|
||||
%config(noreplace) %{_sysconfdir}/default/zipl2grub.conf.in
|
||||
%{_libdir}/%{name}/%{grubarch}/zipl2grub.pl
|
||||
%{dracutlibdir}
|
||||
%endif
|
||||
|
||||
%ifarch %{efi}
|
||||
|
||||
@ -744,6 +935,13 @@ fi
|
||||
%defattr(-,root,root,-)
|
||||
%dir %{_libdir}/snapper
|
||||
%dir %{_libdir}/snapper/plugins
|
||||
%config %{_sysconfdir}/grub.d/80_suse_btrfs_snapshot
|
||||
%{_libdir}/snapper/plugins/grub
|
||||
|
||||
%ifarch x86_64
|
||||
%files %{_target_cpu}-xen
|
||||
%dir %{_libdir}/%{name}/%{_target_cpu}-xen
|
||||
%{_libdir}/%{name}/%{_target_cpu}-xen/*
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
|
215
suse_btrfs_grub2_install.sh
Normal file
215
suse_btrfs_grub2_install.sh
Normal file
@ -0,0 +1,215 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
grub_install="/usr/sbin/grub2-install"
|
||||
grub_probe="/usr/sbin/grub2-probe"
|
||||
grub_script_check="/usr/bin/grub2-script-check"
|
||||
btrfs_util="/sbin/btrfs"
|
||||
|
||||
# Get GRUB_DISTRIBUTOR.
|
||||
if test -f "/etc/default/grub" ; then
|
||||
. "/etc/default/grub"
|
||||
fi
|
||||
|
||||
root_fstype=`$grub_probe -t fs /`
|
||||
boot_fstype=`$grub_probe -t fs /boot`
|
||||
if [ "x$SUSE_BTRFS_SNAPSHOT_BOOTING" != "xtrue" ] ||
|
||||
[ "x${root_fstype}" != "xbtrfs" ] ||
|
||||
[ "x${boot_fstype}" != "xbtrfs" ] ; then
|
||||
echo "requirement not met" >&2
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
make_grubcfg () {
|
||||
|
||||
prefix="$1"
|
||||
descriptive_config="snapshot_submenu.cfg"
|
||||
|
||||
if [ "x${platform}" = "xpc" ]; then
|
||||
cat <<EOF
|
||||
insmod part_gpt
|
||||
insmod part_msdos
|
||||
insmod acpi
|
||||
insmod btrfs
|
||||
insmod multiboot
|
||||
insmod configfile
|
||||
insmod linux
|
||||
insmod search
|
||||
insmod search_fs_uuid
|
||||
insmod search_fs_file
|
||||
insmod search_label
|
||||
insmod chain
|
||||
insmod sleep
|
||||
insmod test
|
||||
insmod echo
|
||||
insmod all_video
|
||||
insmod regexp
|
||||
insmod font
|
||||
insmod terminal
|
||||
insmod terminfo
|
||||
insmod sleep
|
||||
insmod ls
|
||||
insmod minicmd
|
||||
insmod png
|
||||
insmod gzio
|
||||
insmod boot
|
||||
insmod read
|
||||
insmod cat
|
||||
insmod vbe
|
||||
insmod vga
|
||||
insmod video_bochs
|
||||
insmod video_cirrus
|
||||
insmod gettext
|
||||
insmod true
|
||||
insmod reboot
|
||||
insmod password
|
||||
insmod password_pbkdf2
|
||||
insmod loadenv
|
||||
insmod legacycfg
|
||||
insmod jpeg
|
||||
insmod gfxmenu
|
||||
insmod gfxterm_background
|
||||
insmod gfxterm_menu
|
||||
insmod gfxterm
|
||||
EOF
|
||||
fi
|
||||
|
||||
cat <<EOF
|
||||
|
||||
set btrfs_relative_path="y"
|
||||
set extra_cmdline=""
|
||||
btrfs_subvolid=""
|
||||
btrfs_subvol="/"
|
||||
|
||||
export btrfs_relative_path
|
||||
export extra_cmdline
|
||||
EOF
|
||||
|
||||
if [ "x${platform}" = "xpc" ]; then
|
||||
cat <<EOF
|
||||
|
||||
set prefix="(\$root)${prefix}"
|
||||
EOF
|
||||
elif [ "x${platform}" = "xefi" ]; then
|
||||
cat <<EOF
|
||||
|
||||
set prefix="(\$root)${prefix}"
|
||||
search --fs-uuid --set=root `"$grub_probe" --target=fs_uuid /boot/grub2`
|
||||
EOF
|
||||
fi
|
||||
|
||||
cat <<EOF
|
||||
|
||||
terminal_input console
|
||||
terminal_output console
|
||||
|
||||
set timeout=0
|
||||
|
||||
menuentry 'default' {
|
||||
btrfs_subvol=""
|
||||
configfile /boot/grub2/grub.cfg
|
||||
btrfs_subvol="/"
|
||||
}
|
||||
|
||||
if [ -f "/.snapshots/${descriptive_config}" ]; then
|
||||
source "/.snapshots/${descriptive_config}"
|
||||
else
|
||||
submenu 'Available Snapshots' {
|
||||
for i in /.snapshots/*; do
|
||||
if [ -f "\$i/${descriptive_config}" ]; then
|
||||
source "\$i/${descriptive_config}"
|
||||
elif [ -f "\$i/snapshot/boot/grub2/grub.cfg" ]; then
|
||||
menuentry "\$i" "/.snapshots\$i/snapshot" {
|
||||
btrfs_subvol="\$2"
|
||||
extra_cmdline="rootflags=subvol=\$2"
|
||||
configfile /boot/grub2/grub.cfg
|
||||
btrfs_subvol="/"
|
||||
}
|
||||
fi
|
||||
done
|
||||
}
|
||||
fi
|
||||
EOF
|
||||
|
||||
}
|
||||
|
||||
case x"`uname -m`" in
|
||||
x"powerpc"* | x"ppc"*)
|
||||
target="powerpc-ieee1275";;
|
||||
x"sparc"*)
|
||||
target="sparc64-ieee1275";;
|
||||
x"mips"*"el")
|
||||
target="mipsel-loongson";;
|
||||
x"mips"*)
|
||||
target="mips-arc";;
|
||||
x"ia64"*)
|
||||
target="ia64-efi";;
|
||||
x"x86_64"* | x"amd64"*)
|
||||
modprobe -q efivars 2>/dev/null || true
|
||||
if [ -d /sys/firmware/efi ]; then
|
||||
target="x86_64-efi"
|
||||
else
|
||||
target=i386-pc
|
||||
fi
|
||||
;;
|
||||
x"i"?"86"*)
|
||||
modprobe -q efivars 2>/dev/null || true
|
||||
if [ -d /sys/firmware/efi ]; then
|
||||
target="i386-efi"
|
||||
elif [ -e /proc/device-tree ]; then
|
||||
target=i386-pc
|
||||
for x in /proc/device-tree/*; do
|
||||
if [ -e "$x" ]; then
|
||||
target="i386-ieee1275"
|
||||
fi
|
||||
done
|
||||
else
|
||||
target=i386-pc
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
target=""
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ "x${target}" = "xi386-pc" ]; then
|
||||
platform="pc"
|
||||
elif [ "x${target}" = "xx86_64-efi" ] ||
|
||||
[ "x${target}" = "xi386-efi" ]; then
|
||||
platform="efi"
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "x${platform}" = "xefi" ]; then
|
||||
bootloader_id="$(echo "$GRUB_DISTRIBUTOR" | tr 'A-Z' 'a-z' | cut -d' ' -f1)"
|
||||
if test -z "$bootloader_id"; then
|
||||
bootloader_id=grub
|
||||
fi
|
||||
boot_directory="/boot/efi/EFI/${bootloader_id}"
|
||||
|
||||
if echo "$@" | grep -q '--boot-directory='; then
|
||||
${grub_install} $@
|
||||
else
|
||||
${grub_install} --boot-directory="${boot_directory}" --efi-directory="/boot/efi" $@
|
||||
make_grubcfg "/EFI/${bootloader_id}/grub2" >"${boot_directory}/grub2/grub.cfg.new"
|
||||
fi
|
||||
elif [ "x${platform}" = "xpc" ]; then
|
||||
boot_directory="/.boot"
|
||||
if [ ! -d "$boot_directory" ]; then
|
||||
${btrfs_util} subvolume create "$boot_directory"
|
||||
echo "UUID=`$grub_probe -t fs_uuid /` /.boot btrfs subvol=@/.boot 0 0" >>/etc/fstab
|
||||
fi
|
||||
if echo "$@" | grep -q '--boot-directory='; then
|
||||
${grub_install} $@
|
||||
else
|
||||
${grub_install} --boot-directory="${boot_directory}" $@
|
||||
make_grubcfg "${boot_directory}/grub2" >"${boot_directory}/grub2/grub.cfg.new"
|
||||
fi
|
||||
fi
|
||||
|
||||
if $grub_script_check "${boot_directory}/grub2/grub.cfg.new"; then
|
||||
mv -f "${boot_directory}/grub2/grub.cfg.new" "${boot_directory}/grub2/grub.cfg"
|
||||
fi
|
||||
|
Loading…
Reference in New Issue
Block a user