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.bak...@mrcy.com | mrcy.com > > From: Baksik, Fred [USA] > Sent: Wednesday, May 24, 2023 9:14 AM > To: bug-g...@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 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel