efi_mmap_hi and efi_system_table_hi were implemented when bootloader
version was 0x0208, so require that to access them, and also fail to
boot if they're needed but unsupported.  This way the bootloader will
give you an error instead of the system starting to boot and crashing.
---
 grub-core/loader/i386/linux.c |   30 +++++++++++++++++++++++++-----
 include/grub/i386/linux.h     |   13 ++++++++++++-
 2 files changed, 37 insertions(+), 6 deletions(-)

diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c
index 4c382b1..53aa14e 100644
--- a/grub-core/loader/i386/linux.c
+++ b/grub-core/loader/i386/linux.c
@@ -618,15 +618,23 @@ grub_linux_boot (void)
     efi_mmap_target = real_mode_target 
       + ((grub_uint8_t *) efi_mmap_buf - (grub_uint8_t *) real_mode_mem);
     /* Pass EFI parameters.  */
-    if (grub_le_to_cpu16 (params->version) >= 0x0206)
+    if (grub_le_to_cpu16 (params->version) >= 0x0208)
+      {
+       params->v0208.efi_mem_desc_size = efi_desc_size;
+       params->v0208.efi_mem_desc_version = efi_desc_version;
+       params->v0208.efi_mmap = efi_mmap_target;
+       params->v0208.efi_mmap_size = efi_mmap_size;
+
+#ifdef __x86_64__
+       params->v0206.efi_mmap_hi = (efi_mmap_target >> 32);
+#endif
+      }
+    else if (grub_le_to_cpu16 (params->version) >= 0x0206)
       {
        params->v0206.efi_mem_desc_size = efi_desc_size;
        params->v0206.efi_mem_desc_version = efi_desc_version;
        params->v0206.efi_mmap = efi_mmap_target;
        params->v0206.efi_mmap_size = efi_mmap_size;
-#ifdef __x86_64__
-       params->v0206.efi_mmap_hi = (efi_mmap_target >> 32);
-#endif
       }
     else if (grub_le_to_cpu16 (params->version) >= 0x0204)
       {
@@ -827,7 +835,14 @@ grub_cmd_linux (grub_command_t cmd __attribute__ 
((unused)),
   params->font_size = 16; /* XXX */
 
 #ifdef GRUB_MACHINE_EFI
-  if (grub_le_to_cpu16 (params->version) >= 0x0206)
+  if (grub_le_to_cpu16 (params->version < 0x0208) &&
+      ((efi_mmap_target >> 32) != 0 || (grub_efi_system_table >> 32) != 0))
+    {
+      return grub_error(GRUB_ERR_BAD_KERNEL,
+                       "kernel does not support 64-bit addressing");
+    }
+
+  if (grub_le_to_cpu16 (params->version) >= 0x0208)
     {
       params->v0206.efi_signature = GRUB_LINUX_EFI_SIGNATURE;
       params->v0206.efi_system_table = (grub_uint32_t) (unsigned long) 
grub_efi_system_table;
@@ -835,6 +850,11 @@ grub_cmd_linux (grub_command_t cmd __attribute__ 
((unused)),
       params->v0206.efi_system_table_hi = (grub_uint32_t) ((grub_uint64_t) 
grub_efi_system_table >> 32);
 #endif
     }
+  else if (grub_le_to_cpu16 (params->version) >= 0x0206)
+    {
+      params->v0206.efi_signature = GRUB_LINUX_EFI_SIGNATURE;
+      params->v0206.efi_system_table = (grub_uint32_t) (unsigned long) 
grub_efi_system_table;
+    }
   else if (grub_le_to_cpu16 (params->version) >= 0x0204)
     {
       params->v0204.efi_signature = GRUB_LINUX_EFI_SIGNATURE_0204;
diff --git a/include/grub/i386/linux.h b/include/grub/i386/linux.h
index 8dde9c2..b2a92f6 100644
--- a/include/grub/i386/linux.h
+++ b/include/grub/i386/linux.h
@@ -246,9 +246,20 @@ struct linux_kernel_params
           grub_uint32_t efi_mem_desc_version;  /* 1cc */
           grub_uint32_t efi_mmap;              /* 1d0 */
           grub_uint32_t efi_mmap_size;         /* 1d4 */
+       } v0206;
+      struct
+        {
+          grub_uint32_t padding7_1;            /* 1b8 */
+          grub_uint32_t padding7_2;            /* 1bc */
+          grub_uint32_t efi_signature;         /* 1c0 */
+          grub_uint32_t efi_system_table;      /* 1c4 */
+          grub_uint32_t efi_mem_desc_size;     /* 1c8 */
+          grub_uint32_t efi_mem_desc_version;  /* 1cc */
+          grub_uint32_t efi_mmap;              /* 1d0 */
+          grub_uint32_t efi_mmap_size;         /* 1d4 */
           grub_uint32_t efi_system_table_hi;   /* 1d8 */
           grub_uint32_t efi_mmap_hi;           /* 1dc */
-        } v0206;
+        } v0208;
     };
 
   grub_uint32_t alt_mem;               /* 1e0 */
-- 
1.7.10.2


_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to