[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: grub-2.06 fails to load 64bit Multiboot2 ELF with regions above 4GiB
From: |
Daniel Kiper |
Subject: |
Re: grub-2.06 fails to load 64bit Multiboot2 ELF with regions above 4GiB |
Date: |
Fri, 23 Jun 2023 16:24:53 +0200 |
User-agent: |
NeoMutt/20170113 (1.7.2) |
Hi,
On Fri, Jun 16, 2023 at 10:50:14AM +0000, Baksik, Fred [USA] via Grub-devel
wrote:
>
> I tried report this issue to the bug-grub mailing list but didn’t see the Bug
> Tracker get updated.
> I’d like to get this reported so anyone else using multiboot2 to boot and
> embedded RTOS knows of this problem.
>
> I also supplied a patch that fixes the issue.
>
> Regards,
> Fred Baksik
> Sr Prin Software Engineer
> Systems | Mission
> Mercury Systems
> 6675 Shiloh Road East, Alpharetta, GA 30005
> +1_978.967.3405 office
>
> fred.baksik@mrcy.com | mrcy.com
>
> From: Baksik, Fred [USA]
> Sent: Wednesday, May 24, 2023 9:14 AM
> To: bug-grub@gnu.org
> Subject: grub-2.06 fails to load 64bit Multiboot2 ELF with regions above 4GiB
>
> GRUB2 fails to load a Multiboot2 ELF with loadable regions above 4GiB. The
> error seen is “segment crosses 4 GiB border”.
>
> The 4 GiB border check was added as part of “multiboot2: Add support for
> relocatable images” commit a620876e3b32e4ea0c9a7b3541fcb9a4dd4fb9eb.
> I believe this check should only apply when the multiboot2 image supports
> relocation via the MULTIBOOT_HEADER_TAG_RELOCATABLE tag.
>
> Subject: [PATCH] multiboot2: check 4GiB limit for relocatable images only
>
> ---
> grub-core/loader/multiboot_elfxx.c | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/grub-core/loader/multiboot_elfxx.c b/grub-core/loader/
> multiboot_elfxx.c
> index f2318e0..0ac11f0 100644
> --- a/grub-core/loader/multiboot_elfxx.c
> +++ b/grub-core/loader/multiboot_elfxx.c
> @@ -92,10 +92,6 @@ CONCAT(grub_multiboot_load_elf, XX) (mbi_load_data_t *mld)
> highest_load = grub_max (highest_load, phdr(i)->p_paddr + phdr(i)-
> >p_memsz);
> }
>
> -#ifdef MULTIBOOT_LOAD_ELF64
> - if (highest_load >= 0x100000000)
> - return grub_error (GRUB_ERR_BAD_OS, "segment crosses 4 GiB border");
> -#endif
>
> if (mld->relocatable)
> {
> @@ -106,6 +102,11 @@ CONCAT(grub_multiboot_load_elf, XX) (mbi_load_data_t
> *mld)
> (long) mld->align, mld->preference, load_size,
> mld->avoid_efi_boot_services);
>
> +#ifdef MULTIBOOT_LOAD_ELF64
> + if (highest_load >= 0x100000000)
> + return grub_error (GRUB_ERR_BAD_OS, "segment crosses 4 GiB border");
> +#endif
> +
> if (load_size > mld->max_addr || mld->min_addr > mld->max_addr -
> load_size)
> return grub_error (GRUB_ERR_BAD_OS, "invalid min/max address and/or load
> size");
Unfortunately your fix is incorrect. Here [1] is the explanation why.
The paragraph gives also some hints how to properly add 64-bit support
to the Multiboot2 protocol. I hope that helps.
Daniel
[1]
https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html#EFI-amd64-machine-state-with-boot-services-enabled