parisc: Fix access fault handling in pa_memcpy()
authorHelge Deller <deller@gmx.de>
Wed, 29 Mar 2017 19:41:05 +0000 (21:41 +0200)
committerHelge Deller <deller@gmx.de>
Wed, 29 Mar 2017 19:49:02 +0000 (21:49 +0200)
commit554bfeceb8a22d448cd986fc9efce25e833278a1
treeaeb334dd59c20362c8457f3a2a71b902430092c5
parentfe82203b63e598c34d96e846dea49679a726fc7a
parisc: Fix access fault handling in pa_memcpy()

pa_memcpy() is the major memcpy implementation in the parisc kernel which is
used to do any kind of userspace/kernel memory copies.

Al Viro noticed various bugs in the implementation of pa_mempcy(), most notably
that in case of faults it may report back to have copied more bytes than it
actually did.

Fixing those bugs is quite hard in the C-implementation, because the compiler
is messing around with the registers and we are not guaranteed that specific
variables are always in the same processor registers. This makes proper fault
handling complicated.

This patch implements pa_memcpy() in assembler. That way we have correct fault
handling and adding a 64-bit copy routine was quite easy.

Runtime tested with 32- and 64bit kernels.

Reported-by: Al Viro <viro@ZenIV.linux.org.uk>
Cc: <stable@vger.kernel.org> # v4.9+
Signed-off-by: John David Anglin <dave.anglin@bell.net>
Signed-off-by: Helge Deller <deller@gmx.de>
arch/parisc/lib/lusercopy.S
arch/parisc/lib/memcpy.c