a5bd9f6
From e5668a21f2e71785573ab072471c9254fa6e73b0 Mon Sep 17 00:00:00 2001
a5bd9f6
From: Vladimir 'phcoder' Serbinenko <phcoder@gmail.com>
a5bd9f6
Date: Tue, 9 Apr 2013 19:19:19 +0200
a5bd9f6
Subject: [PATCH 274/364] 	Fix ia64-efi image generation on big-endian
a5bd9f6
 machines. Deduplicate 	some code while on it. 	Reported by: Leif Lindholm.
a5bd9f6
a5bd9f6
---
a5bd9f6
 ChangeLog                       |   6 ++
a5bd9f6
 grub-core/kern/ia64/dl.c        | 135 ++----------------------------
a5bd9f6
 grub-core/kern/ia64/dl_helper.c | 159 +++++++++++++++++++++++++++++++++--
a5bd9f6
 include/grub/ia64/reloc.h       |  42 ++++++++++
a5bd9f6
 util/grub-mkimage.c             |   9 +-
a5bd9f6
 util/grub-mkimagexx.c           | 178 +++++++---------------------------------
a5bd9f6
 6 files changed, 243 insertions(+), 286 deletions(-)
a5bd9f6
 create mode 100644 include/grub/ia64/reloc.h
a5bd9f6
a5bd9f6
diff --git a/ChangeLog b/ChangeLog
a5bd9f6
index 083d86a..e45ca35 100644
a5bd9f6
--- a/ChangeLog
a5bd9f6
+++ b/ChangeLog
a5bd9f6
@@ -1,3 +1,9 @@
a5bd9f6
+2013-04-08  Vladimir Serbinenko  <phcoder@gmail.com>
a5bd9f6
+
a5bd9f6
+	Fix ia64-efi image generation on big-endian machines. Deduplicate
a5bd9f6
+	some code while on it.
a5bd9f6
+	Reported by: Leif Lindholm.
a5bd9f6
+
a5bd9f6
 2013-04-08  Andrey Borzenkov <arvidjaar@gmail.com>
a5bd9f6
 
a5bd9f6
 	* grub-core/Makefile.core.def: Add kern/elfXX.c to elf module
a5bd9f6
diff --git a/grub-core/kern/ia64/dl.c b/grub-core/kern/ia64/dl.c
a5bd9f6
index 7c22b0b..957ceaa 100644
a5bd9f6
--- a/grub-core/kern/ia64/dl.c
a5bd9f6
+++ b/grub-core/kern/ia64/dl.c
a5bd9f6
@@ -23,6 +23,9 @@
a5bd9f6
 #include <grub/err.h>
a5bd9f6
 #include <grub/mm.h>
a5bd9f6
 #include <grub/i18n.h>
a5bd9f6
+#include <grub/ia64/reloc.h>
a5bd9f6
+
a5bd9f6
+#define MASK19 ((1 << 19) - 1)
a5bd9f6
 
a5bd9f6
 /* Check if EHDR is a valid ELF header.  */
a5bd9f6
 grub_err_t
a5bd9f6
@@ -41,126 +44,6 @@ grub_arch_dl_check_header (void *ehdr)
a5bd9f6
 
a5bd9f6
 #pragma GCC diagnostic ignored "-Wcast-align"
a5bd9f6
 
