arm64: extable: consolidate definitions
authorMark Rutland <mark.rutland@arm.com>
Tue, 19 Oct 2021 16:02:13 +0000 (17:02 +0100)
committerWill Deacon <will@kernel.org>
Thu, 21 Oct 2021 09:45:22 +0000 (10:45 +0100)
In subsequent patches we'll alter the structure and usage of struct
exception_table_entry. For inline assembly, we create these using the
`_ASM_EXTABLE()` CPP macro defined in <asm/uaccess.h>, and for plain
assembly code we use the `_asm_extable()` GAS macro defined in
<asm/assembler.h>, which are largely identical save for different
escaping and stringification requirements.

This patch moves the common definitions to a new <asm/asm-extable.h>
header, so that it's easier to keep the two in-sync, and to remove the
implication that these are only used for uaccess helpers (as e.g.
load_unaligned_zeropad() is only used on kernel memory, and depends upon
`_ASM_EXTABLE()`.

At the same time, a few minor modifications are made for clarity and in
preparation for subsequent patches:

* The structure creation is factored out into an `__ASM_EXTABLE_RAW()`
  macro. This will make it easier to support different fixup variants in
  subsequent patches without needing to update all users of
  `_ASM_EXTABLE()`, and makes it easier to see tha the CPP and GAS
  variants of the macros are structurally identical.

  For the CPP macro, the stringification of fields is left to the
  wrapper macro, `_ASM_EXTABLE()`, as in subsequent patches it will be
  necessary to stringify fields in wrapper macros to safely concatenate
  strings which cannot be token-pasted together in CPP.

* The fields of the structure are created separately on their own lines.
  This will make it easier to add/remove/modify individual fields
  clearly.

* Additional parentheses are added around the use of macro arguments in
  field definitions to avoid any potential problems with evaluation due
  to operator precedence, and to make errors upon misuse clearer.

* USER() is moved into <asm/asm-uaccess.h>, as it is not required by all
  assembly code, and is already refered to by comments in that file.

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

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: James Morse <james.morse@arm.com>
Cc: Robin Murphy <robin.murphy@arm.com>
Cc: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20211019160219.5202-8-mark.rutland@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/include/asm/asm-extable.h [new file with mode: 0644]
arch/arm64/include/asm/asm-uaccess.h
arch/arm64/include/asm/assembler.h
arch/arm64/include/asm/uaccess.h
arch/arm64/lib/clear_user.S

diff --git a/arch/arm64/include/asm/asm-extable.h b/arch/arm64/include/asm/asm-extable.h
new file mode 100644 (file)
index 0000000..986b4c0
--- /dev/null
@@ -0,0 +1,48 @@
+/* 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";        \
+       .align          3;                      \
+       .long           ((insn) - .);           \
+       .long           ((fixup) - .);          \
+       .popsection;
+
+/*
+ * Create an exception table entry for `insn`, which will branch to `fixup`
+ * when an unhandled fault is taken.
+ */
+       .macro          _asm_extable, insn, fixup
+       __ASM_EXTABLE_RAW(\insn, \fixup)
+       .endm
+
+/*
+ * Create an exception table entry for `insn` if `fixup` is provided. Otherwise
+ * do nothing.
+ */
+       .macro          _cond_extable, insn, fixup
+       .ifnc           \fixup,
+       _asm_extable    \insn, \fixup
+       .endif
+       .endm
+
+#else /* __ASSEMBLY__ */
+
+#include <linux/stringify.h>
+
+#define __ASM_EXTABLE_RAW(insn, fixup)         \
+       ".pushsection   __ex_table, \"a\"\n"    \
+       ".align         3\n"                    \
+       ".long          ((" insn ") - .)\n"     \
+       ".long          ((" fixup ") - .)\n"    \
+       ".popsection\n"
+
+#define _ASM_EXTABLE(insn, fixup) \
+       __ASM_EXTABLE_RAW(#insn, #fixup)
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* __ASM_ASM_EXTABLE_H */
index ccedf548dac930b89c9a51e3580c4be763e2ae71..0557af834e036958e1555097beafe55042b1d7b4 100644 (file)
@@ -3,10 +3,11 @@
 #define __ASM_ASM_UACCESS_H
 
 #include <asm/alternative-macros.h>
+#include <asm/asm-extable.h>
+#include <asm/assembler.h>
 #include <asm/kernel-pgtable.h>
 #include <asm/mmu.h>
 #include <asm/sysreg.h>
-#include <asm/assembler.h>
 
 /*
  * User access enabling/disabling macros.
@@ -58,6 +59,10 @@ alternative_else_nop_endif
        .endm
 #endif
 
+#define USER(l, x...)                          \
+9999:  x;                                      \
+       _asm_extable    9999b, l
+
 /*
  * Generate the assembly for LDTR/STTR with exception table entries.
  * This is complicated as there is no post-increment or pair versions of the
index bfa58409a4d4da3221f44ffc5d08bae2812b92cf..ec67480d55fb42d10ccd36656991fde7cf2af617 100644 (file)
 
 #include <asm-generic/export.h>
 
-#include <asm/asm-offsets.h>
 #include <asm/alternative.h>
 #include <asm/asm-bug.h>
+#include <asm/asm-extable.h>
+#include <asm/asm-offsets.h>
 #include <asm/cpufeature.h>
 #include <asm/cputype.h>
 #include <asm/debug-monitors.h>
@@ -129,32 +130,6 @@ alternative_endif
        .endr
        .endm
 
-/*
- * Create an exception table entry for `insn`, which will branch to `fixup`
- * when an unhandled fault is taken.
- */
-       .macro          _asm_extable, insn, fixup
-       .pushsection    __ex_table, "a"
-       .align          3
-       .long           (\insn - .), (\fixup - .)
-       .popsection
-       .endm
-
-/*
- * Create an exception table entry for `insn` if `fixup` is provided. Otherwise
- * do nothing.
- */
-       .macro          _cond_extable, insn, fixup
-       .ifnc           \fixup,
-       _asm_extable    \insn, \fixup
-       .endif
-       .endm
-
-
-#define USER(l, x...)                          \
-9999:  x;                                      \
-       _asm_extable    9999b, l
-
 /*
  * Register aliases.
  */
index 190b494e22ab91d9988a914bbb05fe1c687a1b65..759019523b8574dc991b4744642a3d936bea2ad9 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/kasan-checks.h>
 #include <linux/string.h>
 
+#include <asm/asm-extable.h>
 #include <asm/cpufeature.h>
 #include <asm/mmu.h>
 #include <asm/mte.h>
@@ -70,12 +71,6 @@ static inline unsigned long __range_ok(const void __user *addr, unsigned long si
 
 #define access_ok(addr, size)  __range_ok(addr, size)
 
-#define _ASM_EXTABLE(from, to)                                         \
-       "       .pushsection    __ex_table, \"a\"\n"                    \
-       "       .align          3\n"                                    \
-       "       .long           (" #from " - .), (" #to " - .)\n"       \
-       "       .popsection\n"
-
 /*
  * User access enabling/disabling.
  */
index 2827fddc33f832d7349cb535440bebe40435f138..a5a5f5b97b175c6459a1b9fae5ced0c82236baf1 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 #include <linux/linkage.h>
-#include <asm/assembler.h>
+#include <asm/asm-uaccess.h>
 
        .text