summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Ungerer <gerg@uclinux.org>2011-08-05 06:41:29 +0200
committerGreg Ungerer <gerg@uclinux.org>2011-10-18 06:22:24 +0200
commitf230e80b423f6cb002015ab4771c06a53d5a2287 (patch)
tree60484053056ef32d01bd7edf390acb226a70e754
parentLinux 3.1-rc10 (diff)
downloadlinux-f230e80b423f6cb002015ab4771c06a53d5a2287.tar.xz
linux-f230e80b423f6cb002015ab4771c06a53d5a2287.zip
m68k: fix memcpy to unmatched/unaligned source and dest on 68000
The original 68000 processors cannot copy 16bit or larger quantities from odd addresses. All newer members of the 68k family (including ColdFire) can do this. In the current memcpy implementation after trying to align the destination address to a 16bit boundary if we end up with an odd source address we go off and try to copy multi-byte quantities from it. This will trap on the 68000. The only solution if we end with an odd source address is to byte wise copy the whole memcpy region. We only need to do this if we are supporting original 68000 processors. Signed-off-by: Greg Ungerer <gerg@uclinux.org>
-rw-r--r--arch/m68k/lib/memcpy.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/arch/m68k/lib/memcpy.c b/arch/m68k/lib/memcpy.c
index 064889316974..10ca051d56b8 100644
--- a/arch/m68k/lib/memcpy.c
+++ b/arch/m68k/lib/memcpy.c
@@ -22,6 +22,15 @@ void *memcpy(void *to, const void *from, size_t n)
from = cfrom;
n--;
}
+#if defined(CONFIG_M68000)
+ if ((long)from & 1) {
+ char *cto = to;
+ const char *cfrom = from;
+ for (; n; n--)
+ *cto++ = *cfrom++;
+ return xto;
+ }
+#endif
if (n > 2 && (long)to & 2) {
short *sto = to;
const short *sfrom = from;