LoongArch: Consolidate __ex_table construction
authorYouling Tang <tangyouling@loongson.cn>
Sat, 10 Dec 2022 14:39:48 +0000 (22:39 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Wed, 14 Dec 2022 00:36:11 +0000 (08:36 +0800)
Consolidate all the __ex_table constuction code with a _ASM_EXTABLE or
_asm_extable helper.

There should be no functional change as a result of this patch.

Signed-off-by: Youling Tang <tangyouling@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/include/asm/asm-extable.h [new file with mode: 0644]
arch/loongarch/include/asm/futex.h
arch/loongarch/include/asm/uaccess.h
arch/loongarch/kernel/fpu.S
arch/loongarch/lib/clear_user.S
arch/loongarch/lib/copy_user.S

diff --git a/arch/loongarch/include/asm/asm-extable.h b/arch/loongarch/include/asm/asm-extable.h
new file mode 100644 (file)
index 0000000..4f615bf
--- /dev/null
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef __ASM_ASM_EXTABLE_H
+#define __ASM_ASM_EXTABLE_H
+
+#ifdef __ASSEMBLY__
+
+#define __ASM_EXTABLE_RAW(insn, fixup)                 \
+       .pushsection    __ex_table, "a";                \
+       .balign         8;                              \
+       .quad           (insn);                         \
+       .quad           (fixup);                        \
+       .popsection;
+
+       .macro          _asm_extable, insn, fixup
+       __ASM_EXTABLE_RAW(\insn, \fixup)
+       .endm
+
+#else /* __ASSEMBLY__ */
+
+#include <linux/bits.h>
+#include <linux/stringify.h>
+
+#define __ASM_EXTABLE_RAW(insn, fixup)                 \
+       ".pushsection   __ex_table, \"a\"\n"            \
+       ".balign        8\n"                            \
+       ".quad          ((" insn "))\n"                 \
+       ".quad          ((" fixup "))\n"                \
+       ".popsection\n"
+
+#define _ASM_EXTABLE(insn, fixup)      \
+       __ASM_EXTABLE_RAW(#insn, #fixup)
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* __ASM_ASM_EXTABLE_H */
index feb6658c84ff8b04e18a684ee9cddca18bfb1c33..bdcd1c61329989403b0b2788976cf755157571ae 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <linux/futex.h>
 #include <linux/uaccess.h>
+#include <asm/asm-extable.h>
 #include <asm/barrier.h>
 #include <asm/errno.h>
 
        "4:     li.w    %0, %6                          \n"     \
        "       b       3b                              \n"     \
        "       .previous                               \n"     \
-       "       .section __ex_table,\"a\"               \n"     \
-       "       "__UA_ADDR "\t1b, 4b                    \n"     \
-       "       "__UA_ADDR "\t2b, 4b                    \n"     \
-       "       .previous                               \n"     \
+       _ASM_EXTABLE(1b, 4b)                                    \
+       _ASM_EXTABLE(2b, 4b)                                    \
        : "=r" (ret), "=&r" (oldval),                           \
          "=ZC" (*uaddr)                                        \
        : "0" (0), "ZC" (*uaddr), "Jr" (oparg),                 \
@@ -90,10 +89,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 oldval, u32 newv
        "4:     li.d    %0, %6                                  \n"
        "       b       3b                                      \n"
        "       .previous                                       \n"
-       "       .section __ex_table,\"a\"                       \n"
-       "       "__UA_ADDR "\t1b, 4b                            \n"
-       "       "__UA_ADDR "\t2b, 4b                            \n"
-       "       .previous                                       \n"
+       _ASM_EXTABLE(1b, 4b)
+       _ASM_EXTABLE(2b, 4b)
        : "+r" (ret), "=&r" (val), "=ZC" (*uaddr)
        : "ZC" (*uaddr), "Jr" (oldval), "Jr" (newval),
          "i" (-EFAULT)
index a8ae2af4025ab30f5f165c30f09f408f9377f69a..bf9a4e218ac0ed86d278980af2809714b9256e72 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/string.h>
 #include <linux/extable.h>
 #include <asm/pgtable.h>
+#include <asm/asm-extable.h>
 #include <asm-generic/extable.h>
 #include <asm-generic/access_ok.h>
 
@@ -165,9 +166,7 @@ do {                                                                        \
        "       move    %1, $zero                               \n"     \
        "       b       2b                                      \n"     \
        "       .previous                                       \n"     \
-       "       .section __ex_table,\"a\"                       \n"     \
-       "       "__UA_ADDR "\t1b, 3b                            \n"     \
-       "       .previous                                       \n"     \
+       _ASM_EXTABLE(1b, 3b)                                            \
        : "+r" (__gu_err), "=r" (__gu_tmp)                              \
        : "m" (__m(ptr)), "i" (-EFAULT));                               \
                                                                        \
@@ -196,9 +195,7 @@ do {                                                                        \
        "3:     li.w    %0, %3                                  \n"     \
        "       b       2b                                      \n"     \
        "       .previous                                       \n"     \
-       "       .section        __ex_table,\"a\"                \n"     \
-       "       " __UA_ADDR "   1b, 3b                          \n"     \
-       "       .previous                                       \n"     \
+       _ASM_EXTABLE(1b, 3b)                                            \
        : "+r" (__pu_err), "=m" (__m(ptr))                              \
        : "Jr" (__pu_val), "i" (-EFAULT));                              \
 }
index 576b3370a296da0e0db3b710df2f682e6b628a12..ccde94140c896d84e746b02fc16b9ba51d9ee6fa 100644 (file)
@@ -8,6 +8,7 @@
  */
 #include <asm/asm.h>
 #include <asm/asmmacro.h>
+#include <asm/asm-extable.h>
 #include <asm/asm-offsets.h>
 #include <asm/errno.h>
 #include <asm/export.h>
@@ -21,9 +22,7 @@
 
        .macro  EX insn, reg, src, offs
 .ex\@: \insn   \reg, \src, \offs
-       .section __ex_table,"a"
-       PTR     .ex\@, fault
-       .previous
+       _asm_extable .ex\@, fault
        .endm
 
        .macro sc_save_fp base
index 16ba2b8dd68ad9f601030c9e9c3ac40f202ca118..7a066d6a41b80293aa640907c4621f0862eb7534 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <asm/asm.h>
 #include <asm/asmmacro.h>
+#include <asm/asm-extable.h>
 #include <asm/export.h>
 #include <asm/regdef.h>
 
@@ -15,9 +16,7 @@
        jr      ra
        .previous
 .endif
-       .section __ex_table, "a"
-       PTR     \from\()b, \to\()b
-       .previous
+       _asm_extable \from\()b, \to\()b
 .endm
 
 /*
index 97d20327a69eeb1b91ec64d990583c314730a5f8..f8ace04586c26a6d4745f2de70334cd3ea56eee3 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <asm/asm.h>
 #include <asm/asmmacro.h>
+#include <asm/asm-extable.h>
 #include <asm/export.h>
 #include <asm/regdef.h>
 
@@ -15,9 +16,7 @@
        jr      ra
        .previous
 .endif
-       .section __ex_table, "a"
-       PTR     \from\()b, \to\()b
-       .previous
+       _asm_extable \from\()b, \to\()b
 .endm
 
 /*