powerpc: Refactor BUG/WARN macros
authorChristophe Leroy <christophe.leroy@c-s.fr>
Mon, 19 Aug 2019 13:06:30 +0000 (13:06 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 18 Nov 2019 11:27:51 +0000 (22:27 +1100)
BUG(), WARN() and friends are using a similar inline assembly to
implement various traps with various flags.

Lets refactor via a new BUG_ENTRY() macro.

Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/c19a82b37677ace0eebb0dc8c2120373c29c8dd1.1566219503.git.christophe.leroy@c-s.fr
arch/powerpc/include/asm/bug.h

index f47e6ff..338f36c 100644 (file)
        ".previous\n"
 #endif
 
+#define BUG_ENTRY(insn, flags, ...)                    \
+       __asm__ __volatile__(                           \
+               "1:     " insn "\n"                     \
+               _EMIT_BUG_ENTRY                         \
+               : : "i" (__FILE__), "i" (__LINE__),     \
+                 "i" (flags),                          \
+                 "i" (sizeof(struct bug_entry)),       \
+                 ##__VA_ARGS__)
+
 /*
  * BUG_ON() and WARN_ON() do their best to cooperate with compile-time
  * optimisations. However depending on the complexity of the condition
  */
 
 #define BUG() do {                                             \
-       __asm__ __volatile__(                                   \
-               "1:     twi 31,0,0\n"                           \
-               _EMIT_BUG_ENTRY                                 \
-               : : "i" (__FILE__), "i" (__LINE__),             \
-                   "i" (0), "i"  (sizeof(struct bug_entry)));  \
+       BUG_ENTRY("twi 31, 0, 0", 0);                           \
        unreachable();                                          \
 } while (0)
 
                if (x)                                          \
                        BUG();                                  \
        } else {                                                \
-               __asm__ __volatile__(                           \
-               "1:     "PPC_TLNEI"     %4,0\n"                 \
-               _EMIT_BUG_ENTRY                                 \
-               : : "i" (__FILE__), "i" (__LINE__), "i" (0),    \
-                 "i" (sizeof(struct bug_entry)),               \
-                 "r" ((__force long)(x)));                     \
+               BUG_ENTRY(PPC_TLNEI " %4, 0", 0, "r" ((__force long)(x)));      \
        }                                                       \
 } while (0)
 
-#define __WARN_FLAGS(flags) do {                               \
-       __asm__ __volatile__(                                   \
-               "1:     twi 31,0,0\n"                           \
-               _EMIT_BUG_ENTRY                                 \
-               : : "i" (__FILE__), "i" (__LINE__),             \
-                 "i" (BUGFLAG_WARNING|(flags)),                \
-                 "i" (sizeof(struct bug_entry)));              \
-} while (0)
+#define __WARN_FLAGS(flags) BUG_ENTRY("twi 31, 0, 0", BUGFLAG_WARNING | (flags))
 
 #define WARN_ON(x) ({                                          \
        int __ret_warn_on = !!(x);                              \
                if (__ret_warn_on)                              \
                        __WARN();                               \
        } else {                                                \
-               __asm__ __volatile__(                           \
-               "1:     "PPC_TLNEI"     %4,0\n"                 \
-               _EMIT_BUG_ENTRY                                 \
-               : : "i" (__FILE__), "i" (__LINE__),             \
-                 "i" (BUGFLAG_WARNING|BUGFLAG_TAINT(TAINT_WARN)),\
-                 "i" (sizeof(struct bug_entry)),               \
-                 "r" (__ret_warn_on));                         \
+               BUG_ENTRY(PPC_TLNEI " %4, 0",                   \
+                         BUGFLAG_WARNING | BUGFLAG_TAINT(TAINT_WARN),  \
+                         "r" (__ret_warn_on)); \
        }                                                       \
        unlikely(__ret_warn_on);                                \
 })