Skip to content
/ linux Public

Commit 80a27fb

Browse files
fifteenhexSasha Levin
authored andcommitted
m68k: nommu: fix memmove() with differently aligned src and dest for 68000
[ Upstream commit 590fe2f ] 68000 has different alignment needs to 68020+. memcpy() checks if the destination is aligned and does a smaller copy to fix the alignment and then critically for 68000 it checks if the source is still unaligned and if it is reverts to smaller copies. memmove() does not currently do the second part and malfunctions if one of the pointers is aligned and the other isn't. This is apparently getting triggered by printk. If I put breakpoints into the new checks added by this commit the first hit looks like this: memmove (n=205, src=0x2f3971 <printk_shared_pbufs+205>, dest=0x2f3980 <printk_shared_pbufs+220>) at arch/m68k/lib/memmove.c:82 Signed-off-by: Daniel Palmer <daniel@thingy.jp> Signed-off-by: Greg Ungerer <gerg@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 4799372 commit 80a27fb

File tree

1 file changed

+18
-0
lines changed

1 file changed

+18
-0
lines changed

arch/m68k/lib/memmove.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@ void *memmove(void *dest, const void *src, size_t n)
2424
src = csrc;
2525
n--;
2626
}
27+
#if defined(CONFIG_M68000)
28+
if ((long)src & 1) {
29+
char *cdest = dest;
30+
const char *csrc = src;
31+
for (; n; n--)
32+
*cdest++ = *csrc++;
33+
return xdest;
34+
}
35+
#endif
2736
if (n > 2 && (long)dest & 2) {
2837
short *sdest = dest;
2938
const short *ssrc = src;
@@ -66,6 +75,15 @@ void *memmove(void *dest, const void *src, size_t n)
6675
src = csrc;
6776
n--;
6877
}
78+
#if defined(CONFIG_M68000)
79+
if ((long)src & 1) {
80+
char *cdest = dest;
81+
const char *csrc = src;
82+
for (; n; n--)
83+
*--cdest = *--csrc;
84+
return xdest;
85+
}
86+
#endif
6987
if (n > 2 && (long)dest & 2) {
7088
short *sdest = dest;
7189
const short *ssrc = src;

0 commit comments

Comments
 (0)