grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

grub-2.06 fails to load 64bit Multiboot2 ELF with regions above 4GiB


From: Baksik, Fred [USA]
Subject: grub-2.06 fails to load 64bit Multiboot2 ELF with regions above 4GiB
Date: Fri, 16 Jun 2023 10:50:14 +0000

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");

 

--

2.31.1

 

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

 


reply via email to

[Prev in Thread] Current Thread [Next in Thread]