libs/libc/machine/arm: Fix the minor issue in libc arm machine folder; MOVW/MOVT should use zero(not sign) extension.

This commit is contained in:
Xiang Xiao
2019-01-26 11:59:27 -06:00
committed by Gregory Nutt
parent da4ab2af98
commit 8812a3315d
8 changed files with 17 additions and 30 deletions
+2 -3
View File
@@ -170,7 +170,7 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
case R_ARM_CALL: case R_ARM_CALL:
case R_ARM_JUMP24: case R_ARM_JUMP24:
{ {
binfo("Performing PC24 [%d] link at addr %08lx [%08lx] to sym '%s' st_value=%08lx\n", binfo("Performing PC24 [%d] link at addr %08lx [%08lx] to sym '%p' st_value=%08lx\n",
ELF32_R_TYPE(rel->r_info), (long)addr, (long)(*(uint32_t *)addr), ELF32_R_TYPE(rel->r_info), (long)addr, (long)(*(uint32_t *)addr),
sym, (long)sym->st_value); sym, (long)sym->st_value);
@@ -181,7 +181,7 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
} }
offset += sym->st_value - addr; offset += sym->st_value - addr;
if (offset & 3 || offset <= (int32_t) 0xfe000000 || offset >= (int32_t) 0x02000000) if (offset & 3 || offset < (int32_t) 0xfe000000 || offset >= (int32_t) 0x02000000)
{ {
berr("ERROR: PC24 [%d] relocation out of range, offset=%08lx\n", berr("ERROR: PC24 [%d] relocation out of range, offset=%08lx\n",
ELF32_R_TYPE(rel->r_info), offset); ELF32_R_TYPE(rel->r_info), offset);
@@ -240,7 +240,6 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
offset = *(uint32_t *)addr; offset = *(uint32_t *)addr;
offset = ((offset & 0xf0000) >> 4) | (offset & 0xfff); offset = ((offset & 0xf0000) >> 4) | (offset & 0xfff);
offset = (offset ^ 0x8000) - 0x8000;
offset += sym->st_value; offset += sym->st_value;
if (ELF32_R_TYPE(rel->r_info) == R_ARM_MOVT_ABS) if (ELF32_R_TYPE(rel->r_info) == R_ARM_MOVT_ABS)
+4 -9
View File
@@ -166,7 +166,7 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
case R_ARM_CALL: case R_ARM_CALL:
case R_ARM_JUMP24: case R_ARM_JUMP24:
{ {
binfo("Performing PC24 [%d] link at addr %08lx [%08lx] to sym '%s' st_value=%08lx\n", binfo("Performing PC24 [%d] link at addr %08lx [%08lx] to sym '%p' st_value=%08lx\n",
ELF32_R_TYPE(rel->r_info), (long)addr, (long)(*(uint32_t *)addr), ELF32_R_TYPE(rel->r_info), (long)addr, (long)(*(uint32_t *)addr),
sym, (long)sym->st_value); sym, (long)sym->st_value);
@@ -177,7 +177,7 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
} }
offset += sym->st_value - addr; offset += sym->st_value - addr;
if (offset & 3 || offset <= (int32_t) 0xfe000000 || offset >= (int32_t) 0x02000000) if (offset & 3 || offset < (int32_t) 0xfe000000 || offset >= (int32_t) 0x02000000)
{ {
berr("ERROR: ERROR: PC24 [%d] relocation out of range, offset=%08lx\n", berr("ERROR: ERROR: PC24 [%d] relocation out of range, offset=%08lx\n",
ELF32_R_TYPE(rel->r_info), offset); ELF32_R_TYPE(rel->r_info), offset);
@@ -296,9 +296,9 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
/* Check the range of the offset */ /* Check the range of the offset */
if (offset <= (int32_t)0xff000000 || offset >= (int32_t)0x01000000) if (offset < (int32_t)0xff000000 || offset >= (int32_t)0x01000000)
{ {
berr("ERROR: ERROR: JUMP24 [%d] relocation out of range, branch taget=%08lx\n", berr("ERROR: ERROR: JUMP24 [%d] relocation out of range, branch target=%08lx\n",
ELF32_R_TYPE(rel->r_info), offset); ELF32_R_TYPE(rel->r_info), offset);
return -EINVAL; return -EINVAL;
@@ -357,7 +357,6 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
offset = *(uint32_t *)addr; offset = *(uint32_t *)addr;
offset = ((offset & 0xf0000) >> 4) | (offset & 0xfff); offset = ((offset & 0xf0000) >> 4) | (offset & 0xfff);
offset = (offset ^ 0x8000) - 0x8000;
offset += sym->st_value; offset += sym->st_value;
if (ELF32_R_TYPE(rel->r_info) == R_ARM_MOVT_ABS) if (ELF32_R_TYPE(rel->r_info) == R_ARM_MOVT_ABS)
@@ -417,10 +416,6 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
((lower_insn & 0x7000) >> 4) | /* imm3 -> imm16[8:10] */ ((lower_insn & 0x7000) >> 4) | /* imm3 -> imm16[8:10] */
(lower_insn & 0x00ff); /* imm8 -> imm16[0:7] */ (lower_insn & 0x00ff); /* imm8 -> imm16[0:7] */
/* Sign extend */
offset = (offset ^ 0x8000) - 0x8000;
/* And perform the relocation */ /* And perform the relocation */
binfo(" offset=%08lx branch target=%08lx\n", binfo(" offset=%08lx branch target=%08lx\n",
+2 -3
View File
@@ -160,7 +160,7 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
case R_ARM_CALL: case R_ARM_CALL:
case R_ARM_JUMP24: case R_ARM_JUMP24:
{ {
binfo("Performing PC24 [%d] link at addr %08lx [%08lx] to sym '%s' st_value=%08lx\n", binfo("Performing PC24 [%d] link at addr %08lx [%08lx] to sym '%p' st_value=%08lx\n",
ELF32_R_TYPE(rel->r_info), (long)addr, (long)(*(uint32_t *)addr), ELF32_R_TYPE(rel->r_info), (long)addr, (long)(*(uint32_t *)addr),
sym, (long)sym->st_value); sym, (long)sym->st_value);
@@ -171,7 +171,7 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
} }
offset += sym->st_value - addr; offset += sym->st_value - addr;
if (offset & 3 || offset <= (int32_t) 0xfe000000 || offset >= (int32_t) 0x02000000) if (offset & 3 || offset < (int32_t) 0xfe000000 || offset >= (int32_t) 0x02000000)
{ {
berr("ERROR: PC24 [%d] relocation out of range, offset=%08lx\n", berr("ERROR: PC24 [%d] relocation out of range, offset=%08lx\n",
ELF32_R_TYPE(rel->r_info), offset); ELF32_R_TYPE(rel->r_info), offset);
@@ -230,7 +230,6 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
offset = *(uint32_t *)addr; offset = *(uint32_t *)addr;
offset = ((offset & 0xf0000) >> 4) | (offset & 0xfff); offset = ((offset & 0xf0000) >> 4) | (offset & 0xfff);
offset = (offset ^ 0x8000) - 0x8000;
offset += sym->st_value; offset += sym->st_value;
if (ELF32_R_TYPE(rel->r_info) == R_ARM_MOVT_ABS) if (ELF32_R_TYPE(rel->r_info) == R_ARM_MOVT_ABS)
@@ -1,5 +1,5 @@
/************************************************************************************ /************************************************************************************
* libs/libc/machine/arm/armv7-a/arm_memcpy.S * libs/libc/machine/arm/armv7-a/arch_memcpy.S
* ARMv7-A optimized memcpy. * ARMv7-A optimized memcpy.
* *
* Adapted for use with ARMv7-A and NuttX by: * Adapted for use with ARMv7-A and NuttX by:
+4 -9
View File
@@ -154,7 +154,7 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
case R_ARM_CALL: case R_ARM_CALL:
case R_ARM_JUMP24: case R_ARM_JUMP24:
{ {
binfo("Performing PC24 [%d] link at addr %08lx [%08lx] to sym '%s' st_value=%08lx\n", binfo("Performing PC24 [%d] link at addr %08lx [%08lx] to sym '%p' st_value=%08lx\n",
ELF32_R_TYPE(rel->r_info), (long)addr, (long)(*(uint32_t *)addr), ELF32_R_TYPE(rel->r_info), (long)addr, (long)(*(uint32_t *)addr),
sym, (long)sym->st_value); sym, (long)sym->st_value);
@@ -165,7 +165,7 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
} }
offset += sym->st_value - addr; offset += sym->st_value - addr;
if (offset & 3 || offset <= (int32_t) 0xfe000000 || offset >= (int32_t) 0x02000000) if (offset & 3 || offset < (int32_t) 0xfe000000 || offset >= (int32_t) 0x02000000)
{ {
berr("ERROR: ERROR: PC24 [%d] relocation out of range, offset=%08lx\n", berr("ERROR: ERROR: PC24 [%d] relocation out of range, offset=%08lx\n",
ELF32_R_TYPE(rel->r_info), offset); ELF32_R_TYPE(rel->r_info), offset);
@@ -296,9 +296,9 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
/* Check the range of the offset */ /* Check the range of the offset */
if (offset <= (int32_t)0xff000000 || offset >= (int32_t)0x01000000) if (offset < (int32_t)0xff000000 || offset >= (int32_t)0x01000000)
{ {
berr("ERROR: ERROR: JUMP24 [%d] relocation out of range, branch taget=%08lx\n", berr("ERROR: ERROR: JUMP24 [%d] relocation out of range, branch target=%08lx\n",
ELF32_R_TYPE(rel->r_info), offset); ELF32_R_TYPE(rel->r_info), offset);
return -EINVAL; return -EINVAL;
@@ -357,7 +357,6 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
offset = *(uint32_t *)addr; offset = *(uint32_t *)addr;
offset = ((offset & 0xf0000) >> 4) | (offset & 0xfff); offset = ((offset & 0xf0000) >> 4) | (offset & 0xfff);
offset = (offset ^ 0x8000) - 0x8000;
offset += sym->st_value; offset += sym->st_value;
if (ELF32_R_TYPE(rel->r_info) == R_ARM_MOVT_ABS) if (ELF32_R_TYPE(rel->r_info) == R_ARM_MOVT_ABS)
@@ -417,10 +416,6 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
((lower_insn & 0x7000) >> 4) | /* imm3 -> imm16[8:10] */ ((lower_insn & 0x7000) >> 4) | /* imm3 -> imm16[8:10] */
(lower_insn & 0x00ff); /* imm8 -> imm16[0:7] */ (lower_insn & 0x00ff); /* imm8 -> imm16[0:7] */
/* Sign extend */
offset = (offset ^ 0x8000) - 0x8000;
/* And perform the relocation */ /* And perform the relocation */
binfo(" offset=%08lx branch target=%08lx\n", binfo(" offset=%08lx branch target=%08lx\n",
@@ -1,5 +1,5 @@
/************************************************************************************ /************************************************************************************
* libs/libc/machine/arm/armv7-m/gnu/up_memcpy.S * libs/libc/machine/arm/armv7-m/gnu/arch_memcpy.S
* *
* armv7m-optimized memcpy, contributed by Mike Smith. Apparently in the public * armv7m-optimized memcpy, contributed by Mike Smith. Apparently in the public
* domain and is re-released here under the modified BSD license: * domain and is re-released here under the modified BSD license:
+2 -3
View File
@@ -172,7 +172,7 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
case R_ARM_CALL: case R_ARM_CALL:
case R_ARM_JUMP24: case R_ARM_JUMP24:
{ {
binfo("Performing PC24 [%d] link at addr %08lx [%08lx] to sym '%s' st_value=%08lx\n", binfo("Performing PC24 [%d] link at addr %08lx [%08lx] to sym '%p' st_value=%08lx\n",
ELF32_R_TYPE(rel->r_info), (long)addr, (long)(*(uint32_t *)addr), ELF32_R_TYPE(rel->r_info), (long)addr, (long)(*(uint32_t *)addr),
sym, (long)sym->st_value); sym, (long)sym->st_value);
@@ -183,7 +183,7 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
} }
offset += sym->st_value - addr; offset += sym->st_value - addr;
if (offset & 3 || offset <= (int32_t) 0xfe000000 || offset >= (int32_t) 0x02000000) if (offset & 3 || offset < (int32_t) 0xfe000000 || offset >= (int32_t) 0x02000000)
{ {
berr("ERROR: ERROR: PC24 [%d] relocation out of range, offset=%08lx\n", berr("ERROR: ERROR: PC24 [%d] relocation out of range, offset=%08lx\n",
ELF32_R_TYPE(rel->r_info), offset); ELF32_R_TYPE(rel->r_info), offset);
@@ -242,7 +242,6 @@ int up_relocate(FAR const Elf32_Rel *rel, FAR const Elf32_Sym *sym,
offset = *(uint32_t *)addr; offset = *(uint32_t *)addr;
offset = ((offset & 0xf0000) >> 4) | (offset & 0xfff); offset = ((offset & 0xf0000) >> 4) | (offset & 0xfff);
offset = (offset ^ 0x8000) - 0x8000;
offset += sym->st_value; offset += sym->st_value;
if (ELF32_R_TYPE(rel->r_info) == R_ARM_MOVT_ABS) if (ELF32_R_TYPE(rel->r_info) == R_ARM_MOVT_ABS)
@@ -1,5 +1,5 @@
/************************************************************************************ /************************************************************************************
* libs/libc/marchine/arm/armv7-r/arm_memcpy.S * libs/libc/marchine/arm/armv7-r/arch_memcpy.S
* ARMv7-R optimized memcpy. * ARMv7-R optimized memcpy.
* *
* Adapted for use with ARMv7-R and NuttX by: * Adapted for use with ARMv7-R and NuttX by: