]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
arc: fix relocation for big-endian target
authorAlexey Brodkin <Alexey.Brodkin@synopsys.com>
Tue, 18 Feb 2014 11:10:58 +0000 (15:10 +0400)
committerTom Rini <trini@ti.com>
Fri, 21 Feb 2014 12:56:42 +0000 (07:56 -0500)
In case of little-endian ARC700 instructions (which may include target
address) are encoded as middle-endian. That's why it's required to swap
bytes after read and ten right before write back.

But in case of big-endian ARC700 instructions are encoded as a plain
big-endian. Thus no need for byte swapping.

Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
Cc: Francois Bedard <fbedard@synopsys.com>
Cc: Tom Rini <trini@ti.com>
cc: Noam Camus <noamc@ezchip.com>

arch/arc/lib/relocate.c

index 956aa1494e1649275044154c26b31de5c090ff17..2482bcdffcc33103e913a5dc8ee33e0923278b18 100644 (file)
@@ -41,19 +41,23 @@ int do_elf_reloc_fixups(void)
                         */
                        memcpy(&val, offset_ptr_ram, sizeof(int));
 
+#ifdef __LITTLE_ENDIAN__
                        /* If location in ".text" section swap value */
                        if ((unsigned int)offset_ptr_rom <
                            (unsigned int)&__text_end)
                                val = (val << 16) | (val >> 16);
+#endif
 
                        /* Check that the target points into .text */
                        if (val >= CONFIG_SYS_TEXT_BASE && val <=
                            (unsigned int)&__bss_end) {
                                val += gd->reloc_off;
+#ifdef __LITTLE_ENDIAN__
                                /* If location in ".text" section swap value */
                                if ((unsigned int)offset_ptr_rom <
                                    (unsigned int)&__text_end)
                                        val = (val << 16) | (val >> 16);
+#endif
                                memcpy(offset_ptr_ram, &val, sizeof(int));
                        } else {
                                debug("   %p: rom reloc %x, ram %p, value %x, limit %x\n",