[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCHv2] Unable to boot very old Linux kernels
From: |
Vladimir 'φ-coder/phcoder' Serbinenko |
Subject: |
Re: [PATCHv2] Unable to boot very old Linux kernels |
Date: |
Sun, 20 Apr 2014 15:59:41 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Icedove/24.4.0 |
Committed, thanks.
On 15.04.2014 13:58, Piotr Krysiuk wrote:
> GRUB cannot determine end of BSS section of compressed image when loading
> very old Linux kernels. Booting these kernels, grub_relocator32_start and
> new Global Descriptor Table are placed in the area overlapping with the BSS
> section of loaded image. When Linux executes, it initializes BSS also
> wiping Global Descriptor Table that is still active. This leads to failure
> on segment reload that follows.
>
> Current HEAD of GRUB repository is affected, with "Clear BSS" code from
> https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/arch/x86_64/boot/compressed/head.S?h=linux-2.6.17.y#n57
> wiping GDT.
>
> Old versions of GRUB, from before relocator was introduced, placed GDT close
> to end of physical memory avoiding this issue. This patch fixes regression
> by moving GDT into conventional memory.
>
> * grub-core/lib/i386/relocator.c: Move GDT into conventional memory
> to avoid collision with BSS section of compressed Linux image for
> very old kernels.
> ---
> grub-core/lib/i386/relocator.c | 11 +++++++----
> 1 file changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/grub-core/lib/i386/relocator.c b/grub-core/lib/i386/relocator.c
> index d2a1b27..ffaf25f 100644
> --- a/grub-core/lib/i386/relocator.c
> +++ b/grub-core/lib/i386/relocator.c
> @@ -81,10 +81,13 @@ grub_relocator32_boot (struct grub_relocator *rel,
> void *relst;
> grub_relocator_chunk_t ch;
>
> - err = grub_relocator_alloc_chunk_align (rel, &ch, 0,
> - (0xffffffff - RELOCATOR_SIZEOF (32))
> - + 1, RELOCATOR_SIZEOF (32), 16,
> - GRUB_RELOCATOR_PREFERENCE_NONE,
> + /* Specific memory range due to Global Descriptor Table for use by payload
> + that we will store in returned chunk. The address range and preference
> + are based on "THE LINUX/x86 BOOT PROTOCOL" specification. */
> + err = grub_relocator_alloc_chunk_align (rel, &ch, 0x1000,
> + 0x9a000 - RELOCATOR_SIZEOF (32),
> + RELOCATOR_SIZEOF (32), 16,
> + GRUB_RELOCATOR_PREFERENCE_LOW,
> avoid_efi_bootservices);
> if (err)
> return err;
>
signature.asc
Description: OpenPGP digital signature