grub-devel
[Top][All Lists]
Advanced

[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;
> 


Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

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