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_SUPPRESS_BACKTRACE 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).

Tested-by: Linux Kernel Functional Testing <l...@linaro.org>
Acked-by: Dan Carpenter <dan.carpen...@linaro.org>
Cc: Michael Ellerman <m...@ellerman.id.au>
Signed-off-by: Guenter Roeck <li...@roeck-us.net>
---
v2:
- Rebased to v6.9-rc1
- Added Tested-by:, Acked-by:, and Reviewed-by: tags
- Introduced KUNIT_SUPPRESS_BACKTRACE configuration option
v3:
- Rebased to v6.9-rc2

 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..5b06745d20aa 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 - .
+#ifdef CONFIG_KUNIT_SUPPRESS_BACKTRACE
+        .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
+
+#ifdef CONFIG_KUNIT_SUPPRESS_BACKTRACE
+# define HAVE_BUG_FUNCTION
+# define __BUG_FUNC_PTR        "       .4byte %1 - .\n"
+#else
+# define __BUG_FUNC_PTR
+#endif /* CONFIG_KUNIT_SUPPRESS_BACKTRACE */
+
 #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