Messages in this thread Patch in this message | | | Date | Thu, 25 Sep 2008 11:18:09 -0700 | From | Hiroshi Shimamoto <> | Subject | [RFC PATCH v2 -tip 2/4] x86: uaccess: introduce __{put|get}_user_asm_eop |
| |
From: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com>
Introduce __{put|get}_user_asm_eop which receives eop for error opecode. Define __{put|get}_user_asm as __{put|get}_user_asm_eop with "mov".
Signed-off-by: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com> --- include/asm-x86/uaccess.h | 27 +++++++++++++++++++++------ 1 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/include/asm-x86/uaccess.h b/include/asm-x86/uaccess.h index c098dfe..84b0600 100644 --- a/include/asm-x86/uaccess.h +++ b/include/asm-x86/uaccess.h @@ -186,12 +186,12 @@ extern int __get_user_bad(void); #ifdef CONFIG_X86_32 -#define __put_user_asm_u64(x, addr, err) \ +#define __put_user_asm_eop_u64(x, addr, eop, err) \ asm volatile("1: movl %%eax,0(%2)\n" \ "2: movl %%edx,4(%2)\n" \ "3:\n" \ ".section .fixup,\"ax\"\n" \ - "4: movl %3,%0\n" \ + "4: " eop " %3,%0\n" \ " jmp 3b\n" \ ".previous\n" \ _ASM_EXTABLE(1b, 4b) \ @@ -199,12 +199,17 @@ extern int __get_user_bad(void); : "=r" (err) \ : "A" (x), "r" (addr), "i" (-EFAULT), "0" (err)) +#define __put_user_asm_u64(x, addr, err) \ + __put_user_asm_eop_u64(x, addr, "movl", err) + #define __put_user_x8(x, ptr, __ret_pu) \ asm volatile("call __put_user_8" : "=a" (__ret_pu) \ : "A" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx") #else #define __put_user_asm_u64(x, ptr, retval) \ __put_user_asm(x, ptr, retval, "q", "", "Zr", -EFAULT) +#define __put_user_asm_eop_u64(x, ptr, eop, retval) \ + __put_user_asm_eop(x, ptr, retval, "q", "", "Zr", eop, -EFAULT) #define __put_user_x8(x, ptr, __ret_pu) __put_user_x(8, x, ptr, __ret_pu) #endif @@ -311,9 +316,12 @@ do { \ #ifdef CONFIG_X86_32 #define __get_user_asm_u64(x, ptr, retval, errret) (x) = __get_user_bad() +#define __get_user_asm_eop_u64(x, ptr, retval, eop, errret) (x) = __get_user_bad() #else #define __get_user_asm_u64(x, ptr, retval, errret) \ __get_user_asm(x, ptr, retval, "q", "", "=r", errret) +#define __get_user_asm_eop_u64(x, ptr, retval, eop, errret) \ + __get_user_asm_eop(x, ptr, retval, "q", "", "=r", eop, errret) #endif #define __get_user_size(x, ptr, size, retval, errret) \ @@ -338,11 +346,11 @@ do { \ } \ } while (0) -#define __get_user_asm(x, addr, err, itype, rtype, ltype, errret) \ +#define __get_user_asm_eop(x, addr, err, itype, rtype, ltype, eop, errret) \ asm volatile("1: mov"itype" %2,%"rtype"1\n" \ "2:\n" \ ".section .fixup,\"ax\"\n" \ - "3: mov %3,%0\n" \ + "3: " eop " %3,%0\n" \ " xor"itype" %"rtype"1,%"rtype"1\n" \ " jmp 2b\n" \ ".previous\n" \ @@ -350,6 +358,9 @@ do { \ : "=r" (err), ltype(x) \ : "m" (__m(addr)), "i" (errret), "0" (err)) +#define __get_user_asm(x, addr, err, itype, rtype, ltype, errret) \ + __get_user_asm_eop(x, addr, err, itype, rtype, ltype, "mov", errret) + #define __put_user_nocheck(x, ptr, size) \ ({ \ long __pu_err; \ @@ -375,16 +386,20 @@ struct __large_struct { unsigned long buf[100]; }; * we do not write to any memory gcc knows about, so there are no * aliasing issues. */ -#define __put_user_asm(x, addr, err, itype, rtype, ltype, errret) \ +#define __put_user_asm_eop(x, addr, err, itype, rtype, ltype, eop, errret) \ asm volatile("1: mov"itype" %"rtype"1,%2\n" \ "2:\n" \ ".section .fixup,\"ax\"\n" \ - "3: mov %3,%0\n" \ + "3: " eop " %3,%0\n" \ " jmp 2b\n" \ ".previous\n" \ _ASM_EXTABLE(1b, 3b) \ : "=r"(err) \ : ltype(x), "m" (__m(addr)), "i" (errret), "0" (err)) + +#define __put_user_asm(x, addr, err, itype, rtype, ltype, errret) \ + __put_user_asm_eop(x, addr, err, itype, rtype, ltype, "mov", errret) + /** * __get_user: - Get a simple variable from user space, with less checking. * @x: Variable to store result. -- 1.5.6
| |