x86/futex: Remove .fixup usage
authorPeter Zijlstra <peterz@infradead.org>
Wed, 10 Nov 2021 10:01:11 +0000 (11:01 +0100)
committerPeter Zijlstra <peterz@infradead.org>
Sat, 11 Dec 2021 08:09:47 +0000 (09:09 +0100)
Use the new EX_TYPE_IMM_REG to store -EFAULT into the designated 'ret'
register, this removes the need for anonymous .fixup code.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Josh Poimboeuf <jpoimboe@redhat.com>
Link: https://lore.kernel.org/r/20211110101325.426016322@infradead.org
arch/x86/include/asm/extable_fixup_types.h
arch/x86/include/asm/futex.h

index 9d597fe..7469038 100644 (file)
@@ -42,6 +42,8 @@
 #define        EX_TYPE_DEFAULT_MCE_SAFE        14
 #define        EX_TYPE_FAULT_MCE_SAFE          15
 #define        EX_TYPE_POP_ZERO                16
+
 #define        EX_TYPE_IMM_REG                 17 /* reg := (long)imm */
+#define        EX_TYPE_EFAULT_REG              (EX_TYPE_IMM_REG | EX_DATA_IMM(-EFAULT))
 
 #endif
index f9c0011..99d345b 100644 (file)
@@ -17,13 +17,9 @@ do {                                                         \
        int oldval = 0, ret;                                    \
        asm volatile("1:\t" insn "\n"                           \
                     "2:\n"                                     \
-                    "\t.section .fixup,\"ax\"\n"               \
-                    "3:\tmov\t%3, %1\n"                        \
-                    "\tjmp\t2b\n"                              \
-                    "\t.previous\n"                            \
-                    _ASM_EXTABLE_UA(1b, 3b)                    \
+                    _ASM_EXTABLE_TYPE_REG(1b, 2b, EX_TYPE_EFAULT_REG, %1) \
                     : "=r" (oldval), "=r" (ret), "+m" (*uaddr) \
-                    : "i" (-EFAULT), "0" (oparg), "1" (0));    \
+                    : "0" (oparg), "1" (0));   \
        if (ret)                                                \
                goto label;                                     \
        *oval = oldval;                                         \
@@ -39,15 +35,11 @@ do {                                                                \
                     "3:\t" LOCK_PREFIX "cmpxchgl %3, %2\n"     \
                     "\tjnz\t2b\n"                              \
                     "4:\n"                                     \
-                    "\t.section .fixup,\"ax\"\n"               \
-                    "5:\tmov\t%5, %1\n"                        \
-                    "\tjmp\t4b\n"                              \
-                    "\t.previous\n"                            \
-                    _ASM_EXTABLE_UA(1b, 5b)                    \
-                    _ASM_EXTABLE_UA(3b, 5b)                    \
+                    _ASM_EXTABLE_TYPE_REG(1b, 4b, EX_TYPE_EFAULT_REG, %1) \
+                    _ASM_EXTABLE_TYPE_REG(3b, 4b, EX_TYPE_EFAULT_REG, %1) \
                     : "=&a" (oldval), "=&r" (ret),             \
                       "+m" (*uaddr), "=&r" (tem)               \
-                    : "r" (oparg), "i" (-EFAULT), "1" (0));    \
+                    : "r" (oparg), "1" (0));                   \
        if (ret)                                                \
                goto label;                                     \
        *oval = oldval;                                         \
@@ -95,15 +87,11 @@ static inline int futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
        if (!user_access_begin(uaddr, sizeof(u32)))
                return -EFAULT;
        asm volatile("\n"
-               "1:\t" LOCK_PREFIX "cmpxchgl %4, %2\n"
+               "1:\t" LOCK_PREFIX "cmpxchgl %3, %2\n"
                "2:\n"
-               "\t.section .fixup, \"ax\"\n"
-               "3:\tmov     %3, %0\n"
-               "\tjmp     2b\n"
-               "\t.previous\n"
-               _ASM_EXTABLE_UA(1b, 3b)
+               _ASM_EXTABLE_TYPE_REG(1b, 2b, EX_TYPE_EFAULT_REG, %0) \
                : "+r" (ret), "=a" (oldval), "+m" (*uaddr)
-               : "i" (-EFAULT), "r" (newval), "1" (oldval)
+               : "r" (newval), "1" (oldval)
                : "memory"
        );
        user_access_end();