Blame SOURCES/0326-grub-core-kern-elfXX.c-grub_elfXX_load-Handle.patch

f96e0b
From bbed773160168ebd75f57a893c7d563673abf36f Mon Sep 17 00:00:00 2001
f96e0b
From: Vladimir 'phcoder' Serbinenko <phcoder@gmail.com>
f96e0b
Date: Fri, 19 Apr 2013 15:05:11 +0200
f96e0b
Subject: [PATCH 326/482] 	* grub-core/kern/elfXX.c (grub_elfXX_load):
f96e0b
 Handle 	GRUB_ELF_LOAD_FLAGS_30BITS and GRUB_ELF_LOAD_FLAGS_62BITS. 
f96e0b
 * grub-core/loader/powerpc/ieee1275/linux.c (grub_linux_load32), 
f96e0b
 (grub_linux_load64): Mask out 2 high bits.
f96e0b
f96e0b
---
f96e0b
 ChangeLog                                 |  7 +++++++
f96e0b
 grub-core/kern/elfXX.c                    | 16 ++++++++++++++--
f96e0b
 grub-core/loader/powerpc/ieee1275/linux.c |  4 ++--
f96e0b
 include/grub/elfload.h                    |  4 ++++
f96e0b
 4 files changed, 27 insertions(+), 4 deletions(-)
f96e0b
f96e0b
diff --git a/ChangeLog b/ChangeLog
f96e0b
index 7450036..3799129 100644
f96e0b
--- a/ChangeLog
f96e0b
+++ b/ChangeLog
f96e0b
@@ -1,3 +1,10 @@
f96e0b
+2013-04-19  Vladimir Serbinenko  <phcoder@gmail.com>
f96e0b
+
f96e0b
+	* grub-core/kern/elfXX.c (grub_elfXX_load): Handle
f96e0b
+	GRUB_ELF_LOAD_FLAGS_30BITS and GRUB_ELF_LOAD_FLAGS_62BITS.
f96e0b
+	* grub-core/loader/powerpc/ieee1275/linux.c (grub_linux_load32),
f96e0b
+	(grub_linux_load64): Mask out 2 high bits.
f96e0b
+
f96e0b
 2013-04-19  Andrey Borzenkov <arvidjaar@gmail.com>
f96e0b
 
f96e0b
 	* util/grub.d/30_os-prober.in: Add onstr to linux entries in one
f96e0b
diff --git a/grub-core/kern/elfXX.c b/grub-core/kern/elfXX.c
f96e0b
index b35e235..2e45449 100644
f96e0b
--- a/grub-core/kern/elfXX.c
f96e0b
+++ b/grub-core/kern/elfXX.c
f96e0b
@@ -101,8 +101,20 @@ grub_elfXX_load (grub_elf_t elf, const char *filename,
f96e0b
       continue;
f96e0b
 
f96e0b
     load_addr = (grub_addr_t) phdr->p_paddr;
f96e0b
-    if (load_flags & GRUB_ELF_LOAD_FLAGS_28BITS)
f96e0b
-      load_addr &= 0xFFFFFFF;
f96e0b
+    switch (load_flags & GRUB_ELF_LOAD_FLAGS_BITS)
f96e0b
+      {
f96e0b
+      case GRUB_ELF_LOAD_FLAGS_ALL_BITS:
f96e0b
+	break;
f96e0b
+      case GRUB_ELF_LOAD_FLAGS_28BITS:
f96e0b
+	load_addr &= 0xFFFFFFF;
f96e0b
+	break;
f96e0b
+      case GRUB_ELF_LOAD_FLAGS_30BITS:
f96e0b
+	load_addr &= 0x3FFFFFFF;
f96e0b
+	break;
f96e0b
+      case GRUB_ELF_LOAD_FLAGS_62BITS:
f96e0b
+	load_addr &= 0x3FFFFFFFFFFFFFFFULL;
f96e0b
+	break;
f96e0b
+      }
f96e0b
     load_addr += (grub_addr_t) load_offset;
f96e0b
 
f96e0b
     if (load_addr < load_base)
f96e0b
diff --git a/grub-core/loader/powerpc/ieee1275/linux.c b/grub-core/loader/powerpc/ieee1275/linux.c
f96e0b
index cff4fd1..3356d51 100644
f96e0b
--- a/grub-core/loader/powerpc/ieee1275/linux.c
f96e0b
+++ b/grub-core/loader/powerpc/ieee1275/linux.c
f96e0b
@@ -204,7 +204,7 @@ grub_linux_load32 (grub_elf_t elf, const char *filename)
f96e0b
   linux_addr = seg_addr;
f96e0b
 
f96e0b
   /* Now load the segments into the area we claimed.  */
f96e0b
-  return grub_elf32_load (elf, filename, (void *) (seg_addr - base_addr), GRUB_ELF_LOAD_FLAGS_NONE, 0, 0);
f96e0b
+  return grub_elf32_load (elf, filename, (void *) (seg_addr - base_addr), GRUB_ELF_LOAD_FLAGS_30BITS, 0, 0);
f96e0b
 }
f96e0b
 
f96e0b
 static grub_err_t
f96e0b
@@ -238,7 +238,7 @@ grub_linux_load64 (grub_elf_t elf, const char *filename)
f96e0b
   linux_addr = seg_addr;
f96e0b
 
f96e0b
   /* Now load the segments into the area we claimed.  */
f96e0b
-  return grub_elf64_load (elf, filename, (void *) (grub_addr_t) (seg_addr - base_addr), GRUB_ELF_LOAD_FLAGS_NONE, 0, 0);
f96e0b
+  return grub_elf64_load (elf, filename, (void *) (grub_addr_t) (seg_addr - base_addr), GRUB_ELF_LOAD_FLAGS_62BITS, 0, 0);
f96e0b
 }
f96e0b
 
f96e0b
 static grub_err_t
f96e0b
diff --git a/include/grub/elfload.h b/include/grub/elfload.h
f96e0b
index f854d0b..9a7ae4e 100644
f96e0b
--- a/include/grub/elfload.h
f96e0b
+++ b/include/grub/elfload.h
f96e0b
@@ -53,7 +53,11 @@ enum grub_elf_load_flags
f96e0b
   {
f96e0b
     GRUB_ELF_LOAD_FLAGS_NONE = 0,
f96e0b
     GRUB_ELF_LOAD_FLAGS_LOAD_PT_DYNAMIC = 1,
f96e0b
+    GRUB_ELF_LOAD_FLAGS_BITS = 6,
f96e0b
+    GRUB_ELF_LOAD_FLAGS_ALL_BITS = 0,
f96e0b
     GRUB_ELF_LOAD_FLAGS_28BITS = 2,
f96e0b
+    GRUB_ELF_LOAD_FLAGS_30BITS = 4,
f96e0b
+    GRUB_ELF_LOAD_FLAGS_62BITS = 6,
f96e0b
   };
f96e0b
 grub_err_t grub_elf32_load (grub_elf_t, const char *filename,
f96e0b
 			    void *load_offset, enum grub_elf_load_flags flags, grub_addr_t *,
f96e0b
-- 
f96e0b
1.8.2.1
f96e0b