You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.6 KiB
75 lines
2.6 KiB
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
|
From: Daniel Axtens <dja@axtens.net> |
|
Date: Mon, 19 Jul 2021 14:35:55 +1000 |
|
Subject: [PATCH] powerpc: adjust setting of prefix for signed binary case |
|
|
|
On RHEL-signed powerpc grub, we sign a grub with -p /grub2 and expect |
|
that there's a boot partition. |
|
|
|
Unfortunately grub_set_prefix_and_root tries to convert this to |
|
($fwdevice)/grub2. This ends up being (ieee1275/disk)/grub2 and that |
|
falls apart pretty quickly - there's no file-system on ieee1275/disk, |
|
and it makes the search routine try things like |
|
(ieee1275/disk,msdos2)(ieee1275/disk)/grub2 which also doesn't work. |
|
|
|
Detect if we would be about to create (ieee1275/disk)/path and don't: |
|
preserve a prefix of /path instead and hope the search later finds us. |
|
|
|
Related: rhbz#1899864 |
|
|
|
Signed-off-by: Daniel Axtens <dja@axtens.net> |
|
--- |
|
grub-core/kern/main.c | 38 +++++++++++++++++++++++++++++++++----- |
|
1 file changed, 33 insertions(+), 5 deletions(-) |
|
|
|
diff --git a/grub-core/kern/main.c b/grub-core/kern/main.c |
|
index 0285e95a2bb..e809a5edec1 100644 |
|
--- a/grub-core/kern/main.c |
|
+++ b/grub-core/kern/main.c |
|
@@ -216,13 +216,41 @@ grub_set_prefix_and_root (void) |
|
if (device) |
|
{ |
|
char *prefix_set; |
|
- |
|
- prefix_set = grub_xasprintf ("(%s)%s", device, path ? : ""); |
|
- if (prefix_set) |
|
+ |
|
+#ifdef __powerpc__ |
|
+ /* We have to be careful here on powerpc-ieee1275 + signed grub. We |
|
+ will have signed something with a prefix that doesn't have a device |
|
+ because we cannot know in advance what partition we're on. |
|
+ |
|
+ We will have had !device earlier, so we will have set device=fwdevice |
|
+ However, we want to make sure we do not end up setting prefix to be |
|
+ ($fwdevice)/path, because we will then end up trying to boot or search |
|
+ based on a prefix of (ieee1275/disk)/path, which will not work because |
|
+ it's missing a partition. |
|
+ |
|
+ Also: |
|
+ - You can end up with a device with an FS directly on it, without |
|
+ a partition, e.g. ieee1275/cdrom. |
|
+ |
|
+ - powerpc-ieee1275 + grub-install sets e.g. prefix=(,gpt2)/path, |
|
+ which will have now been extended to device=$fwdisk,partition |
|
+ and path=/path |
|
+ |
|
+ So we only need to act if device = ieee1275/disk exactly. |
|
+ */ |
|
+ if (grub_strncmp (device, "ieee1275/disk", 14) == 0) |
|
+ grub_env_set ("prefix", path); |
|
+ else |
|
+#endif |
|
{ |
|
- grub_env_set ("prefix", prefix_set); |
|
- grub_free (prefix_set); |
|
+ prefix_set = grub_xasprintf ("(%s)%s", device, path ? : ""); |
|
+ if (prefix_set) |
|
+ { |
|
+ grub_env_set ("prefix", prefix_set); |
|
+ grub_free (prefix_set); |
|
+ } |
|
} |
|
+ |
|
grub_env_set ("root", device); |
|
} |
|
|
|
|