LGTM

Le Thu, Aug 3, 2017 à 12:15 PM, Leif Lindholm <leif.lindh...@linaro.org> a
écrit :

> 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 8cd44230d..a96019a3b 100644
> --- a/grub-core/loader/arm64/linux.c
> +++ b/grub-core/loader/arm64/linux.c
> @@ -194,6 +194,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
> +
> +  max_addr += INITRD_MAX_ADDRESS_OFFSET - 1;
> +
> +  return grub_efi_allocate_pages_real (max_addr, initrd_pages,
> +                                      GRUB_EFI_ALLOCATE_MAX_ADDRESS,
> +                                      GRUB_EFI_LOADER_DATA);
> +}
> +
>  static grub_err_t
>  grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
>                  int argc, char *argv[])
> @@ -222,7 +258,8 @@ grub_cmd_initrd (grub_command_t cmd __attribute__
> ((unused)),
>    grub_dprintf ("linux", "Loading initrd\n");
>
>    initrd_pages = (GRUB_EFI_BYTES_TO_PAGES (initrd_size));
> -  initrd_mem = grub_efi_allocate_pages (0, initrd_pages);
> +  initrd_mem = allocate_initrd_mem (initrd_pages);
> +
>    if (!initrd_mem)
>      {
>        grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory"));
> --
> 2.11.0
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to