From: Greg Kroah-Hartman Date: Fri, 23 Oct 2015 14:13:28 +0000 (-0700) Subject: 3.10-stable patches X-Git-Tag: v3.14.56~19 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=988d9602b06edc8ca154fdc712a75ee55e6bb06f;p=thirdparty%2Fkernel%2Fstable-queue.git 3.10-stable patches added patches: m68k-uaccess-fix-asm-constraints-for-userspace-access.patch --- diff --git a/queue-3.10/m68k-uaccess-fix-asm-constraints-for-userspace-access.patch b/queue-3.10/m68k-uaccess-fix-asm-constraints-for-userspace-access.patch new file mode 100644 index 00000000000..b728ed5331b --- /dev/null +++ b/queue-3.10/m68k-uaccess-fix-asm-constraints-for-userspace-access.patch @@ -0,0 +1,104 @@ +From 631d8b674f5f8235e9cb7e628b0fe9e5200e3158 Mon Sep 17 00:00:00 2001 +From: Geert Uytterhoeven +Date: Sun, 9 Jun 2013 20:12:42 +0200 +Subject: m68k/uaccess: Fix asm constraints for userspace access + +From: Geert Uytterhoeven + +commit 631d8b674f5f8235e9cb7e628b0fe9e5200e3158 upstream. + +When compiling a MMU kernel with CPU_HAS_ADDRESS_SPACES=n (e.g. "MMU=y +allnoconfig": "echo CONFIG_MMU=y > allno.config && make KCONFIG_ALLCONFIG=1 +allnoconfig"), we use plain "move" instead of "moves", and I got: + + CC arch/m68k/lib/uaccess.o +{standard input}: Assembler messages: +{standard input}:47: Error: operands mismatch -- statement `move.b %a0,(%a1)' ignored + +This happens because plain "move" doesn't support byte transfers between +memory and address registers, while "moves" does. + +Fix the asm constraints for __generic_copy_from_user(), +__generic_copy_to_user(), and __clear_user() to only use data registers +when accessing userspace. + +Also, relax the asm constraints for 16-bit userspace accesses in +__put_user() and __get_user(), as both "move" and "moves" do support +such transfers between memory and address registers. + +Signed-off-by: Geert Uytterhoeven +Cc: Guenter Roeck +Signed-off-by: Greg Kroah-Hartman + +--- + arch/m68k/include/asm/uaccess_mm.h | 8 ++++---- + arch/m68k/lib/uaccess.c | 6 +++--- + 2 files changed, 7 insertions(+), 7 deletions(-) + +--- a/arch/m68k/include/asm/uaccess_mm.h ++++ b/arch/m68k/include/asm/uaccess_mm.h +@@ -90,7 +90,7 @@ asm volatile ("\n" \ + __put_user_asm(__pu_err, __pu_val, ptr, b, d, -EFAULT); \ + break; \ + case 2: \ +- __put_user_asm(__pu_err, __pu_val, ptr, w, d, -EFAULT); \ ++ __put_user_asm(__pu_err, __pu_val, ptr, w, r, -EFAULT); \ + break; \ + case 4: \ + __put_user_asm(__pu_err, __pu_val, ptr, l, r, -EFAULT); \ +@@ -158,7 +158,7 @@ asm volatile ("\n" \ + __get_user_asm(__gu_err, x, ptr, u8, b, d, -EFAULT); \ + break; \ + case 2: \ +- __get_user_asm(__gu_err, x, ptr, u16, w, d, -EFAULT); \ ++ __get_user_asm(__gu_err, x, ptr, u16, w, r, -EFAULT); \ + break; \ + case 4: \ + __get_user_asm(__gu_err, x, ptr, u32, l, r, -EFAULT); \ +@@ -245,7 +245,7 @@ __constant_copy_from_user(void *to, cons + __get_user_asm(res, *(u8 *)to, (u8 __user *)from, u8, b, d, 1); + break; + case 2: +- __get_user_asm(res, *(u16 *)to, (u16 __user *)from, u16, w, d, 2); ++ __get_user_asm(res, *(u16 *)to, (u16 __user *)from, u16, w, r, 2); + break; + case 3: + __constant_copy_from_user_asm(res, to, from, tmp, 3, w, b,); +@@ -326,7 +326,7 @@ __constant_copy_to_user(void __user *to, + __put_user_asm(res, *(u8 *)from, (u8 __user *)to, b, d, 1); + break; + case 2: +- __put_user_asm(res, *(u16 *)from, (u16 __user *)to, w, d, 2); ++ __put_user_asm(res, *(u16 *)from, (u16 __user *)to, w, r, 2); + break; + case 3: + __constant_copy_to_user_asm(res, to, from, tmp, 3, w, b,); +--- a/arch/m68k/lib/uaccess.c ++++ b/arch/m68k/lib/uaccess.c +@@ -52,7 +52,7 @@ unsigned long __generic_copy_from_user(v + " .long 3b,30b\n" + " .long 5b,50b\n" + " .previous" +- : "=d" (res), "+a" (from), "+a" (to), "=&r" (tmp) ++ : "=d" (res), "+a" (from), "+a" (to), "=&d" (tmp) + : "0" (n / 4), "d" (n & 3)); + + return res; +@@ -96,7 +96,7 @@ unsigned long __generic_copy_to_user(voi + " .long 7b,50b\n" + " .long 8b,50b\n" + " .previous" +- : "=d" (res), "+a" (from), "+a" (to), "=&r" (tmp) ++ : "=d" (res), "+a" (from), "+a" (to), "=&d" (tmp) + : "0" (n / 4), "d" (n & 3)); + + return res; +@@ -141,7 +141,7 @@ unsigned long __clear_user(void __user * + " .long 7b,40b\n" + " .previous" + : "=d" (res), "+a" (to) +- : "r" (0), "0" (n / 4), "d" (n & 3)); ++ : "d" (0), "0" (n / 4), "d" (n & 3)); + + return res; + } diff --git a/queue-3.10/series b/queue-3.10/series index babc583869b..a8cdad64924 100644 --- a/queue-3.10/series +++ b/queue-3.10/series @@ -8,3 +8,4 @@ ppp-don-t-override-sk-sk_state-in-pppoe_flush_dev.patch ethtool-use-kcalloc-instead-of-kmalloc-for-ethtool_get_strings.patch asix-don-t-reset-phy-on-if_up-for-asix-88772.patch asix-do-full-reset-during-ax88772_bind.patch +m68k-uaccess-fix-asm-constraints-for-userspace-access.patch