a5bd9f6
-#define MASK20 ((1 << 20) - 1)
a5bd9f6
-#define MASK19 ((1 << 19) - 1)
a5bd9f6
-
a5bd9f6
-struct unaligned_uint32
a5bd9f6
-{
a5bd9f6
-  grub_uint32_t val;
a5bd9f6
-}  __attribute__ ((packed));
a5bd9f6
-
a5bd9f6
-static void
a5bd9f6
-add_value_to_slot_20b (grub_addr_t addr, grub_uint32_t value)
a5bd9f6
-{
a5bd9f6
-  struct unaligned_uint32 *p;
a5bd9f6
-  switch (addr & 3)
a5bd9f6
-    {
a5bd9f6
-    case 0:
a5bd9f6
-      p = (struct unaligned_uint32 *) ((addr & ~3ULL) + 2);
a5bd9f6
-      p->val = ((((((p->val >> 2) & MASK20) + value) & MASK20) << 2) 
a5bd9f6
-		| (p->val & ~(MASK20 << 2)));
a5bd9f6
-      break;
a5bd9f6
-    case 1:
a5bd9f6
-      p = (struct unaligned_uint32 *) ((grub_uint8_t *) (addr & ~3ULL) + 7);
a5bd9f6
-      p->val = ((((((p->val >> 3) & MASK20) + value) & MASK20) << 3)
a5bd9f6
-		| (p->val & ~(MASK20 << 3)));
a5bd9f6
-      break;
a5bd9f6
-    case 2:
a5bd9f6
-      p = (struct unaligned_uint32 *) ((grub_uint8_t *) (addr & ~3ULL) + 12);
a5bd9f6
-      p->val = ((((((p->val >> 4) & MASK20) + value) & MASK20) << 4)
a5bd9f6
-		| (p->val & ~(MASK20 << 4)));
a5bd9f6
-      break;
a5bd9f6
-    }
a5bd9f6
-}
a5bd9f6
-
a5bd9f6
-#define MASKF21 ( ((1 << 23) - 1) & ~((1 << 7) | (1 << 8)) )
a5bd9f6
-
a5bd9f6
-static grub_uint32_t
a5bd9f6
-add_value_to_slot_21_real (grub_uint32_t a, grub_uint32_t value)
a5bd9f6
-{
a5bd9f6
-  grub_uint32_t high, mid, low, c;
a5bd9f6
-  low  = (a & 0x00007f);
a5bd9f6
-  mid  = (a & 0x7fc000) >> 7;
a5bd9f6
-  high = (a & 0x003e00) << 7;
a5bd9f6
-  c = (low | mid | high) + value;
a5bd9f6
-  return (c & 0x7f) | ((c << 7) & 0x7fc000) | ((c >> 7) & 0x0003e00); //0x003e00
a5bd9f6
-}
a5bd9f6
-
a5bd9f6
-static void
a5bd9f6
-add_value_to_slot_21 (grub_addr_t addr, grub_uint32_t value)
a5bd9f6
-{
a5bd9f6
-  struct unaligned_uint32 *p;
a5bd9f6
-  switch (addr & 3)
a5bd9f6
-    {
a5bd9f6
-    case 0:
a5bd9f6
-      p = (struct unaligned_uint32 *) ((addr & ~3ULL) + 2);
a5bd9f6
-      p->val = ((add_value_to_slot_21_real (((p->val >> 2) & MASKF21), value) & MASKF21) << 2) | (p->val & ~(MASKF21 << 2));
a5bd9f6
-      break;
a5bd9f6
-    case 1:
a5bd9f6
-      p = (struct unaligned_uint32 *) ((grub_uint8_t *) (addr & ~3ULL) + 7);
a5bd9f6
-      p->val = ((add_value_to_slot_21_real (((p->val >> 3) & MASKF21), value) & MASKF21) << 3) | (p->val & ~(MASKF21 << 3));
a5bd9f6
-      break;
a5bd9f6
-    case 2:
a5bd9f6
-      p = (struct unaligned_uint32 *) ((grub_uint8_t *) (addr & ~3ULL) + 12);
a5bd9f6
-      p->val = ((add_value_to_slot_21_real (((p->val >> 4) & MASKF21), value) & MASKF21) << 4) | (p->val & ~(MASKF21 << 4));
a5bd9f6
-      break;
a5bd9f6
-    }
a5bd9f6
-}
a5bd9f6
-
a5bd9f6
-static const grub_uint8_t nopm[5] =
a5bd9f6
-  {
a5bd9f6
-    /* [MLX]       nop.m 0x0 */
a5bd9f6
-    0x05, 0x00, 0x00, 0x00, 0x01
a5bd9f6
-  };
a5bd9f6
-
a5bd9f6
-static const grub_uint8_t jump[0x20] =
a5bd9f6
-  {
a5bd9f6
-    /* ld8 r16=[r15],8 */
a5bd9f6
-    0x02, 0x80, 0x20, 0x1e, 0x18, 0x14,
a5bd9f6
-    /* mov r14=r1;; */
a5bd9f6
-    0xe0, 0x00, 0x04, 0x00, 0x42, 0x00,
a5bd9f6
-    /* nop.i 0x0 */
a5bd9f6
-    0x00, 0x00, 0x04, 0x00,
a5bd9f6
-    /* ld8 r1=[r15] */
a5bd9f6
-    0x11, 0x08, 0x00, 0x1e, 0x18, 0x10,
a5bd9f6
-    /* mov b6=r16 */
a5bd9f6
-    0x60, 0x80, 0x04, 0x80, 0x03, 0x00,
a5bd9f6
-    /* br.few b6;; */
a5bd9f6
-    0x60, 0x00, 0x80, 0x00
a5bd9f6
-  };
a5bd9f6
-
a5bd9f6
-struct ia64_trampoline
a5bd9f6
-{
a5bd9f6
-  /* nop.m */
a5bd9f6
-  grub_uint8_t nop[5];
a5bd9f6
-  /* movl r15 = addr*/
a5bd9f6
-  grub_uint8_t addr_hi[6];
a5bd9f6
-  grub_uint8_t e0;
a5bd9f6
-  grub_uint8_t addr_lo[4];
a5bd9f6
-  grub_uint8_t jump[0x20];
a5bd9f6
-};
a5bd9f6
-
a5bd9f6
-static void
a5bd9f6
-make_trampoline (struct ia64_trampoline *tr, grub_uint64_t addr)
a5bd9f6
-{
a5bd9f6
-  COMPILE_TIME_ASSERT (sizeof (struct ia64_trampoline)
a5bd9f6
-		       == GRUB_IA64_DL_TRAMP_SIZE);
a5bd9f6
-  grub_memcpy (tr->nop, nopm, sizeof (tr->nop));
a5bd9f6
-  tr->addr_hi[0] = ((addr & 0xc00000) >> 16);
a5bd9f6
-  tr->addr_hi[1] = (addr >> 24) & 0xff;
a5bd9f6
-  tr->addr_hi[2] = (addr >> 32) & 0xff;
a5bd9f6
-  tr->addr_hi[3] = (addr >> 40) & 0xff;
a5bd9f6
-  tr->addr_hi[4] = (addr >> 48) & 0xff;
a5bd9f6
-  tr->addr_hi[5] = (addr >> 56) & 0xff;
a5bd9f6
-  tr->e0 = 0xe0;
a5bd9f6
-  tr->addr_lo[0] = ((addr & 0x000f) << 4) | 0x01;
a5bd9f6
-  tr->addr_lo[1] = (((addr & 0x0070) >> 4) | ((addr & 0x070000) >> 11)
a5bd9f6
-		    | ((addr & 0x200000) >> 17));
a5bd9f6
-  tr->addr_lo[2] = ((addr & 0x1f80) >> 5) | ((addr & 0x180000) >> 19);
a5bd9f6
-  tr->addr_lo[3] = ((addr & 0xe000) >> 13) | 0x60;
a5bd9f6
-  grub_memcpy (tr->jump, jump, sizeof (tr->jump));
a5bd9f6
-}
a5bd9f6
-
a5bd9f6
 /* Relocate symbols.  */
a5bd9f6
 grub_err_t
a5bd9f6
 grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
a5bd9f6
@@ -170,7 +53,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
a5bd9f6
   Elf_Word entsize;
a5bd9f6
   unsigned i;
a5bd9f6
   grub_uint64_t *gp, *gpptr;
a5bd9f6
-  struct ia64_trampoline *tr;
a5bd9f6
+  struct grub_ia64_trampoline *tr;
a5bd9f6
 
a5bd9f6
   gp = (grub_uint64_t *) mod->base;
a5bd9f6
   gpptr = (grub_uint64_t *) mod->got;
a5bd9f6
@@ -230,13 +113,13 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
a5bd9f6
 		  case R_IA64_PCREL21B:
a5bd9f6
 		    {
a5bd9f6
 		      grub_uint64_t noff;
a5bd9f6
-		      make_trampoline (tr, value);
a5bd9f6
+		      grub_ia64_make_trampoline (tr, value);
a5bd9f6
 		      noff = ((char *) tr - (char *) (addr & ~3)) >> 4;
a5bd9f6
-		      tr++;
a5bd9f6
+		      tr = (struct grub_ia64_trampoline *) ((char *) tr + GRUB_IA64_DL_TRAMP_SIZE);
a5bd9f6
 		      if (noff & ~MASK19)
a5bd9f6
 			return grub_error (GRUB_ERR_BAD_OS,
a5bd9f6
 					   "trampoline offset too big (%lx)", noff);
a5bd9f6
-		      add_value_to_slot_20b (addr, noff);
a5bd9f6
+		      grub_ia64_add_value_to_slot_20b (addr, noff);
a5bd9f6
 		    }
a5bd9f6
 		    break;
a5bd9f6
 		  case R_IA64_SEGREL64LSB:
a5bd9f6
@@ -250,7 +133,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
a5bd9f6
 		    *(grub_uint64_t *) addr += value - addr;
a5bd9f6
 		    break;
a5bd9f6
 		  case R_IA64_GPREL22:
