| From 155b73529583c38f30fd394d692b15a893960782 Mon Sep 17 00:00:00 2001 |
| From: Uros Bizjak <ubizjak@gmail.com> |
| Date: Sun, 19 Jul 2009 18:06:35 +0200 |
| Subject: x86: Fix movq immediate operand constraints in uaccess_64.h |
| |
| From: Uros Bizjak <ubizjak@gmail.com> |
| |
| commit 155b73529583c38f30fd394d692b15a893960782 upstream. |
| |
| arch/x86/include/asm/uaccess_64.h uses wrong asm operand constraint |
| ("ir") for movq insn. Since movq sign-extends its immediate operand, |
| "er" constraint should be used instead. |
| |
| Attached patch changes all uses of __put_user_asm in uaccess_64.h to use |
| "er" when "q" insn suffix is involved. |
| |
| Patch was compile tested on x86_64 with defconfig. |
| |
| Signed-off-by: Uros Bizjak <ubizjak@gmail.com> |
| Signed-off-by: H. Peter Anvin <hpa@zytor.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/x86/include/asm/uaccess_64.h | 10 +++++----- |
| 1 file changed, 5 insertions(+), 5 deletions(-) |
| |
| --- a/arch/x86/include/asm/uaccess_64.h |
| +++ b/arch/x86/include/asm/uaccess_64.h |
| @@ -88,11 +88,11 @@ int __copy_to_user(void __user *dst, con |
| ret, "l", "k", "ir", 4); |
| return ret; |
| case 8:__put_user_asm(*(u64 *)src, (u64 __user *)dst, |
| - ret, "q", "", "ir", 8); |
| + ret, "q", "", "er", 8); |
| return ret; |
| case 10: |
| __put_user_asm(*(u64 *)src, (u64 __user *)dst, |
| - ret, "q", "", "ir", 10); |
| + ret, "q", "", "er", 10); |
| if (unlikely(ret)) |
| return ret; |
| asm("":::"memory"); |
| @@ -101,12 +101,12 @@ int __copy_to_user(void __user *dst, con |
| return ret; |
| case 16: |
| __put_user_asm(*(u64 *)src, (u64 __user *)dst, |
| - ret, "q", "", "ir", 16); |
| + ret, "q", "", "er", 16); |
| if (unlikely(ret)) |
| return ret; |
| asm("":::"memory"); |
| __put_user_asm(1[(u64 *)src], 1 + (u64 __user *)dst, |
| - ret, "q", "", "ir", 8); |
| + ret, "q", "", "er", 8); |
| return ret; |
| default: |
| return copy_user_generic((__force void *)dst, src, size); |
| @@ -157,7 +157,7 @@ int __copy_in_user(void __user *dst, con |
| ret, "q", "", "=r", 8); |
| if (likely(!ret)) |
| __put_user_asm(tmp, (u64 __user *)dst, |
| - ret, "q", "", "ir", 8); |
| + ret, "q", "", "er", 8); |
| return ret; |
| } |
| default: |