Commit 631d8b674f5f8235e9cb7e628b0fe9e5200e3158

Authored by Geert Uytterhoeven
1 parent 957d6bf665

m68k/uaccess: Fix asm constraints for userspace access

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 <geert@linux-m68k.org>

Showing 2 changed files with 7 additions and 7 deletions Side-by-side Diff

arch/m68k/include/asm/uaccess_mm.h
... ... @@ -90,7 +90,7 @@
90 90 __put_user_asm(__pu_err, __pu_val, ptr, b, d, -EFAULT); \
91 91 break; \
92 92 case 2: \
93   - __put_user_asm(__pu_err, __pu_val, ptr, w, d, -EFAULT); \
  93 + __put_user_asm(__pu_err, __pu_val, ptr, w, r, -EFAULT); \
94 94 break; \
95 95 case 4: \
96 96 __put_user_asm(__pu_err, __pu_val, ptr, l, r, -EFAULT); \
... ... @@ -158,7 +158,7 @@
158 158 __get_user_asm(__gu_err, x, ptr, u8, b, d, -EFAULT); \
159 159 break; \
160 160 case 2: \
161   - __get_user_asm(__gu_err, x, ptr, u16, w, d, -EFAULT); \
  161 + __get_user_asm(__gu_err, x, ptr, u16, w, r, -EFAULT); \
162 162 break; \
163 163 case 4: \
164 164 __get_user_asm(__gu_err, x, ptr, u32, l, r, -EFAULT); \
... ... @@ -245,7 +245,7 @@
245 245 __get_user_asm(res, *(u8 *)to, (u8 __user *)from, u8, b, d, 1);
246 246 break;
247 247 case 2:
248   - __get_user_asm(res, *(u16 *)to, (u16 __user *)from, u16, w, d, 2);
  248 + __get_user_asm(res, *(u16 *)to, (u16 __user *)from, u16, w, r, 2);
249 249 break;
250 250 case 3:
251 251 __constant_copy_from_user_asm(res, to, from, tmp, 3, w, b,);
... ... @@ -326,7 +326,7 @@
326 326 __put_user_asm(res, *(u8 *)from, (u8 __user *)to, b, d, 1);
327 327 break;
328 328 case 2:
329   - __put_user_asm(res, *(u16 *)from, (u16 __user *)to, w, d, 2);
  329 + __put_user_asm(res, *(u16 *)from, (u16 __user *)to, w, r, 2);
330 330 break;
331 331 case 3:
332 332 __constant_copy_to_user_asm(res, to, from, tmp, 3, w, b,);
arch/m68k/lib/uaccess.c
... ... @@ -52,7 +52,7 @@
52 52 " .long 3b,30b\n"
53 53 " .long 5b,50b\n"
54 54 " .previous"
55   - : "=d" (res), "+a" (from), "+a" (to), "=&r" (tmp)
  55 + : "=d" (res), "+a" (from), "+a" (to), "=&d" (tmp)
56 56 : "0" (n / 4), "d" (n & 3));
57 57  
58 58 return res;
... ... @@ -96,7 +96,7 @@
96 96 " .long 7b,50b\n"
97 97 " .long 8b,50b\n"
98 98 " .previous"
99   - : "=d" (res), "+a" (from), "+a" (to), "=&r" (tmp)
  99 + : "=d" (res), "+a" (from), "+a" (to), "=&d" (tmp)
100 100 : "0" (n / 4), "d" (n & 3));
101 101  
102 102 return res;
... ... @@ -141,7 +141,7 @@
141 141 " .long 7b,40b\n"
142 142 " .previous"
143 143 : "=d" (res), "+a" (to)
144   - : "r" (0), "0" (n / 4), "d" (n & 3));
  144 + : "d" (0), "0" (n / 4), "d" (n & 3));
145 145  
146 146 return res;
147 147 }