[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Unable to boot very old Linux kernels

From: Piotr Krysiuk
Subject: [PATCH] Unable to boot very old Linux kernels
Date: Mon, 17 Mar 2014 22:15:13 +0000


I occasionally need to boot a very old Linux kernel.

This works fine with old versions of GRUB, from before relocator was
introduced. However the kernel cannot be started by recent versions
of GRUB - machine simply restarts as soon as GRUB passes control to
Linux. As mentioned above this affects very old Linux only, so very
few users (if any) would care. But as I have a patch, here it is.

I tracked the issues to code initializing BSS that is used by old
Linux kernels. See code following "Clear BSS" on

AFAIK old Linux kernels do not provide information allowing boot
loader to determine end of BSS. As the consequence, current GRUB
may place GPT in the area overlapping with BSS sections of old
Linux kernels. The location of GPT was changed at the same time
when relocator was added, introducing regression.

In order to improve compatibility with these old kernels, we could
switch back to old strategy and simply place GPT close to end of
physical memory.

Best regards,

Piotr Krysiuk
 ChangeLog                      |    5 +++++
 grub-core/lib/i386/relocator.c |    2 +-
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index 770269c..5a91e5e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2014-03-17  Piotr Krysiuk  <address@hidden>
+       * grub-core/lib/i386/relocator.c: Moved GDT to end of physical memory
+       to avoid collision with old Linux BSS.
 2014-02-28  Vladimir Serbinenko  <address@hidden>
        * include/grub/i386/openbsd_bootarg.h: Add addr and frequency fields.
diff --git a/grub-core/lib/i386/relocator.c b/grub-core/lib/i386/relocator.c
index d2a1b27..523f669 100644
--- a/grub-core/lib/i386/relocator.c
+++ b/grub-core/lib/i386/relocator.c
@@ -84,7 +84,7 @@ grub_relocator32_boot (struct grub_relocator *rel,
   err = grub_relocator_alloc_chunk_align (rel, &ch, 0,
                                          (0xffffffff - RELOCATOR_SIZEOF (32))
                                          + 1, RELOCATOR_SIZEOF (32), 16,
-                                         GRUB_RELOCATOR_PREFERENCE_NONE,
+                                         GRUB_RELOCATOR_PREFERENCE_HIGH,
   if (err)
     return err;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]