]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Adjust mips/dl.c for bigendian
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 13 May 2011 13:38:42 +0000 (15:38 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 13 May 2011 13:38:42 +0000 (15:38 +0200)
grub-core/kern/mips/dl.c

index e17e9f30bd4a5a984514a8d10bb29bb1e840e62f..e4ce12157b82124c37c1a1e03ad59bf4b1b57af7 100644 (file)
@@ -34,7 +34,7 @@ grub_arch_dl_check_header (void *ehdr)
   Elf_Ehdr *e = ehdr;
 
   /* Check the magic numbers.  */
-#ifdef WORDS_BIGENDIAN
+#ifdef GRUB_CPU_WORDS_BIGENDIAN
   if (e->e_ident[EI_CLASS] != ELFCLASS32
       || e->e_ident[EI_DATA] != ELFDATA2MSB
       || e->e_machine != EM_MIPS)
@@ -144,14 +144,14 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
                 rel < max;
                 rel++)
              {
-               Elf_Word *addr;
+               grub_uint8_t *addr;
                Elf_Sym *sym;
 
                if (seg->size < rel->r_offset)
                  return grub_error (GRUB_ERR_BAD_MODULE,
                                     "reloc offset is out of the segment");
 
-               addr = (Elf_Word *) ((char *) seg->addr + rel->r_offset);
+               addr = (grub_uint8_t *) ((char *) seg->addr + rel->r_offset);
                sym = (Elf_Sym *) ((char *) mod->symtab
                                     + entsize * ELF_R_SYM (rel->r_info));
                if (sym->st_value == (grub_addr_t) &__gnu_local_gp_dummy)
@@ -163,7 +163,11 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
                    {
                      grub_uint32_t value;
                      Elf_Rel *rel2;
-                     
+
+#ifdef GRUB_CPU_WORDS_BIGENDIAN
+                     addr += 2;
+#endif
+
                      /* Handle partner lo16 relocation. Lower part is
                         treated as signed. Hence add 0x8000 to compensate. 
                       */
@@ -175,13 +179,20 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
                            && ELF_R_TYPE (rel2->r_info) == R_MIPS_LO16)
                          {
                            value += *(grub_int16_t *)
-                             ((char *) seg->addr + rel2->r_offset);
+                             ((char *) seg->addr + rel2->r_offset
+#ifdef GRUB_CPU_WORDS_BIGENDIAN
+                              + 2
+#endif
+                              );
                            break;
                          }
                      *(grub_uint16_t *) addr = (value >> 16) & 0xffff;
                    }
                    break;
                  case R_MIPS_LO16:
+#ifdef GRUB_CPU_WORDS_BIGENDIAN
+                   addr += 2;
+#endif
                    *(grub_uint16_t *) addr += (sym->st_value) & 0xffff;
                    break;
                  case R_MIPS_32:
@@ -208,6 +219,9 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
                  case R_MIPS_GOT16:
                  case R_MIPS_CALL16:
                    /* FIXME: reuse*/
+#ifdef GRUB_CPU_WORDS_BIGENDIAN
+                   addr += 2;
+#endif
                    *gpptr = sym->st_value + *(grub_uint16_t *) addr;
                    *(grub_uint16_t *) addr
                      = sizeof (grub_uint32_t) * (gpptr - gp);