Add name of functions triggering warning backtraces to the __bug_table
object section to enable support for suppressing WARNING backtraces.

To limit image size impact, the pointer to the function name is only added
to the __bug_table section if both CONFIG_KUNIT and CONFIG_DEBUG_BUGVERBOSE
are enabled. Otherwise, the __func__ assembly parameter is replaced with a
(dummy) NULL parameter to avoid an image size increase due to unused
__func__ entries (this is necessary because __func__ is not a define but a
virtual variable).

Signed-off-by: Guenter Roeck <li...@roeck-us.net>
---
 arch/powerpc/include/asm/bug.h | 37 +++++++++++++++++++++++++---------
 1 file changed, 28 insertions(+), 9 deletions(-)

diff --git a/arch/powerpc/include/asm/bug.h b/arch/powerpc/include/asm/bug.h
index 1db485aacbd9..330d4983f90e 100644
--- a/arch/powerpc/include/asm/bug.h
+++ b/arch/powerpc/include/asm/bug.h
@@ -14,6 +14,9 @@
         .section __bug_table,"aw"
 5001:   .4byte \addr - .
         .4byte 5002f - .
+#if IS_ENABLED(CONFIG_KUNIT)
+        .4byte 0
+#endif
         .short \line, \flags
         .org 5001b+BUG_ENTRY_SIZE
         .previous
@@ -32,30 +35,46 @@
 #endif /* verbose */
 
 #else /* !__ASSEMBLY__ */
-/* _EMIT_BUG_ENTRY expects args %0,%1,%2,%3 to be FILE, LINE, flags and
-   sizeof(struct bug_entry), respectively */
+/* _EMIT_BUG_ENTRY expects args %0,%1,%2,%3,%4 to be FILE, __func__, LINE, 
flags
+   and sizeof(struct bug_entry), respectively */
 #ifdef CONFIG_DEBUG_BUGVERBOSE
+
+#if IS_ENABLED(CONFIG_KUNIT)
+# define HAVE_BUG_FUNCTION
+# define __BUG_FUNC_PTR        "       .4byte %1 - .\n"
+#else
+# define __BUG_FUNC_PTR
+#endif /* IS_ENABLED(CONFIG_KUNIT) */
+
 #define _EMIT_BUG_ENTRY                                \
        ".section __bug_table,\"aw\"\n"         \
        "2:     .4byte 1b - .\n"                \
        "       .4byte %0 - .\n"                \
-       "       .short %1, %2\n"                \
-       ".org 2b+%3\n"                          \
+       __BUG_FUNC_PTR                          \
+       "       .short %2, %3\n"                \
+       ".org 2b+%4\n"                          \
        ".previous\n"
 #else
 #define _EMIT_BUG_ENTRY                                \
        ".section __bug_table,\"aw\"\n"         \
        "2:     .4byte 1b - .\n"                \
-       "       .short %2\n"                    \
-       ".org 2b+%3\n"                          \
+       "       .short %3\n"                    \
+       ".org 2b+%4\n"                          \
        ".previous\n"
 #endif
 
+#ifdef HAVE_BUG_FUNCTION
+# define __BUG_FUNC    __func__
+#else
+# define __BUG_FUNC    NULL
+#endif
+
 #define BUG_ENTRY(insn, flags, ...)                    \
        __asm__ __volatile__(                           \
                "1:     " insn "\n"                     \
                _EMIT_BUG_ENTRY                         \
-               : : "i" (__FILE__), "i" (__LINE__),     \
+               : : "i" (__FILE__), "i" (__BUG_FUNC),   \
+                 "i" (__LINE__),                       \
                  "i" (flags),                          \
                  "i" (sizeof(struct bug_entry)),       \
                  ##__VA_ARGS__)
@@ -80,7 +99,7 @@
                if (x)                                          \
                        BUG();                                  \
        } else {                                                \
-               BUG_ENTRY(PPC_TLNEI " %4, 0", 0, "r" ((__force long)(x)));      
\
+               BUG_ENTRY(PPC_TLNEI " %5, 0", 0, "r" ((__force long)(x)));      
\
        }                                                       \
 } while (0)
 
@@ -90,7 +109,7 @@
                if (__ret_warn_on)                              \
                        __WARN();                               \
        } else {                                                \
-               BUG_ENTRY(PPC_TLNEI " %4, 0",                   \
+               BUG_ENTRY(PPC_TLNEI " %5, 0",                   \
                          BUGFLAG_WARNING | BUGFLAG_TAINT(TAINT_WARN),  \
                          "r" (__ret_warn_on)); \
        }                                                       \
-- 
2.39.2

Reply via email to