]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/bug: Add ARCH_WARN_ASM macro for BUG/WARN asm code sharing with Rust
authorFUJITA Tomonori <fujita.tomonori@gmail.com>
Fri, 2 May 2025 09:45:33 +0000 (18:45 +0900)
committerMiguel Ojeda <ojeda@kernel.org>
Tue, 22 Jul 2025 21:58:55 +0000 (23:58 +0200)
Add new ARCH_WARN_ASM macro for BUG/WARN assembly code sharing with
Rust to avoid the duplication.

No functional changes.

Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com>
Link: https://lore.kernel.org/r/20250502094537.231725-2-fujita.tomonori@gmail.com
[ Fixed typo in macro parameter name. - Miguel ]
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
arch/x86/include/asm/bug.h

index f0e9acf725471d8ee616b359695d030ba9a46ea3..20fcb8507ad12914ce8d0b0b68d71871bebe6b0e 100644 (file)
 #ifdef CONFIG_GENERIC_BUG
 
 #ifdef CONFIG_X86_32
-# define __BUG_REL(val)        ".long " __stringify(val)
+# define __BUG_REL(val)        ".long " val
 #else
-# define __BUG_REL(val)        ".long " __stringify(val) " - ."
+# define __BUG_REL(val)        ".long " val " - ."
 #endif
 
 #ifdef CONFIG_DEBUG_BUGVERBOSE
+#define __BUG_ENTRY(file, line, flags)                                 \
+       "2:\t" __BUG_REL("1b") "\t# bug_entry::bug_addr\n"              \
+       "\t" __BUG_REL(file)   "\t# bug_entry::file\n"                  \
+       "\t.word " line        "\t# bug_entry::line\n"                  \
+       "\t.word " flags       "\t# bug_entry::flags\n"
+#else
+#define __BUG_ENTRY(file, line, flags)                                 \
+       "2:\t" __BUG_REL("1b") "\t# bug_entry::bug_addr\n"              \
+       "\t.word " flags       "\t# bug_entry::flags\n"
+#endif
+
+#define _BUG_FLAGS_ASM(ins, file, line, flags, size, extra)            \
+       "1:\t" ins "\n"                                                 \
+       ".pushsection __bug_table,\"aw\"\n"                             \
+       __BUG_ENTRY(file, line, flags)                                  \
+       "\t.org 2b + " size "\n"                                        \
+       ".popsection\n"                                                 \
+       extra
 
 #define _BUG_FLAGS(ins, flags, extra)                                  \
 do {                                                                   \
-       asm_inline volatile("1:\t" ins "\n"                             \
-                    ".pushsection __bug_table,\"aw\"\n"                \
-                    "2:\t" __BUG_REL(1b) "\t# bug_entry::bug_addr\n"   \
-                    "\t"  __BUG_REL(%c0) "\t# bug_entry::file\n"       \
-                    "\t.word %c1"        "\t# bug_entry::line\n"       \
-                    "\t.word %c2"        "\t# bug_entry::flags\n"      \
-                    "\t.org 2b+%c3\n"                                  \
-                    ".popsection\n"                                    \
-                    extra                                              \
+       asm_inline volatile(_BUG_FLAGS_ASM(ins, "%c0",                  \
+                                          "%c1", "%c2", "%c3", extra)  \
                     : : "i" (__FILE__), "i" (__LINE__),                \
                         "i" (flags),                                   \
                         "i" (sizeof(struct bug_entry)));               \
 } while (0)
 
-#else /* !CONFIG_DEBUG_BUGVERBOSE */
-
-#define _BUG_FLAGS(ins, flags, extra)                                  \
-do {                                                                   \
-       asm_inline volatile("1:\t" ins "\n"                             \
-                    ".pushsection __bug_table,\"aw\"\n"                \
-                    "2:\t" __BUG_REL(1b) "\t# bug_entry::bug_addr\n"   \
-                    "\t.word %c0"        "\t# bug_entry::flags\n"      \
-                    "\t.org 2b+%c1\n"                                  \
-                    ".popsection\n"                                    \
-                    extra                                              \
-                    : : "i" (flags),                                   \
-                        "i" (sizeof(struct bug_entry)));               \
-} while (0)
-
-#endif /* CONFIG_DEBUG_BUGVERBOSE */
+#define ARCH_WARN_ASM(file, line, flags, size)                         \
+       _BUG_FLAGS_ASM(ASM_UD2, file, line, flags, size, "")
 
 #else
 
@@ -92,11 +89,14 @@ do {                                                                \
  * were to trigger, we'd rather wreck the machine in an attempt to get the
  * message out than not know about it.
  */
+
+#define ARCH_WARN_REACHABLE    ANNOTATE_REACHABLE(1b)
+
 #define __WARN_FLAGS(flags)                                    \
 do {                                                           \
        __auto_type __flags = BUGFLAG_WARNING|(flags);          \
        instrumentation_begin();                                \
-       _BUG_FLAGS(ASM_UD2, __flags, ANNOTATE_REACHABLE(1b));   \
+       _BUG_FLAGS(ASM_UD2, __flags, ARCH_WARN_REACHABLE);      \
        instrumentation_end();                                  \
 } while (0)