a5bd9f6
-		    add_value_to_slot_21 (addr, value - (grub_addr_t) gp);
a5bd9f6
+		    grub_ia64_add_value_to_slot_21 (addr, value - (grub_addr_t) gp);
a5bd9f6
 		    break;
a5bd9f6
 
a5bd9f6
 		  case R_IA64_LTOFF22X:
a5bd9f6
@@ -259,7 +142,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
a5bd9f6
 		      value = *(grub_uint64_t *) sym->st_value + rel->r_addend;
a5bd9f6
 		  case R_IA64_LTOFF_FPTR22:
a5bd9f6
 		    *gpptr = value;
a5bd9f6
-		    add_value_to_slot_21 (addr, (grub_addr_t) gpptr - (grub_addr_t) gp);
a5bd9f6
+		    grub_ia64_add_value_to_slot_21 (addr, (grub_addr_t) gpptr - (grub_addr_t) gp);
a5bd9f6
 		    gpptr++;
a5bd9f6
 		    break;
a5bd9f6
 
a5bd9f6
diff --git a/grub-core/kern/ia64/dl_helper.c b/grub-core/kern/ia64/dl_helper.c
a5bd9f6
index 9394e32..e2209ca 100644
a5bd9f6
--- a/grub-core/kern/ia64/dl_helper.c
a5bd9f6
+++ b/grub-core/kern/ia64/dl_helper.c
a5bd9f6
@@ -22,9 +22,154 @@
a5bd9f6
 #include <grub/misc.h>
a5bd9f6
 #include <grub/err.h>
a5bd9f6
 #include <grub/mm.h>
a5bd9f6
+#include <grub/i18n.h>
a5bd9f6
+#include <grub/ia64/reloc.h>
a5bd9f6
 
a5bd9f6
 #pragma GCC diagnostic ignored "-Wcast-align"
a5bd9f6
 
