Skip to content

Commit

Permalink
ARM: Fix memcpy & memmove for [ARM_ALWAYS_BX]
Browse files Browse the repository at this point in the history
  • Loading branch information
Roland McGrath committed Mar 19, 2015
1 parent becb26b commit 298e5d5
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 6 deletions.
6 changes: 6 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
2015-03-19 Roland McGrath <roland@hack.frob.com>

* sysdeps/arm/memcpy.S [ARM_ALWAYS_BX]: Fix computed-jump calculations
to account for alignment padding.
* sysdeps/arm/memmove.S: Likewise.

2015-03-19 Chris Metcalf <cmetcalf@ezchip.com>

* sysdeps/unix/sysv/linux/generic/README: New file.
Expand Down
16 changes: 13 additions & 3 deletions sysdeps/arm/memcpy.S
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,12 @@ ENTRY(memcpy)
push {r10}
cfi_adjust_cfa_offset (4)
cfi_rel_offset (r10, 0)
add r10, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
0: add r10, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
/* If alignment is not perfect, then there will be some
padding (nop) instructions between this BX and label 6.
The computation above assumed that two instructions
later is exactly the right spot. */
add r10, #(6f - (0b + PC_OFS))
bx r10
#endif
.p2align ARM_BX_ALIGN_LOG2
Expand Down Expand Up @@ -156,11 +161,16 @@ ENTRY(memcpy)
add pc, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
nop
#else
add r10, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
0: add r10, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
/* If alignment is not perfect, then there will be some
padding (nop) instructions between this BX and label 66.
The computation above assumed that two instructions
later is exactly the right spot. */
add r10, #(66f - (0b + PC_OFS))
bx r10
#endif
.p2align ARM_BX_ALIGN_LOG2
nop
66: nop
.p2align ARM_BX_ALIGN_LOG2
sfi_breg r0, \
str r3, [\B], #4
Expand Down
16 changes: 13 additions & 3 deletions sysdeps/arm/memmove.S
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,12 @@ ENTRY(memmove)
push {r10}
cfi_adjust_cfa_offset (4)
cfi_rel_offset (r10, 0)
add r10, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
0: add r10, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
/* If alignment is not perfect, then there will be some
padding (nop) instructions between this BX and label 6.
The computation above assumed that two instructions
later is exactly the right spot. */
add r10, #(6f - (0b + PC_OFS))
bx r10
#endif
.p2align ARM_BX_ALIGN_LOG2
Expand Down Expand Up @@ -172,11 +177,16 @@ ENTRY(memmove)
add pc, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
nop
#else
add r10, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
0: add r10, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
/* If alignment is not perfect, then there will be some
padding (nop) instructions between this BX and label 66.
The computation above assumed that two instructions
later is exactly the right spot. */
add r10, #(66f - (0b + PC_OFS))
bx r10
#endif
.p2align ARM_BX_ALIGN_LOG2
nop
66: nop
.p2align ARM_BX_ALIGN_LOG2
sfi_breg r0, \
str r3, [\B, #-4]!
Expand Down

0 comments on commit 298e5d5

Please sign in to comment.