linux/arch/sparc
David S. Miller 62268585e5 sparc64: Fix several bugs in memmove().
[ Upstream commit 2077cef4d5 ]

Firstly, handle zero length calls properly.  Believe it or not there
are a few of these happening during early boot.

Next, we can't just drop to a memcpy() call in the forward copy case
where dst <= src.  The reason is that the cache initializing stores
used in the Niagara memcpy() implementations can end up clearing out
cache lines before we've sourced their original contents completely.

For example, considering NG4memcpy, the main unrolled loop begins like
this:

     load   src + 0x00
     load   src + 0x08
     load   src + 0x10
     load   src + 0x18
     load   src + 0x20
     store  dst + 0x00

Assume dst is 64 byte aligned and let's say that dst is src - 8 for
this memcpy() call.  That store at the end there is the one to the
first line in the cache line, thus clearing the whole line, which thus
clobbers "src + 0x28" before it even gets loaded.

To avoid this, just fall through to a simple copy only mildly
optimized for the case where src and dst are 8 byte aligned and the
length is a multiple of 8 as well.  We could get fancy and call
GENmemcpy() but this is good enough for how this thing is actually
used.

Reported-by: David Ahern <david.ahern@oracle.com>
Reported-by: Bob Picco <bpicco@meloft.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
History 2015-03-24 08:22:10 -04:00
..
boot sparc: Add "install" target 2014-08-04 20:45:59 -07:00
configs sparc: Set CONFIG_NET=y in defconfigs 2014-09-24 13:38:30 -04:00
crypto crypto: prefix module autoloading with "crypto-" 2015-01-29 17:40:46 -08:00
include sparc: Add NOP dma_cache_sync() implementation. 2014-11-26 13:36:41 -08:00
kernel sparc: Touch NMI watchdog when walking cpus and calling printk 2015-03-24 08:22:10 -04:00
lib sparc64: Fix several bugs in memmove(). 2015-03-24 08:22:10 -04:00
math-emu arch/sparc/math-emu/math_32.c: drop stray break operator 2014-08-04 20:29:06 -07:00
mm sparc32: destroy_context() and switch_mm() needs to disable interrupts. 2015-03-24 08:22:08 -04:00
net sparc: bpf_jit: add support for BPF_LD(X) | BPF_LEN instructions 2014-09-26 16:52:09 -04:00
oprofile sparc: using HZ needs an include of linux/param.h 2009-10-05 00:46:08 -07:00
power Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc 2014-10-11 20:36:34 -04:00
prom sparc64: Fix register corruption in top-most kernel stack frame during boot. 2014-10-24 09:52:49 -07:00
Kbuild sparc64: Add SHA1 driver making use of the 'sha1' instruction. 2012-08-20 15:08:49 -07:00
Kconfig sparc64: sparse irq 2014-10-05 16:53:40 -07:00
Kconfig.debug lib: consolidate DEBUG_STACK_USAGE option 2011-05-25 08:39:54 -07:00
Makefile sparc: Add "install" target 2014-08-04 20:45:59 -07:00