a5bd9f6
+#define MASK20 ((1 << 20) - 1)
a5bd9f6
+#define MASK3 (~(grub_addr_t) 3)
a5bd9f6
+
a5bd9f6
+void
a5bd9f6
+grub_ia64_add_value_to_slot_20b (grub_addr_t addr, grub_uint32_t value)
a5bd9f6
+{
a5bd9f6
+  grub_uint32_t val;
a5bd9f6
+  switch (addr & 3)
a5bd9f6
+    {
a5bd9f6
+    case 0:
a5bd9f6
+      val = grub_le_to_cpu32 (grub_get_unaligned32 (((grub_uint8_t *)
a5bd9f6
+						     (addr & MASK3) + 2)));
a5bd9f6
+      val = (((((val & MASK20) + value) & MASK20) << 2) 
a5bd9f6
+	    | (val & ~(MASK20 << 2)));
a5bd9f6
+      grub_set_unaligned32 (((grub_uint8_t *) (addr & MASK3) + 2),
a5bd9f6
+			    grub_cpu_to_le32 (val));
a5bd9f6
+      break;
a5bd9f6
+    case 1:
a5bd9f6
+      val = grub_le_to_cpu32 (grub_get_unaligned32 (((grub_uint8_t *)
a5bd9f6
+						     (addr & MASK3) + 7)));
a5bd9f6
+      val = ((((((val >> 3) & MASK20) + value) & MASK20) << 3)
a5bd9f6
+	    | (val & ~(MASK20 << 3)));
a5bd9f6
+      grub_set_unaligned32 (((grub_uint8_t *) (addr & MASK3) + 7),
a5bd9f6
+			    grub_cpu_to_le32 (val));
a5bd9f6
+      break;
a5bd9f6
+    case 2:
a5bd9f6
+      val = grub_le_to_cpu32 (grub_get_unaligned32 (((grub_uint8_t *)
a5bd9f6
+						     (addr & MASK3) + 12)));
a5bd9f6
+      val = ((((((val >> 4) & MASK20) + value) & MASK20) << 4)
a5bd9f6
+	    | (val & ~(MASK20 << 4)));
a5bd9f6
+      grub_set_unaligned32 (((grub_uint8_t *) (addr & MASK3) + 12),
a5bd9f6
+			    grub_cpu_to_le32 (val));
a5bd9f6
+      break;
a5bd9f6
+    }
a5bd9f6
+}
a5bd9f6
+
a5bd9f6
+#define MASKF21 ( ((1 << 23) - 1) & ~((1 << 7) | (1 << 8)) )
a5bd9f6
+
a5bd9f6
+static grub_uint32_t
a5bd9f6
+add_value_to_slot_21_real (grub_uint32_t a, grub_uint32_t value)
a5bd9f6
+{
a5bd9f6
+  grub_uint32_t high, mid, low, c;
a5bd9f6
+  low  = (a & 0x00007f);
a5bd9f6
+  mid  = (a & 0x7fc000) >> 7;
a5bd9f6
+  high = (a & 0x003e00) << 7;
a5bd9f6
+  c = (low | mid | high) + value;
a5bd9f6
+  return (c & 0x7f) | ((c << 7) & 0x7fc000) | ((c >> 7) & 0x0003e00); //0x003e00
a5bd9f6
+}
a5bd9f6
+
a5bd9f6
+void
a5bd9f6
+grub_ia64_add_value_to_slot_21 (grub_addr_t addr, grub_uint32_t value)
a5bd9f6
+{
a5bd9f6
+  grub_uint32_t val;
a5bd9f6
+  switch (addr & 3)
a5bd9f6
+    {
a5bd9f6
+    case 0:
a5bd9f6
+      val = grub_le_to_cpu32 (grub_get_unaligned32 (((grub_uint8_t *)
a5bd9f6
+						     (addr & MASK3) + 2)));
a5bd9f6
+      val = ((add_value_to_slot_21_real (((val >> 2) & MASKF21), value)
a5bd9f6
+	      & MASKF21) << 2) | (val & ~(MASKF21 << 2));
a5bd9f6
+      grub_set_unaligned32 (((grub_uint8_t *) (addr & MASK3) + 2),
a5bd9f6
+			    grub_cpu_to_le32 (val));
a5bd9f6
+      break;
a5bd9f6
+    case 1:
a5bd9f6
+      val = grub_le_to_cpu32 (grub_get_unaligned32 (((grub_uint8_t *)
a5bd9f6
+						     (addr & MASK3) + 7)));
a5bd9f6
+      val = ((add_value_to_slot_21_real (((val >> 3) & MASKF21), value)
a5bd9f6
+	      & MASKF21) << 3) | (val & ~(MASKF21 << 3));
a5bd9f6
+      grub_set_unaligned32 (((grub_uint8_t *) (addr & MASK3) + 7),
a5bd9f6
+			    grub_cpu_to_le32 (val));
a5bd9f6
+      break;
a5bd9f6
+    case 2:
a5bd9f6
+      val = grub_le_to_cpu32 (grub_get_unaligned32 (((grub_uint8_t *)
a5bd9f6
+						     (addr & MASK3) + 12)));
a5bd9f6
+      val = ((add_value_to_slot_21_real (((val >> 4) & MASKF21), value)
a5bd9f6
+	      & MASKF21) << 4) | (val & ~(MASKF21 << 4));
a5bd9f6
+      grub_set_unaligned32 (((grub_uint8_t *) (addr & MASK3) + 12),
a5bd9f6
+			    grub_cpu_to_le32 (val));
a5bd9f6
+      break;
a5bd9f6
+    }
a5bd9f6
+}
a5bd9f6
+
a5bd9f6
+static const grub_uint8_t nopm[5] =
a5bd9f6
+  {
a5bd9f6
+    /* [MLX]       nop.m 0x0 */
a5bd9f6
+    0x05, 0x00, 0x00, 0x00, 0x01
a5bd9f6
+  };
a5bd9f6
+
a5bd9f6
+#ifdef GRUB_UTIL
a5bd9f6
+static grub_uint8_t jump[0x20] =
a5bd9f6
+  {
a5bd9f6
+    /* [MMI]       add r15=r15,r1;; */
a5bd9f6
+    0x0b, 0x78, 0x3c, 0x02, 0x00, 0x20,
a5bd9f6
+    /* ld8 r16=[r15],8 */
a5bd9f6
+    0x00, 0x41, 0x3c, 0x30, 0x28, 0xc0,
a5bd9f6
+    /* mov r14=r1;; */
a5bd9f6
+    0x01, 0x08, 0x00, 0x84,
a5bd9f6
+    /* 	[MIB]       ld8 r1=[r15] */
a5bd9f6
+    0x11, 0x08, 0x00, 0x1e, 0x18, 0x10,
a5bd9f6
+    /* mov b6=r16 */
a5bd9f6
+    0x60, 0x80, 0x04, 0x80, 0x03, 0x00, 
a5bd9f6
+    /* br.few b6;; */
a5bd9f6
+    0x60, 0x00, 0x80, 0x00       	            
a5bd9f6
+  };
a5bd9f6
+#else
a5bd9f6
+static const grub_uint8_t jump[0x20] =
a5bd9f6
+  {
a5bd9f6
+    /* ld8 r16=[r15],8 */
a5bd9f6
+    0x02, 0x80, 0x20, 0x1e, 0x18, 0x14,
a5bd9f6
+    /* mov r14=r1;; */
a5bd9f6
+    0xe0, 0x00, 0x04, 0x00, 0x42, 0x00,
a5bd9f6
+    /* nop.i 0x0 */
a5bd9f6
+    0x00, 0x00, 0x04, 0x00,
a5bd9f6
+    /* ld8 r1=[r15] */
a5bd9f6
+    0x11, 0x08, 0x00, 0x1e, 0x18, 0x10,
a5bd9f6
+    /* mov b6=r16 */
a5bd9f6
+    0x60, 0x80, 0x04, 0x80, 0x03, 0x00,
a5bd9f6
+    /* br.few b6;; */
a5bd9f6
+    0x60, 0x00, 0x80, 0x00
a5bd9f6
+  };
a5bd9f6
+#endif
a5bd9f6
+
a5bd9f6
+void
a5bd9f6
+grub_ia64_make_trampoline (struct grub_ia64_trampoline *tr, grub_uint64_t addr)
a5bd9f6
+{
a5bd9f6
+  COMPILE_TIME_ASSERT (sizeof (struct grub_ia64_trampoline)
a5bd9f6
+		       == GRUB_IA64_DL_TRAMP_SIZE);
a5bd9f6
+  grub_memcpy (tr->nop, nopm, sizeof (tr->nop));
a5bd9f6
+  tr->addr_hi[0] = ((addr & 0xc00000) >> 16);
a5bd9f6
+  tr->addr_hi[1] = (addr >> 24) & 0xff;
a5bd9f6
+  tr->addr_hi[2] = (addr >> 32) & 0xff;
a5bd9f6
+  tr->addr_hi[3] = (addr >> 40) & 0xff;
a5bd9f6
+  tr->addr_hi[4] = (addr >> 48) & 0xff;
a5bd9f6
+  tr->addr_hi[5] = (addr >> 56) & 0xff;
a5bd9f6
+  tr->e0 = 0xe0;
a5bd9f6
+  tr->addr_lo[0] = ((addr & 0x000f) << 4) | 0x01;
a5bd9f6
+  tr->addr_lo[1] = (((addr & 0x0070) >> 4) | ((addr & 0x070000) >> 11)
a5bd9f6
+		    | ((addr & 0x200000) >> 17));
a5bd9f6
+  tr->addr_lo[2] = ((addr & 0x1f80) >> 5) | ((addr & 0x180000) >> 19);
a5bd9f6
+  tr->addr_lo[3] = ((addr & 0xe000) >> 13) | 0x60;
a5bd9f6
+  grub_memcpy (tr->jump, jump, sizeof (tr->jump));
a5bd9f6
+}
a5bd9f6
+
a5bd9f6
 void
a5bd9f6
 grub_ia64_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
a5bd9f6
 				 grub_size_t *got)
a5bd9f6
@@ -35,26 +180,26 @@ grub_ia64_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
a5bd9f6
   unsigned i;
a5bd9f6
 
a5bd9f6
   /* Find a symbol table.  */
