[RFC PATCH -tip 2/4] x86: uaccess: introduce __{put|get}_user_asm_eop

From: Hiroshi Shimamoto
Date: Mon Sep 22 2008 - 21:51:24 EST


From: Hiroshi Shimamoto <h-shimamoto@xxxxxxxxxxxxx>

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@xxxxxxxxxxxxx>
---
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

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/