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/loongarch/include/asm/bug.h | 38 +++++++++++++++++++++++---------
 1 file changed, 27 insertions(+), 11 deletions(-)

diff --git a/arch/loongarch/include/asm/bug.h b/arch/loongarch/include/asm/bug.h
index d4ca3ba25418..25f2b5ae7702 100644
--- a/arch/loongarch/include/asm/bug.h
+++ b/arch/loongarch/include/asm/bug.h
@@ -3,47 +3,63 @@
 #define __ASM_BUG_H
 
 #include <asm/break.h>
+#include <kunit/bug.h>
 #include <linux/stringify.h>
 
 #ifndef CONFIG_DEBUG_BUGVERBOSE
-#define _BUGVERBOSE_LOCATION(file, line)
+#define _BUGVERBOSE_LOCATION(file, func, line)
 #else
-#define __BUGVERBOSE_LOCATION(file, line)                      \
+#if IS_ENABLED(CONFIG_KUNIT)
+# define HAVE_BUG_FUNCTION
+# define __BUG_FUNC_PTR(func)  .long func - .;
+#else
+# define __BUG_FUNC_PTR(func)
+#endif
+
+#define __BUGVERBOSE_LOCATION(file, func, line)                        \
                .pushsection .rodata.str, "aMS", @progbits, 1;  \
        10002:  .string file;                                   \
                .popsection;                                    \
                                                                \
                .long 10002b - .;                               \
+               __BUG_FUNC_PTR(func)                            \
                .short line;
-#define _BUGVERBOSE_LOCATION(file, line) __BUGVERBOSE_LOCATION(file, line)
+#define _BUGVERBOSE_LOCATION(file, func, line) __BUGVERBOSE_LOCATION(file, 
func, line)
 #endif
 
 #ifndef CONFIG_GENERIC_BUG
-#define __BUG_ENTRY(flags)
+#define __BUG_ENTRY(flags, func)
 #else
-#define __BUG_ENTRY(flags)                                     \
+#define __BUG_ENTRY(flags, func)                               \
                .pushsection __bug_table, "aw";                 \
                .align 2;                                       \
        10000:  .long 10001f - .;                               \
-               _BUGVERBOSE_LOCATION(__FILE__, __LINE__)        \
+               _BUGVERBOSE_LOCATION(__FILE__, func, __LINE__)  \
                .short flags;                                   \
                .popsection;                                    \
        10001:
 #endif
 
-#define ASM_BUG_FLAGS(flags)                                   \
-       __BUG_ENTRY(flags)                                      \
+#define ASM_BUG_FLAGS(flags, func)                             \
+       __BUG_ENTRY(flags, func)                                \
        break           BRK_BUG
 
-#define ASM_BUG()      ASM_BUG_FLAGS(0)
+#define ASM_BUG()      ASM_BUG_FLAGS(0, .)
+
+#ifdef HAVE_BUG_FUNCTION
+# define __BUG_FUNC    __func__
+#else
+# define __BUG_FUNC    NULL
+#endif
 
 #define __BUG_FLAGS(flags)                                     \
-       asm_inline volatile (__stringify(ASM_BUG_FLAGS(flags)));
+       asm_inline volatile (__stringify(ASM_BUG_FLAGS(flags, %0)) : : "i" 
(__BUG_FUNC));
 
 #define __WARN_FLAGS(flags)                                    \
 do {                                                           \
        instrumentation_begin();                                \
-       __BUG_FLAGS(BUGFLAG_WARNING|(flags));                   \
+       if (!IS_SUPPRESSED_WARNING(__func__))                   \
+               __BUG_FLAGS(BUGFLAG_WARNING|(flags));           \
        instrumentation_end();                                  \
 } while (0)
 
-- 
2.39.2

Reply via email to