From: Alexey Brodkin Date: Tue, 18 Feb 2014 11:10:58 +0000 (+0400) Subject: arc: fix relocation for big-endian target X-Git-Tag: v2014.04-rc2~122 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=36ae5cd2a824597b4c53b045ac0f4c1e3b4eaf65;p=oweals%2Fu-boot.git arc: fix relocation for big-endian target 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 Cc: Francois Bedard Cc: Tom Rini cc: Noam Camus --- diff --git a/arch/arc/lib/relocate.c b/arch/arc/lib/relocate.c index 956aa1494e..2482bcdffc 100644 --- a/arch/arc/lib/relocate.c +++ b/arch/arc/lib/relocate.c @@ -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",