Message ID | 20250313114329.284104-8-acarmina@redhat.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Add support for suppressing warning backtraces | expand |
On Thu, Mar 13, 2025 at 11:43:22AM +0000, Alessandro Carminati wrote: > diff --git a/arch/arm64/include/asm/bug.h b/arch/arm64/include/asm/bug.h > index 28be048db3f6..044c5e24a17d 100644 > --- a/arch/arm64/include/asm/bug.h > +++ b/arch/arm64/include/asm/bug.h > @@ -11,8 +11,14 @@ > > #include <asm/asm-bug.h> > > +#ifdef HAVE_BUG_FUNCTION > +# define __BUG_FUNC __func__ > +#else > +# define __BUG_FUNC NULL > +#endif > + > #define __BUG_FLAGS(flags) \ > - asm volatile (__stringify(ASM_BUG_FLAGS(flags))); > + asm volatile (__stringify(ASM_BUG_FLAGS(flags, %c0)) : : "i" (__BUG_FUNC)); Why is 'i' the right asm constraint to use here? It seems a bit odd to use that for a pointer. Will
Hello Will, On Thu, Mar 13, 2025 at 1:25 PM Will Deacon <will@kernel.org> wrote: > > On Thu, Mar 13, 2025 at 11:43:22AM +0000, Alessandro Carminati wrote: > > diff --git a/arch/arm64/include/asm/bug.h b/arch/arm64/include/asm/bug.h > > index 28be048db3f6..044c5e24a17d 100644 > > --- a/arch/arm64/include/asm/bug.h > > +++ b/arch/arm64/include/asm/bug.h > > @@ -11,8 +11,14 @@ > > > > #include <asm/asm-bug.h> > > > > +#ifdef HAVE_BUG_FUNCTION > > +# define __BUG_FUNC __func__ > > +#else > > +# define __BUG_FUNC NULL > > +#endif > > + > > #define __BUG_FLAGS(flags) \ > > - asm volatile (__stringify(ASM_BUG_FLAGS(flags))); > > + asm volatile (__stringify(ASM_BUG_FLAGS(flags, %c0)) : : "i" (__BUG_FUNC)); > > Why is 'i' the right asm constraint to use here? It seems a bit odd to > use that for a pointer. I received this code as legacy from a previous version. In my review, I considered the case when HAVE_BUG_FUNCTION is defined: Here, __BUG_FUNC is defined as __func__, which is the name of the current function as a string literal. Using the constraint "i" seems appropriate to me in this case. However, when HAVE_BUG_FUNCTION is not defined: __BUG_FUNC is defined as NULL. Initially, I considered it literal 0, but after investigating your concern, I found: ``` $ echo -E "#include <stdio.h>\n#include <stddef.h>\nint main() {\nreturn 0;\n}" | aarch64-linux-gnu-gcc -E -dM - | grep NULL #define NULL ((void *)0) ``` I realized that NULL is actually a pointer that is not a link time symbol, and using the "i" constraint with NULL may result in undefined behavior. Would the following alternative definition for __BUG_FUNC be more convincing? ``` #ifdef HAVE_BUG_FUNCTION #define __BUG_FUNC __func__ #else #define __BUG_FUNC (uintptr_t)0 #endif ``` Let me know your thoughts. > > Will > -- --- 172
diff --git a/arch/arm64/include/asm/asm-bug.h b/arch/arm64/include/asm/asm-bug.h index 6e73809f6492..bf0a5ba81611 100644 --- a/arch/arm64/include/asm/asm-bug.h +++ b/arch/arm64/include/asm/asm-bug.h @@ -8,37 +8,46 @@ #include <asm/brk-imm.h> #ifdef CONFIG_DEBUG_BUGVERBOSE -#define _BUGVERBOSE_LOCATION(file, line) __BUGVERBOSE_LOCATION(file, line) -#define __BUGVERBOSE_LOCATION(file, line) \ + +#ifdef CONFIG_KUNIT_SUPPRESS_BACKTRACE +# define HAVE_BUG_FUNCTION +# define __BUG_FUNC_PTR(func) .long func - .; +#else +# define __BUG_FUNC_PTR(func) +#endif + +#define _BUGVERBOSE_LOCATION(file, func, line) __BUGVERBOSE_LOCATION(file, func, line) +#define __BUGVERBOSE_LOCATION(file, func, line) \ .pushsection .rodata.str,"aMS",@progbits,1; \ 14472: .string file; \ .popsection; \ \ .long 14472b - .; \ + __BUG_FUNC_PTR(func) \ .short line; #else -#define _BUGVERBOSE_LOCATION(file, line) +#define _BUGVERBOSE_LOCATION(file, func, line) #endif #ifdef CONFIG_GENERIC_BUG -#define __BUG_ENTRY(flags) \ +#define __BUG_ENTRY(flags, func) \ .pushsection __bug_table,"aw"; \ .align 2; \ 14470: .long 14471f - .; \ -_BUGVERBOSE_LOCATION(__FILE__, __LINE__) \ +_BUGVERBOSE_LOCATION(__FILE__, func, __LINE__) \ .short flags; \ .align 2; \ .popsection; \ 14471: #else -#define __BUG_ENTRY(flags) +#define __BUG_ENTRY(flags, func) #endif -#define ASM_BUG_FLAGS(flags) \ - __BUG_ENTRY(flags) \ +#define ASM_BUG_FLAGS(flags, func) \ + __BUG_ENTRY(flags, func) \ brk BUG_BRK_IMM -#define ASM_BUG() ASM_BUG_FLAGS(0) +#define ASM_BUG() ASM_BUG_FLAGS(0, .) #endif /* __ASM_ASM_BUG_H */ diff --git a/arch/arm64/include/asm/bug.h b/arch/arm64/include/asm/bug.h index 28be048db3f6..044c5e24a17d 100644 --- a/arch/arm64/include/asm/bug.h +++ b/arch/arm64/include/asm/bug.h @@ -11,8 +11,14 @@ #include <asm/asm-bug.h> +#ifdef HAVE_BUG_FUNCTION +# define __BUG_FUNC __func__ +#else +# define __BUG_FUNC NULL +#endif + #define __BUG_FLAGS(flags) \ - asm volatile (__stringify(ASM_BUG_FLAGS(flags))); + asm volatile (__stringify(ASM_BUG_FLAGS(flags, %c0)) : : "i" (__BUG_FUNC)); #define BUG() do { \ __BUG_FLAGS(0); \