diff options
author | Sebastian Andrzej Siewior <bigeasy@breakpoint.cc> | 2009-07-26 08:57:54 -0400 |
---|---|---|
committer | Haavard Skinnemoen <haavard.skinnemoen@atmel.com> | 2009-07-27 06:37:27 -0400 |
commit | 505d62d073b528859b43bfb463a6ceaf3581469e (patch) | |
tree | 482d391e4f557223e6ea53de27f9c4da859fd156 /arch/avr32 | |
parent | 4be3bd7849165e7efa6b0b35a23d6a3598d97465 (diff) |
avr32/lib: fix unaligned memcpy()
memcpy(p, unaligned, 4..) returns (p + num_of_unaligned_by_copied)
instead of p because p is not preserved in the unaligned case.
Noticed by Herbert Xu's superior parameter recycling coding technique
which let the md4 self-test fail on avr32.
Signed-off-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Signed-off-by: Haavard Skinnemoen <haavard.skinnemoen@atmel.com>
Diffstat (limited to 'arch/avr32')
-rw-r--r-- | arch/avr32/lib/memcpy.S | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/arch/avr32/lib/memcpy.S b/arch/avr32/lib/memcpy.S index 0abb26142b64..93e74b6fcdb6 100644 --- a/arch/avr32/lib/memcpy.S +++ b/arch/avr32/lib/memcpy.S | |||
@@ -24,8 +24,8 @@ memcpy: | |||
24 | brne 1f | 24 | brne 1f |
25 | 25 | ||
26 | /* At this point, "from" is word-aligned */ | 26 | /* At this point, "from" is word-aligned */ |
27 | 2: sub r10, 4 | 27 | 2: mov r9, r12 |
28 | mov r9, r12 | 28 | 5: sub r10, 4 |
29 | brlt 4f | 29 | brlt 4f |
30 | 30 | ||
31 | 3: ld.w r8, r11++ | 31 | 3: ld.w r8, r11++ |
@@ -59,4 +59,13 @@ memcpy: | |||
59 | st.b r12++, r8 | 59 | st.b r12++, r8 |
60 | ld.ub r8, r11++ | 60 | ld.ub r8, r11++ |
61 | st.b r12++, r8 | 61 | st.b r12++, r8 |
62 | rjmp 2b | 62 | mov r8, r12 |
63 | add pc, pc, r9 | ||
64 | sub r8, 1 | ||
65 | nop | ||
66 | sub r8, 1 | ||
67 | nop | ||
68 | sub r8, 1 | ||
69 | nop | ||
70 | mov r9, r8 | ||
71 | rjmp 5b | ||