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 <leif.lindh...@linaro.org> > > --- > > 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 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel