aboutsummaryrefslogtreecommitdiffstats
path: root/arch/m68k
diff options
context:
space:
mode:
authorGeert Uytterhoeven <geert@linux-m68k.org>2013-06-09 14:12:42 -0400
committerGeert Uytterhoeven <geert@linux-m68k.org>2013-06-24 13:44:19 -0400
commit631d8b674f5f8235e9cb7e628b0fe9e5200e3158 (patch)
tree94cfb3bcdfbff1ddea8ef4a511fe92ca06cf9e31 /arch/m68k
parent957d6bf665462eb1e94f7c23b4bdf20a83fea4b2 (diff)
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>
Diffstat (limited to 'arch/m68k')
-rw-r--r--arch/m68k/include/asm/uaccess_mm.h8
-rw-r--r--arch/m68k/lib/uaccess.c6
2 files changed, 7 insertions, 7 deletions
diff --git a/arch/m68k/include/asm/uaccess_mm.h b/arch/m68k/include/asm/uaccess_mm.h
index 472c891a4aee..15901db435b9 100644
--- a/arch/m68k/include/asm/uaccess_mm.h
+++ b/arch/m68k/include/asm/uaccess_mm.h
@@ -90,7 +90,7 @@ asm volatile ("\n" \
90 __put_user_asm(__pu_err, __pu_val, ptr, b, d, -EFAULT); \ 90 __put_user_asm(__pu_err, __pu_val, ptr, b, d, -EFAULT); \
91 break; \ 91 break; \
92 case 2: \ 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 break; \ 94 break; \
95 case 4: \ 95 case 4: \
96 __put_user_asm(__pu_err, __pu_val, ptr, l, r, -EFAULT); \ 96 __put_user_asm(__pu_err, __pu_val, ptr, l, r, -EFAULT); \
@@ -158,7 +158,7 @@ asm volatile ("\n" \
158 __get_user_asm(__gu_err, x, ptr, u8, b, d, -EFAULT); \ 158 __get_user_asm(__gu_err, x, ptr, u8, b, d, -EFAULT); \
159 break; \ 159 break; \
160 case 2: \ 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 break; \ 162 break; \
163 case 4: \ 163 case 4: \
164 __get_user_asm(__gu_err, x, ptr, u32, l, r, -EFAULT); \ 164 __get_user_asm(__gu_err, x, ptr, u32, l, r, -EFAULT); \
@@ -245,7 +245,7 @@ __constant_copy_from_user(void *to, const void __user *from, unsigned long n)
245 __get_user_asm(res, *(u8 *)to, (u8 __user *)from, u8, b, d, 1); 245 __get_user_asm(res, *(u8 *)to, (u8 __user *)from, u8, b, d, 1);
246 break; 246 break;
247 case 2: 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 break; 249 break;
250 case 3: 250 case 3:
251 __constant_copy_from_user_asm(res, to, from, tmp, 3, w, b,); 251 __constant_copy_from_user_asm(res, to, from, tmp, 3, w, b,);
@@ -326,7 +326,7 @@ __constant_copy_to_user(void __user *to, const void *from, unsigned long n)
326 __put_user_asm(res, *(u8 *)from, (u8 __user *)to, b, d, 1); 326 __put_user_asm(res, *(u8 *)from, (u8 __user *)to, b, d, 1);
327 break; 327 break;
328 case 2: 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 break; 330 break;
331 case 3: 331 case 3:
332 __constant_copy_to_user_asm(res, to, from, tmp, 3, w, b,); 332 __constant_copy_to_user_asm(res, to, from, tmp, 3, w, b,);
diff --git a/arch/m68k/lib/uaccess.c b/arch/m68k/lib/uaccess.c
index 5e97f2ee7c11..35d1442dee89 100644
--- a/arch/m68k/lib/uaccess.c
+++ b/arch/m68k/lib/uaccess.c
@@ -52,7 +52,7 @@ unsigned long __generic_copy_from_user(void *to, const void __user *from,
52 " .long 3b,30b\n" 52 " .long 3b,30b\n"
53 " .long 5b,50b\n" 53 " .long 5b,50b\n"
54 " .previous" 54 " .previous"
55 : "=d" (res), "+a" (from), "+a" (to), "=&r" (tmp) 55 : "=d" (res), "+a" (from), "+a" (to), "=&d" (tmp)
56 : "0" (n / 4), "d" (n & 3)); 56 : "0" (n / 4), "d" (n & 3));
57 57
58 return res; 58 return res;
@@ -96,7 +96,7 @@ unsigned long __generic_copy_to_user(void __user *to, const void *from,
96 " .long 7b,50b\n" 96 " .long 7b,50b\n"
97 " .long 8b,50b\n" 97 " .long 8b,50b\n"
98 " .previous" 98 " .previous"
99 : "=d" (res), "+a" (from), "+a" (to), "=&r" (tmp) 99 : "=d" (res), "+a" (from), "+a" (to), "=&d" (tmp)
100 : "0" (n / 4), "d" (n & 3)); 100 : "0" (n / 4), "d" (n & 3));
101 101
102 return res; 102 return res;
@@ -141,7 +141,7 @@ unsigned long __clear_user(void __user *to, unsigned long n)
141 " .long 7b,40b\n" 141 " .long 7b,40b\n"
142 " .previous" 142 " .previous"
143 : "=d" (res), "+a" (to) 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 return res; 146 return res;
147} 147}