浏览代码

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 <abrodkin@synopsys.com>

Cc: Francois Bedard <fbedard@synopsys.com>
Cc: Tom Rini <trini@ti.com>
cc: Noam Camus <noamc@ezchip.com>
Alexey Brodkin 11 年之前
父节点
当前提交
36ae5cd2a8
共有 1 个文件被更改,包括 4 次插入0 次删除
  1. 4 0
      arch/arc/lib/relocate.c

+ 4 - 0
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",