Commit 631d8b674f5f8235e9cb7e628b0fe9e5200e3158
1 parent
957d6bf665
Exists in
smarc-imx_3.14.28_1.0.0_ga
and in
1 other branch
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 | } |