summaryrefslogtreecommitdiffstats
path: root/arch/metag/lib
diff options
context:
space:
mode:
authorJames Hogan2017-03-31 16:40:52 +0200
committerJames Hogan2017-04-05 16:27:32 +0200
commitd3ba2e922d4d1d61806fcb6e09512d2bee734d06 (patch)
tree5ef9ef8b411faacfd92cedbc89990ad7ee7f6710 /arch/metag/lib
parentmetag/usercopy: Simplify rapf loop fixup corner case (diff)
downloadkernel-qcow2-linux-d3ba2e922d4d1d61806fcb6e09512d2bee734d06.tar.gz
kernel-qcow2-linux-d3ba2e922d4d1d61806fcb6e09512d2bee734d06.tar.xz
kernel-qcow2-linux-d3ba2e922d4d1d61806fcb6e09512d2bee734d06.zip
metag/usercopy: Add 64-bit get_user support
Metag already supports 64-bit put_user, so add support for 64-bit get_user too so that the test_user_copy module can test both. Signed-off-by: James Hogan <james.hogan@imgtec.com> Cc: linux-metag@vger.kernel.org
Diffstat (limited to 'arch/metag/lib')
-rw-r--r--arch/metag/lib/usercopy.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/arch/metag/lib/usercopy.c b/arch/metag/lib/usercopy.c
index ceb4590fbca5..45e7b79eca19 100644
--- a/arch/metag/lib/usercopy.c
+++ b/arch/metag/lib/usercopy.c
@@ -1044,6 +1044,30 @@ unsigned int __get_user_asm_d(const void __user *addr, long *err)
}
EXPORT_SYMBOL(__get_user_asm_d);
+unsigned long long __get_user_asm_l(const void __user *addr, long *err)
+{
+ register unsigned long long x asm ("D0Re0") = 0;
+ asm volatile (
+ " GETL %0,%t0,[%2]\n"
+ "1:\n"
+ " GETL %0,%t0,[%2]\n"
+ "2:\n"
+ " .section .fixup,\"ax\"\n"
+ "3: MOV D0FrT,%3\n"
+ " SETD [%1],D0FrT\n"
+ " MOVT D0FrT,#HI(2b)\n"
+ " JUMP D0FrT,#LO(2b)\n"
+ " .previous\n"
+ " .section __ex_table,\"a\"\n"
+ " .long 1b,3b\n"
+ " .previous\n"
+ : "=r" (x)
+ : "r" (err), "r" (addr), "P" (-EFAULT)
+ : "D0FrT");
+ return x;
+}
+EXPORT_SYMBOL(__get_user_asm_l);
+
long __put_user_asm_b(unsigned int x, void __user *addr)
{
register unsigned int err asm ("D0Re0") = 0;