]> git.proxmox.com Git - grub2.git/commitdiff
* grub-core/kern/elfXX.c (grub_elfXX_load): Handle
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 19 Apr 2013 13:05:11 +0000 (15:05 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 19 Apr 2013 13:05:11 +0000 (15:05 +0200)
GRUB_ELF_LOAD_FLAGS_30BITS and GRUB_ELF_LOAD_FLAGS_62BITS.
* grub-core/loader/powerpc/ieee1275/linux.c (grub_linux_load32),
(grub_linux_load64): Mask out 2 high bits.

ChangeLog
grub-core/kern/elfXX.c
grub-core/loader/powerpc/ieee1275/linux.c
include/grub/elfload.h

index 7450036451c9e7793f78e0bafea31f52c2ab4376..3799129d04701041e2d2a243bd648dc87d8ff6ee 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2013-04-19  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/kern/elfXX.c (grub_elfXX_load): Handle
+       GRUB_ELF_LOAD_FLAGS_30BITS and GRUB_ELF_LOAD_FLAGS_62BITS.
+       * grub-core/loader/powerpc/ieee1275/linux.c (grub_linux_load32),
+       (grub_linux_load64): Mask out 2 high bits.
+
 2013-04-19  Andrey Borzenkov <arvidjaar@gmail.com>
 
        * util/grub.d/30_os-prober.in: Add onstr to linux entries in one
index b35e235dfad8441ca9def4c834a79c19ef364454..2e45449198293c09b2bbee43582122535cf9faa0 100644 (file)
@@ -101,8 +101,20 @@ grub_elfXX_load (grub_elf_t elf, const char *filename,
       continue;
 
     load_addr = (grub_addr_t) phdr->p_paddr;
-    if (load_flags & GRUB_ELF_LOAD_FLAGS_28BITS)
-      load_addr &= 0xFFFFFFF;
+    switch (load_flags & GRUB_ELF_LOAD_FLAGS_BITS)
+      {
+      case GRUB_ELF_LOAD_FLAGS_ALL_BITS:
+       break;
+      case GRUB_ELF_LOAD_FLAGS_28BITS:
+       load_addr &= 0xFFFFFFF;
+       break;
+      case GRUB_ELF_LOAD_FLAGS_30BITS:
+       load_addr &= 0x3FFFFFFF;
+       break;
+      case GRUB_ELF_LOAD_FLAGS_62BITS:
+       load_addr &= 0x3FFFFFFFFFFFFFFFULL;
+       break;
+      }
     load_addr += (grub_addr_t) load_offset;
 
     if (load_addr < load_base)
index cff4fd1842d64b8e85166936b72c21804d052184..3356d51ac9ea57114303bf1d44d5bd89f96f0d0c 100644 (file)
@@ -204,7 +204,7 @@ grub_linux_load32 (grub_elf_t elf, const char *filename)
   linux_addr = seg_addr;
 
   /* Now load the segments into the area we claimed.  */
-  return grub_elf32_load (elf, filename, (void *) (seg_addr - base_addr), GRUB_ELF_LOAD_FLAGS_NONE, 0, 0);
+  return grub_elf32_load (elf, filename, (void *) (seg_addr - base_addr), GRUB_ELF_LOAD_FLAGS_30BITS, 0, 0);
 }
 
 static grub_err_t
@@ -238,7 +238,7 @@ grub_linux_load64 (grub_elf_t elf, const char *filename)
   linux_addr = seg_addr;
 
   /* Now load the segments into the area we claimed.  */
-  return grub_elf64_load (elf, filename, (void *) (grub_addr_t) (seg_addr - base_addr), GRUB_ELF_LOAD_FLAGS_NONE, 0, 0);
+  return grub_elf64_load (elf, filename, (void *) (grub_addr_t) (seg_addr - base_addr), GRUB_ELF_LOAD_FLAGS_62BITS, 0, 0);
 }
 
 static grub_err_t
index f854d0ba7fa8284a7cecdf8577aa6117bfdb9a5e..9a7ae4ebb30a7ac15d481b06d1f37f63b77fd9fe 100644 (file)
@@ -53,7 +53,11 @@ enum grub_elf_load_flags
   {
     GRUB_ELF_LOAD_FLAGS_NONE = 0,
     GRUB_ELF_LOAD_FLAGS_LOAD_PT_DYNAMIC = 1,
+    GRUB_ELF_LOAD_FLAGS_BITS = 6,
+    GRUB_ELF_LOAD_FLAGS_ALL_BITS = 0,
     GRUB_ELF_LOAD_FLAGS_28BITS = 2,
+    GRUB_ELF_LOAD_FLAGS_30BITS = 4,
+    GRUB_ELF_LOAD_FLAGS_62BITS = 6,
   };
 grub_err_t grub_elf32_load (grub_elf_t, const char *filename,
                            void *load_offset, enum grub_elf_load_flags flags, grub_addr_t *,