]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bugs/s390: Use 'cond_str' in __EMIT_BUG()
authorHeiko Carstens <hca@linux.ibm.com>
Tue, 20 May 2025 13:39:27 +0000 (15:39 +0200)
committerIngo Molnar <mingo@kernel.org>
Mon, 28 Jul 2025 06:02:43 +0000 (08:02 +0200)
The simple thing would be to add the string as an assembly immediate
input operand. Some older gcc variants cannot handle strings as
immediate input operands for inline assemblies. Doing so may result in
compile errors.

Rewrite the s390 generic bug support very similar to arm64 and
loongarch, and get rid of all input operands to fix this.

  [ peterz: backmerge fix and massage changelog ]

  [ bp: clang integrated assembler concatenates only .ascii strings:
    https://lore.kernel.org/r/202507020528.N0LtekXt-lkp@intel.com ]

Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org> # Fixed the tags section
Acked-by: Alexander Gordeev <agordeev@linux.ibm.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: linux-arch@vger.kernel.org
Cc: Vasily Gorbik <gor@linux.ibm.com>
Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
Cc: Sven Schnelle <svens@linux.ibm.com>
Cc: linux-s390@vger.kernel.org
Link: https://lore.kernel.org/r/20250520133927.7932C19-hca@linux.ibm.com
Link: https://lore.kernel.org/r/20250617135042.1878068-3-hca@linux.ibm.com
arch/s390/include/asm/bug.h

index 30f8785a01f5105bd3720634bd1d779a03bae315..c39500eec3008afb599a34106c290e770ebeb94e 100644 (file)
@@ -2,52 +2,52 @@
 #ifndef _ASM_S390_BUG_H
 #define _ASM_S390_BUG_H
 
-#include <linux/compiler.h>
+#include <linux/stringify.h>
 
-#ifdef CONFIG_BUG
+#ifndef CONFIG_DEBUG_BUGVERBOSE
+#define _BUGVERBOSE_LOCATION(file, line)
+#else
+#define __BUGVERBOSE_LOCATION(file, line)                      \
+               .pushsection .rodata.str, "aMS", @progbits, 1;  \
+       10002:  .ascii file "\0";                               \
+               .popsection;                                    \
+                                                               \
+               .long 10002b - .;                               \
+               .short line;
+#define _BUGVERBOSE_LOCATION(file, line) __BUGVERBOSE_LOCATION(file, line)
+#endif
 
-#ifdef CONFIG_DEBUG_BUGVERBOSE
+#ifndef CONFIG_GENERIC_BUG
+#define __BUG_ENTRY(cond_str, flags)
+#else
+#define __BUG_ENTRY(cond_str, flags)                           \
+               .pushsection __bug_table, "aw";                 \
+               .align 4;                                       \
+       10000:  .long 10001f - .;                               \
+               _BUGVERBOSE_LOCATION(WARN_CONDITION_STR(cond_str) __FILE__, __LINE__) \
+               .short flags;                                   \
+               .popsection;                                    \
+       10001:
+#endif
 
-#define __EMIT_BUG(cond_str, x) do {                           \
-       asm_inline volatile(                                    \
-               "0:     mc      0,0\n"                          \
-               ".section .rodata.str,\"aMS\",@progbits,1\n"    \
-               "1:     .asciz  \""__FILE__"\"\n"               \
-               ".previous\n"                                   \
-               ".section __bug_table,\"aw\"\n"                 \
-               "2:     .long   0b-.\n"                         \
-               "       .long   1b-.\n"                         \
-               "       .short  %0,%1\n"                        \
-               "       .org    2b+%2\n"                        \
-               ".previous\n"                                   \
-               : : "i" (__LINE__),                             \
-                   "i" (x),                                    \
-                   "i" (sizeof(struct bug_entry)));            \
-} while (0)
-
-#else /* CONFIG_DEBUG_BUGVERBOSE */
+#define ASM_BUG_FLAGS(cond_str, flags)                         \
+       __BUG_ENTRY(cond_str, flags)                            \
+       mc              0,0
 
-#define __EMIT_BUG(cond_str, x) do {                           \
-       asm_inline volatile(                                    \
-               "0:     mc      0,0\n"                          \
-               ".section __bug_table,\"aw\"\n"                 \
-               "1:     .long   0b-.\n"                         \
-               "       .short  %0\n"                           \
-               "       .org    1b+%1\n"                        \
-               ".previous\n"                                   \
-               : : "i" (x),                                    \
-                   "i" (sizeof(struct bug_entry)));            \
-} while (0)
+#define ASM_BUG()      ASM_BUG_FLAGS("", 0)
 
-#endif /* CONFIG_DEBUG_BUGVERBOSE */
+#define __BUG_FLAGS(cond_str, flags)                           \
+       asm_inline volatile(__stringify(ASM_BUG_FLAGS(cond_str, flags)));
 
-#define BUG() do {                                     \
-       __EMIT_BUG("", 0);                              \
-       unreachable();                                  \
+#define __WARN_FLAGS(cond_str, flags)                          \
+do {                                                           \
+       __BUG_FLAGS(cond_str, BUGFLAG_WARNING|(flags));         \
 } while (0)
 
-#define __WARN_FLAGS(cond_str, flags) do {             \
-       __EMIT_BUG(cond_str, BUGFLAG_WARNING|(flags));  \
+#define BUG()                                                  \
+do {                                                           \
+       __BUG_FLAGS("", 0);                                     \
+       unreachable();                                          \
 } while (0)
 
 #define WARN_ON(x) ({                                  \
@@ -64,7 +64,6 @@
 
 #define HAVE_ARCH_BUG
 #define HAVE_ARCH_WARN_ON
-#endif /* CONFIG_BUG */
 
 #include <asm-generic/bug.h>