a5bd9f6
-  for (i = 0, s = (Elf64_Shdr *) ((char *) e + grub_le_to_cpu32 (e->e_shoff));
a5bd9f6
+  for (i = 0, s = (Elf64_Shdr *) ((char *) e + grub_le_to_cpu64 (e->e_shoff));
a5bd9f6
        i < grub_le_to_cpu16 (e->e_shnum);
a5bd9f6
        i++, s = (Elf64_Shdr *) ((char *) s + grub_le_to_cpu16 (e->e_shentsize)))
a5bd9f6
-    if (grub_le_to_cpu32 (s->sh_type) == SHT_SYMTAB)
a5bd9f6
+    if (s->sh_type == grub_cpu_to_le32_compile_time (SHT_SYMTAB))
a5bd9f6
       break;
a5bd9f6
 
a5bd9f6
   if (i == grub_le_to_cpu16 (e->e_shnum))
a5bd9f6
     return;
a5bd9f6
 
a5bd9f6
-  for (i = 0, s = (Elf64_Shdr *) ((char *) e + grub_le_to_cpu32 (e->e_shoff));
a5bd9f6
+  for (i = 0, s = (Elf64_Shdr *) ((char *) e + grub_le_to_cpu64 (e->e_shoff));
a5bd9f6
        i < grub_le_to_cpu16 (e->e_shnum);
a5bd9f6
        i++, s = (Elf64_Shdr *) ((char *) s + grub_le_to_cpu16 (e->e_shentsize)))
a5bd9f6
-    if (grub_le_to_cpu32 (s->sh_type) == SHT_RELA)
a5bd9f6
+    if (s->sh_type == grub_cpu_to_le32_compile_time (SHT_RELA))
a5bd9f6
       {
a5bd9f6
 	Elf64_Rela *rel, *max;
a5bd9f6
 
a5bd9f6
-	for (rel = (Elf64_Rela *) ((char *) e + grub_le_to_cpu32 (s->sh_offset)),
a5bd9f6
-	       max = rel + grub_le_to_cpu32 (s->sh_size) / grub_le_to_cpu16 (s->sh_entsize);
a5bd9f6
+	for (rel = (Elf64_Rela *) ((char *) e + grub_le_to_cpu64 (s->sh_offset)),
a5bd9f6
+	       max = rel + grub_le_to_cpu64 (s->sh_size) / grub_le_to_cpu64 (s->sh_entsize);
a5bd9f6
 	     rel < max; rel++)
a5bd9f6
-	  switch (ELF64_R_TYPE (grub_le_to_cpu32 (rel->r_info)))
a5bd9f6
+	  switch (ELF64_R_TYPE (grub_le_to_cpu64 (rel->r_info)))
a5bd9f6
 	    {
a5bd9f6
 	    case R_IA64_PCREL21B:
a5bd9f6
 	      cntt++;
a5bd9f6
diff --git a/include/grub/ia64/reloc.h b/include/grub/ia64/reloc.h
a5bd9f6
new file mode 100644
a5bd9f6
index 0000000..4c02ab2
a5bd9f6
--- /dev/null
a5bd9f6
+++ b/include/grub/ia64/reloc.h
a5bd9f6
@@ -0,0 +1,42 @@
a5bd9f6
+/*
a5bd9f6
+ *  GRUB  --  GRand Unified Bootloader
a5bd9f6
+ *  Copyright (C) 2013  Free Software Foundation, Inc.
a5bd9f6
+ *
a5bd9f6
+ *  GRUB is free software: you can redistribute it and/or modify
a5bd9f6
+ *  it under the terms of the GNU General Public License as published by
a5bd9f6
+ *  the Free Software Foundation, either version 3 of the License, or
a5bd9f6
+ *  (at your option) any later version.
a5bd9f6
+ *
a5bd9f6
+ *  GRUB is distributed in the hope that it will be useful,
a5bd9f6
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
a5bd9f6
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
a5bd9f6
+ *  GNU General Public License for more details.
a5bd9f6
+ *
a5bd9f6
+ *  You should have received a copy of the GNU General Public License
a5bd9f6
+ *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
a5bd9f6
+ */
a5bd9f6
+
a5bd9f6
+#ifndef GRUB_IA64_RELOC_H
a5bd9f6
+#define GRUB_IA64_RELOC_H 1
a5bd9f6
+
a5bd9f6
+struct grub_ia64_trampoline;
a5bd9f6
+
a5bd9f6
+void
a5bd9f6
+grub_ia64_add_value_to_slot_20b (grub_addr_t addr, grub_uint32_t value);
a5bd9f6
+void
a5bd9f6
+grub_ia64_add_value_to_slot_21 (grub_addr_t addr, grub_uint32_t value);
a5bd9f6
+void
a5bd9f6
+grub_ia64_make_trampoline (struct grub_ia64_trampoline *tr, grub_uint64_t addr);
a5bd9f6
+
a5bd9f6
+struct grub_ia64_trampoline
a5bd9f6
+{
a5bd9f6
+  /* nop.m */
a5bd9f6
+  grub_uint8_t nop[5];
a5bd9f6
+  /* movl r15 = addr*/
a5bd9f6
+  grub_uint8_t addr_hi[6];
a5bd9f6
+  grub_uint8_t e0;
a5bd9f6
+  grub_uint8_t addr_lo[4];
a5bd9f6
+  grub_uint8_t jump[0x20];
a5bd9f6
+};
a5bd9f6
+
a5bd9f6
+#endif
a5bd9f6
diff --git a/util/grub-mkimage.c b/util/grub-mkimage.c
a5bd9f6
index ecea5d4..dce2c29 100644
a5bd9f6
--- a/util/grub-mkimage.c
a5bd9f6
+++ b/util/grub-mkimage.c
a5bd9f6
@@ -40,6 +40,7 @@
a5bd9f6
 #include <stdlib.h>
a5bd9f6
 #include <assert.h>
a5bd9f6
 #include <grub/efi/pe32.h>
a5bd9f6
+#include <grub/ia64/reloc.h>
a5bd9f6
 
a5bd9f6
 #define _GNU_SOURCE	1
a5bd9f6
 #include <argp.h>
a5bd9f6
@@ -1201,10 +1202,10 @@ generate_image (const char *dir, const char *prefix,
a5bd9f6
 	    o->subsystem = grub_host_to_target16 (GRUB_PE32_SUBSYSTEM_EFI_APPLICATION);
a5bd9f6
 
a5bd9f6
 	    /* Do these really matter? */
a5bd9f6
-	    o->stack_reserve_size = grub_host_to_target32 (0x10000);
a5bd9f6
-	    o->stack_commit_size = grub_host_to_target32 (0x10000);
a5bd9f6
-	    o->heap_reserve_size = grub_host_to_target32 (0x10000);
a5bd9f6
-	    o->heap_commit_size = grub_host_to_target32 (0x10000);
a5bd9f6
+	    o->stack_reserve_size = grub_host_to_target64 (0x10000);
a5bd9f6
+	    o->stack_commit_size = grub_host_to_target64 (0x10000);
a5bd9f6
+	    o->heap_reserve_size = grub_host_to_target64 (0x10000);
a5bd9f6
+	    o->heap_commit_size = grub_host_to_target64 (0x10000);
a5bd9f6
     
a5bd9f6
 	    o->num_data_directories
a5bd9f6
 	      = grub_host_to_target32 (GRUB_PE32_NUM_DATA_DIRECTORIES);
a5bd9f6
diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c
a5bd9f6
index 476d05e..b6b263d 100644
a5bd9f6
--- a/util/grub-mkimagexx.c
a5bd9f6
+++ b/util/grub-mkimagexx.c
a5bd9f6
@@ -117,7 +117,7 @@ SUFFIX (relocate_symbols) (Elf_Ehdr *e, Elf_Shdr *sections,
a5bd9f6
       if (image_target->elf_target == EM_IA_64 && ELF_ST_TYPE (sym->st_info)
a5bd9f6
 	  == STT_FUNC)
a5bd9f6
 	{
a5bd9f6
-	  *jptr = sym->st_value;
a5bd9f6
+	  *jptr = grub_host_to_target64 (sym->st_value);
a5bd9f6
 	  sym->st_value = (char *) jptr - (char *) jumpers + jumpers_addr;
a5bd9f6
 	  jptr++;
a5bd9f6
 	  *jptr = 0;
a5bd9f6
@@ -143,8 +143,8 @@ SUFFIX (get_symbol_address) (Elf_Ehdr *e, Elf_Shdr *s, Elf_Word i,
a5bd9f6
   Elf_Sym *sym;
a5bd9f6
 
a5bd9f6
   sym = (Elf_Sym *) ((char *) e
a5bd9f6
-		       + grub_target_to_host32 (s->sh_offset)
a5bd9f6
-		       + i * grub_target_to_host32 (s->sh_entsize));
a5bd9f6
+		       + grub_target_to_host (s->sh_offset)
a5bd9f6
+		       + i * grub_target_to_host (s->sh_entsize));
a5bd9f6
   return sym->st_value;
a5bd9f6
 }
a5bd9f6
 
a5bd9f6
@@ -153,7 +153,7 @@ static Elf_Addr *
a5bd9f6
 SUFFIX (get_target_address) (Elf_Ehdr *e, Elf_Shdr *s, Elf_Addr offset,
a5bd9f6
 		    struct image_target_desc *image_target)
a5bd9f6
 {
a5bd9f6
-  return (Elf_Addr *) ((char *) e + grub_target_to_host32 (s->sh_offset) + offset);
a5bd9f6
+  return (Elf_Addr *) ((char *) e + grub_target_to_host (s->sh_offset) + offset);
a5bd9f6
 }
a5bd9f6
 
a5bd9f6
 #ifdef MKIMAGE_ELF64
a5bd9f6
@@ -182,128 +182,6 @@ SUFFIX (count_funcs) (Elf_Ehdr *e, Elf_Shdr *symtab_section,
a5bd9f6
 }
a5bd9f6
 #endif
a5bd9f6
 
a5bd9f6
-#ifdef MKIMAGE_ELF64
a5bd9f6
-struct unaligned_uint32
a5bd9f6
-{
a5bd9f6
-  grub_uint32_t val;
a5bd9f6
-}  __attribute__ ((packed));
a5bd9f6
-
a5bd9f6
-#define MASK20 ((1 << 20) - 1)
a5bd9f6
-#define MASK19 ((1 << 19) - 1)
a5bd9f6
-#define MASK3 (~(grub_addr_t) 3)
a5bd9f6
-
a5bd9f6
-static void
a5bd9f6
-add_value_to_slot_20b (grub_addr_t addr, grub_uint32_t value)
a5bd9f6
-{
a5bd9f6
-  struct unaligned_uint32 *p;
a5bd9f6
-  switch (addr & 3)
a5bd9f6
-    {
a5bd9f6
-    case 0:
a5bd9f6
-      p = (struct unaligned_uint32 *) ((addr & MASK3) + 2);
a5bd9f6
-      p->val = ((((((p->val >> 2) & MASK20) + value) & MASK20) << 2) 
a5bd9f6
-		| (p->val & ~(MASK20 << 2)));
a5bd9f6
-      break;
a5bd9f6
-    case 1:
a5bd9f6
-      p = (struct unaligned_uint32 *) ((grub_uint8_t *) (addr & MASK3) + 7);
a5bd9f6
-      p->val = ((((((p->val >> 3) & MASK20) + value) & MASK20) << 3)
a5bd9f6
-		| (p->val & ~(MASK20 << 3)));
a5bd9f6
-      break;
a5bd9f6
-    case 2:
a5bd9f6
-      p = (struct unaligned_uint32 *) ((grub_uint8_t *) (addr & MASK3) + 12);
a5bd9f6
-      p->val = ((((((p->val >> 4) & MASK20) + value) & MASK20) << 4)
a5bd9f6
-		| (p->val & ~(MASK20 << 4)));
a5bd9f6
-      break;
a5bd9f6
-    }
a5bd9f6
-}
a5bd9f6
-
a5bd9f6
-#define MASKF21 ( ((1 << 23) - 1) & ~((1 << 7) | (1 << 8)) )
a5bd9f6
-
a5bd9f6
-static grub_uint32_t
a5bd9f6
-add_value_to_slot_21_real (grub_uint32_t a, grub_uint32_t value)
a5bd9f6
-{
a5bd9f6
-  grub_uint32_t high, mid, low, c;
a5bd9f6
-  low  = (a & 0x00007f);
a5bd9f6
-  mid  = (a & 0x7fc000) >> 7;
a5bd9f6
-  high = (a & 0x003e00) << 7;
a5bd9f6
-  c = (low | mid | high) + value;
a5bd9f6
-  return (c & 0x7f) | ((c << 7) & 0x7fc000) | ((c >> 7) & 0x0003e00); //0x003e00
a5bd9f6
-}
a5bd9f6
-
a5bd9f6
-static void
a5bd9f6
-add_value_to_slot_21 (grub_addr_t addr, grub_uint32_t value)
a5bd9f6
-{
a5bd9f6
-  struct unaligned_uint32 *p;
a5bd9f6
-  switch (addr & 3)
a5bd9f6
-    {
a5bd9f6
-    case 0:
a5bd9f6
-      p = (struct unaligned_uint32 *) ((addr & MASK3) + 2);
a5bd9f6
-      p->val = ((add_value_to_slot_21_real (((p->val >> 2) & MASKF21), value) & MASKF21) << 2) | (p->val & ~(MASKF21 << 2));
a5bd9f6
-      break;
a5bd9f6
-    case 1:
a5bd9f6
-      p = (struct unaligned_uint32 *) ((grub_uint8_t *) (addr & MASK3) + 7);
a5bd9f6
-      p->val = ((add_value_to_slot_21_real (((p->val >> 3) & MASKF21), value) & MASKF21) << 3) | (p->val & ~(MASKF21 << 3));
a5bd9f6
-      break;
a5bd9f6
-    case 2:
a5bd9f6
-      p = (struct unaligned_uint32 *) ((grub_uint8_t *) (addr & MASK3) + 12);
a5bd9f6
-      p->val = ((add_value_to_slot_21_real (((p->val >> 4) & MASKF21), value) & MASKF21) << 4) | (p->val & ~(MASKF21 << 4));
a5bd9f6
-      break;
a5bd9f6
-    }
a5bd9f6
-}
a5bd9f6
-
a5bd9f6
-
a5bd9f6
-struct ia64_kernel_trampoline
a5bd9f6
-{
a5bd9f6
-  /* nop.m */
a5bd9f6
-  grub_uint8_t nop[5];
a5bd9f6
-  /* movl r15 = addr*/
a5bd9f6
-  grub_uint8_t addr_hi[6];
a5bd9f6
-  grub_uint8_t e0;
a5bd9f6
-  grub_uint8_t addr_lo[4];
a5bd9f6
-  grub_uint8_t jump[0x20];
a5bd9f6
-};
a5bd9f6
-
a5bd9f6
-static grub_uint8_t nopm[5] =
a5bd9f6
-  {
a5bd9f6
-    /* [MLX]       nop.m 0x0 */
a5bd9f6
-    0x05, 0x00, 0x00, 0x00, 0x01
a5bd9f6
-  };
a5bd9f6
-
a5bd9f6
-static grub_uint8_t jump[0x20] =
a5bd9f6
-  {
a5bd9f6
-    /* [MMI]       add r15=r15,r1;; */
a5bd9f6
-    0x0b, 0x78, 0x3c, 0x02, 0x00, 0x20,
a5bd9f6
-    /* ld8 r16=[r15],8 */
a5bd9f6
-    0x00, 0x41, 0x3c, 0x30, 0x28, 0xc0,
a5bd9f6
-    /* mov r14=r1;; */
a5bd9f6
-    0x01, 0x08, 0x00, 0x84,
a5bd9f6
-    /* 	[MIB]       ld8 r1=[r15] */
a5bd9f6
-    0x11, 0x08, 0x00, 0x1e, 0x18, 0x10,
a5bd9f6
-    /* mov b6=r16 */
a5bd9f6
-    0x60, 0x80, 0x04, 0x80, 0x03, 0x00, 
a5bd9f6
-    /* br.few b6;; */
a5bd9f6
-    0x60, 0x00, 0x80, 0x00       	            
a5bd9f6
-  };
a5bd9f6
-
a5bd9f6
-static void
a5bd9f6
-make_trampoline (struct ia64_kernel_trampoline *tr, grub_uint64_t addr)
a5bd9f6
-{
a5bd9f6
-  grub_memcpy (tr->nop, nopm, sizeof (tr->nop));
a5bd9f6
-  tr->addr_hi[0] = ((addr & 0xc00000) >> 16);
a5bd9f6
-  tr->addr_hi[1] = (addr >> 24) & 0xff;
a5bd9f6
-  tr->addr_hi[2] = (addr >> 32) & 0xff;
a5bd9f6
-  tr->addr_hi[3] = (addr >> 40) & 0xff;
a5bd9f6
-  tr->addr_hi[4] = (addr >> 48) & 0xff;
a5bd9f6
-  tr->addr_hi[5] = (addr >> 56) & 0xff;
a5bd9f6
-  tr->e0 = 0xe0;
a5bd9f6
-  tr->addr_lo[0] = ((addr & 0x000f) << 4) | 0x01;
a5bd9f6
-  tr->addr_lo[1] = (((addr & 0x0070) >> 4) | ((addr & 0x070000) >> 11)
a5bd9f6
-		    | ((addr & 0x200000) >> 17));
a5bd9f6
-  tr->addr_lo[2] = ((addr & 0x1f80) >> 5) | ((addr & 0x180000) >> 19);
a5bd9f6
-  tr->addr_lo[3] = ((addr & 0xe000) >> 13) | 0x60;
a5bd9f6
-  grub_memcpy (tr->jump, jump, sizeof (tr->jump));
a5bd9f6
-}
a5bd9f6
-#endif
a5bd9f6
-
a5bd9f6
 /* Deal with relocation information. This function relocates addresses
a5bd9f6
    within the virtual address space starting from 0. So only relative
a5bd9f6
    addresses can be fully resolved. Absolute addresses must be relocated
a5bd9f6
@@ -320,8 +198,9 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections,
a5bd9f6
   Elf_Half i;
a5bd9f6
   Elf_Shdr *s;
a5bd9f6
 #ifdef MKIMAGE_ELF64
a5bd9f6
-  struct ia64_kernel_trampoline *tr = (void *) (pe_target + tramp_off);
a5bd9f6
+  struct grub_ia64_trampoline *tr = (void *) (pe_target + tramp_off);
a5bd9f6
   grub_uint64_t *gpptr = (void *) (pe_target + got_off);
a5bd9f6
+#define MASK19 ((1 << 19) - 1)
a5bd9f6
 #endif
a5bd9f6
 
a5bd9f6
   for (i = 0, s = sections;
a5bd9f6
@@ -352,9 +231,9 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections,
a5bd9f6
 			strtab + grub_target_to_host32 (s->sh_name),
a5bd9f6
 			strtab + grub_target_to_host32 (target_section->sh_name));
a5bd9f6
 
a5bd9f6
-	rtab_size = grub_target_to_host32 (s->sh_size);
a5bd9f6
-	r_size = grub_target_to_host32 (s->sh_entsize);
a5bd9f6
-	rtab_offset = grub_target_to_host32 (s->sh_offset);
a5bd9f6
+	rtab_size = grub_target_to_host (s->sh_size);
a5bd9f6
+	r_size = grub_target_to_host (s->sh_entsize);
a5bd9f6
+	rtab_offset = grub_target_to_host (s->sh_offset);
a5bd9f6
 	num_rs = rtab_size / r_size;
a5bd9f6
 
a5bd9f6
 	for (j = 0, r = (Elf_Rela *) ((char *) e + rtab_offset);
a5bd9f6
@@ -375,7 +254,7 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections,
a5bd9f6
 						    ELF_R_SYM (info), image_target);
a5bd9f6
 
a5bd9f6
             addend = (s->sh_type == grub_target_to_host32 (SHT_RELA)) ?
a5bd9f6
-	      r->r_addend : 0;
a5bd9f6
+	      grub_target_to_host (r->r_addend) : 0;
a5bd9f6
 
a5bd9f6
 	   switch (image_target->elf_target)
a5bd9f6
 	     {
a5bd9f6
@@ -461,14 +340,14 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections,
a5bd9f6
 		case R_IA64_PCREL21B:
a5bd9f6
 		  {
a5bd9f6
 		    grub_uint64_t noff;
a5bd9f6
-		    make_trampoline (tr, addend + sym_addr);
a5bd9f6
+		    grub_ia64_make_trampoline (tr, addend + sym_addr);
a5bd9f6
 		    noff = ((char *) tr - (char *) pe_target
a5bd9f6
 			    - target_section_addr - (offset & ~3)) >> 4;
a5bd9f6
 		    tr++;
a5bd9f6
 		    if (noff & ~MASK19)
a5bd9f6
 		      grub_util_error ("trampoline offset too big (%"
a5bd9f6
 				       PRIxGRUB_UINT64_T ")", noff);
a5bd9f6
-		    add_value_to_slot_20b ((grub_addr_t) target, noff);
a5bd9f6
+		    grub_ia64_add_value_to_slot_20b ((grub_addr_t) target, noff);
a5bd9f6
 		  }
a5bd9f6
 		  break;
a5bd9f6
 
a5bd9f6
@@ -478,8 +357,8 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections,
a5bd9f6
 		    Elf_Sym *sym;
a5bd9f6
 
a5bd9f6
 		    sym = (Elf_Sym *) ((char *) e
a5bd9f6
-				       + grub_target_to_host32 (symtab_section->sh_offset)
a5bd9f6
-				       + ELF_R_SYM (info) * grub_target_to_host32 (symtab_section->sh_entsize));
a5bd9f6
+				       + grub_target_to_host (symtab_section->sh_offset)
a5bd9f6
+				       + ELF_R_SYM (info) * grub_target_to_host (symtab_section->sh_entsize));
a5bd9f6
 		    if (ELF_ST_TYPE (sym->st_info) == STT_FUNC)
a5bd9f6
 		      sym_addr = grub_target_to_host64 (*(grub_uint64_t *) (pe_target
a5bd9f6
 									    + sym->st_value
a5bd9f6
@@ -487,15 +366,15 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections,
a5bd9f6
 		  }
a5bd9f6
 		case R_IA64_LTOFF_FPTR22:
a5bd9f6
 		  *gpptr = grub_host_to_target64 (addend + sym_addr);
a5bd9f6
-		  add_value_to_slot_21 ((grub_addr_t) target,
a5bd9f6
-					(char *) gpptr - (char *) pe_target
a5bd9f6
-					+ image_target->vaddr_offset);
a5bd9f6
+		  grub_ia64_add_value_to_slot_21 ((grub_addr_t) target,
a5bd9f6
+						  (char *) gpptr - (char *) pe_target
a5bd9f6
+						  + image_target->vaddr_offset);
a5bd9f6
 		  gpptr++;
a5bd9f6
 		  break;
a5bd9f6
 
a5bd9f6
 		case R_IA64_GPREL22:
a5bd9f6
-		  add_value_to_slot_21 ((grub_addr_t) target,
a5bd9f6
-					addend + sym_addr);
a5bd9f6
+		  grub_ia64_add_value_to_slot_21 ((grub_addr_t) target,
a5bd9f6
+						  addend + sym_addr);
a5bd9f6
 		  break;
a5bd9f6
 		case R_IA64_PCREL64LSB:
a5bd9f6
 		  *target = grub_host_to_target64 (grub_target_to_host64 (*target)
a5bd9f6
@@ -514,7 +393,8 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections,
a5bd9f6
 						   + addend + sym_addr);
a5bd9f6
 		  grub_util_info ("relocating a direct entry to 0x%"
a5bd9f6
 				  PRIxGRUB_UINT64_T " at the offset 0x%llx",
a5bd9f6
-				  *target, (unsigned long long) offset);
a5bd9f6
+				  grub_target_to_host64 (*target),
a5bd9f6
+				  (unsigned long long) offset);
a5bd9f6
 		  break;
a5bd9f6
 
a5bd9f6
 		  /* We treat LTOFF22X as LTOFF22, so we can ignore LDXMOV.  */
a5bd9f6
@@ -650,8 +530,8 @@ SUFFIX (make_reloc_section) (Elf_Ehdr *e, void **out,
a5bd9f6
 
a5bd9f6
   for (i = 0, s = sections; i < num_sections;
a5bd9f6
        i++, s = (Elf_Shdr *) ((char *) s + section_entsize))
a5bd9f6
-    if ((s->sh_type == grub_cpu_to_le32 (SHT_REL)) ||
a5bd9f6
-        (s->sh_type == grub_cpu_to_le32 (SHT_RELA)))
a5bd9f6
+    if ((grub_target_to_host32 (s->sh_type) == SHT_REL) ||
a5bd9f6
+        (grub_target_to_host32 (s->sh_type) == SHT_RELA))
a5bd9f6
       {
a5bd9f6
 	Elf_Rel *r;
a5bd9f6
 	Elf_Word rtab_size, r_size, num_rs;
a5bd9f6
@@ -662,9 +542,9 @@ SUFFIX (make_reloc_section) (Elf_Ehdr *e, void **out,
a5bd9f6
 	grub_util_info ("translating the relocation section %s",
a5bd9f6
 			strtab + grub_le_to_cpu32 (s->sh_name));
a5bd9f6
 
a5bd9f6
-	rtab_size = grub_le_to_cpu32 (s->sh_size);
a5bd9f6
-	r_size = grub_le_to_cpu32 (s->sh_entsize);
a5bd9f6
-	rtab_offset = grub_le_to_cpu32 (s->sh_offset);
a5bd9f6
+	rtab_size = grub_target_to_host (s->sh_size);
a5bd9f6
+	r_size = grub_target_to_host (s->sh_entsize);
a5bd9f6
+	rtab_offset = grub_target_to_host (s->sh_offset);
a5bd9f6
 	num_rs = rtab_size / r_size;
a5bd9f6
 
a5bd9f6
 	section_address = section_addresses[grub_le_to_cpu32 (s->sh_info)];
a5bd9f6
@@ -676,8 +556,8 @@ SUFFIX (make_reloc_section) (Elf_Ehdr *e, void **out,
a5bd9f6
 	    Elf_Addr info;
a5bd9f6
 	    Elf_Addr offset;
a5bd9f6
 
a5bd9f6
-	    offset = grub_le_to_cpu32 (r->r_offset);
a5bd9f6
-	    info = grub_le_to_cpu32 (r->r_info);
a5bd9f6
+	    offset = grub_target_to_host (r->r_offset);
a5bd9f6
+	    info = grub_target_to_host (r->r_info);
a5bd9f6
 
a5bd9f6
 	    /* Necessary to relocate only absolute addresses.  */
a5bd9f6
 	    switch (image_target->elf_target)
a5bd9f6
@@ -1027,7 +907,7 @@ SUFFIX (load_image) (const char *kernel_path, grub_size_t *exec_size,
a5bd9f6
 	  *kernel_sz = ALIGN_UP (*kernel_sz, 16);
a5bd9f6
 
a5bd9f6
 	  grub_ia64_dl_get_tramp_got_size (e, &tramp, &got;;
a5bd9f6
-	  tramp *= sizeof (struct ia64_kernel_trampoline);
a5bd9f6
+	  tramp *= sizeof (struct grub_ia64_trampoline);
a5bd9f6
 
a5bd9f6
 	  ia64_toff = *kernel_sz;
a5bd9f6
 	  *kernel_sz += ALIGN_UP (tramp, 16);
a5bd9f6
-- 
a5bd9f6
1.8.1.4
a5bd9f6