[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3 6/6] efi: restrict arm/arm64 linux loader initrd placement
From: |
Leif Lindholm |
Subject: |
Re: [PATCH v3 6/6] efi: restrict arm/arm64 linux loader initrd placement |
Date: |
Fri, 6 Jul 2018 17:33:54 +0100 |
User-agent: |
NeoMutt/20170113 (1.7.2) |
On Fri, Jul 06, 2018 at 06:00:11PM +0200, Daniel Kiper wrote:
> On Wed, Jun 27, 2018 at 06:17:20PM +0100, Leif Lindholm wrote:
> > The 32-bit arm Linux kernel is built as a zImage, which self-decompresses
> > down to near start of RAM. In order for an initrd/initramfs to be
> > accessible, it needs to be placed within the first ~768MB of RAM.
> > The initrd loader built into the kernel EFI stub restricts this down to
> > 512MB for simplicity - so enable the same restriction in grub.
> >
> > For arm64, the requirement is within a 1GB aligned 32GB window also
> > covering the (runtime) kernel image. Since the EFI stub loader itself
> > will attempt to relocate to near start of RAM, force initrd to be loaded
> > completely within the first 32GB of RAM.
> >
> > Signed-off-by: Leif Lindholm <address@hidden>
> > ---
> > grub-core/loader/arm64/linux.c | 39 ++++++++++++++++++++++++++++++++++++++-
> > 1 file changed, 38 insertions(+), 1 deletion(-)
> >
> > diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c
> > index 577fbda54..0d550182f 100644
> > --- a/grub-core/loader/arm64/linux.c
> > +++ b/grub-core/loader/arm64/linux.c
> > @@ -193,6 +193,42 @@ grub_linux_unload (void)
> > return GRUB_ERR_NONE;
> > }
> >
> > +/*
> > + * This function returns a pointer to a legally allocated initrd buffer,
> > + * or NULL if unsuccessful
> > + */
> > +static void *
> > +allocate_initrd_mem (int initrd_pages)
> > +{
> > + grub_addr_t max_addr;
> > +
> > + if (grub_efi_get_ram_base (&max_addr) != GRUB_ERR_NONE)
> > + return NULL;
> > +
> > + /*
> > + * As per linux/Documentation/arm/Booting
> > + * ARM initrd needs to be covered by kernel linear mapping,
> > + * so place it in the first 512MB of DRAM.
> > + *
> > + * As per linux/Documentation/arm64/booting.txt
> > + * ARM64 initrd needs to be contained entirely within a 1GB aligned
> > window
> > + * of up to 32GB of size that covers the kernel image as well.
> > + * Since the EFI stub loader will attempt to load the kernel near start
> > of
> > + * RAM, place the buffer in the first 32GB of RAM.
> > + */
> > +#ifdef __arm__
> > +#define INITRD_MAX_ADDRESS_OFFSET (512U * 1024 * 1024)
> > +#else /* __aarch64__ */
> > +#define INITRD_MAX_ADDRESS_OFFSET (32ULL * 1024 * 1024 * 1024)
> > +#endif
>
> May I ask you to move these definitions together with the comment before
> the allocate_initrd_mem(). Or even to the beginning of the file just
> behind GRUB_MOD_LICENSE(). I prefer the latter. Though I am not
> insisting on it.
I'm OK with either. I stuck it here because it is information that is
_only_ relevant to this particular piece of code. So my preference
leans the other way. Will update for v4.
/
Leif