Message ID | 20240312170309.2546362-11-linux@roeck-us.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add support for suppressing warning backtraces | expand |
On 3/12/24 18:03, Guenter Roeck wrote: > 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). > > While at it, declare assembler parameters as constants where possible. > Refine .blockz instructions to calculate the necessary padding instead > of using fixed values. > > Signed-off-by: Guenter Roeck <linux@roeck-us.net> Acked-by: Helge Deller <deller@gmx.de> Helge > --- > arch/parisc/include/asm/bug.h | 29 +++++++++++++++++++++-------- > 1 file changed, 21 insertions(+), 8 deletions(-) > > diff --git a/arch/parisc/include/asm/bug.h b/arch/parisc/include/asm/bug.h > index 833555f74ffa..792dacc2a653 100644 > --- a/arch/parisc/include/asm/bug.h > +++ b/arch/parisc/include/asm/bug.h > @@ -23,8 +23,17 @@ > # define __BUG_REL(val) ".word " __stringify(val) > #endif > > - > #ifdef CONFIG_DEBUG_BUGVERBOSE > + > +#if IS_ENABLED(CONFIG_KUNIT) > +# define HAVE_BUG_FUNCTION > +# define __BUG_FUNC_PTR __BUG_REL(%c1) > +# define __BUG_FUNC __func__ > +#else > +# define __BUG_FUNC_PTR > +# define __BUG_FUNC NULL > +#endif /* IS_ENABLED(CONFIG_KUNIT) */ > + > #define BUG() \ > do { \ > asm volatile("\n" \ > @@ -33,10 +42,12 @@ > "\t.align 4\n" \ > "2:\t" __BUG_REL(1b) "\n" \ > "\t" __BUG_REL(%c0) "\n" \ > - "\t.short %1, %2\n" \ > - "\t.blockz %3-2*4-2*2\n" \ > + "\t" __BUG_FUNC_PTR "\n" \ > + "\t.short %c2, %c3\n" \ > + "\t.blockz %c4-(.-2b)\n" \ > "\t.popsection" \ > - : : "i" (__FILE__), "i" (__LINE__), \ > + : : "i" (__FILE__), "i" (__BUG_FUNC), \ > + "i" (__LINE__), \ > "i" (0), "i" (sizeof(struct bug_entry)) ); \ > unreachable(); \ > } while(0) > @@ -58,10 +69,12 @@ > "\t.align 4\n" \ > "2:\t" __BUG_REL(1b) "\n" \ > "\t" __BUG_REL(%c0) "\n" \ > - "\t.short %1, %2\n" \ > - "\t.blockz %3-2*4-2*2\n" \ > + "\t" __BUG_FUNC_PTR "\n" \ > + "\t.short %c2, %3\n" \ > + "\t.blockz %c4-(.-2b)\n" \ > "\t.popsection" \ > - : : "i" (__FILE__), "i" (__LINE__), \ > + : : "i" (__FILE__), "i" (__BUG_FUNC), \ > + "i" (__LINE__), \ > "i" (BUGFLAG_WARNING|(flags)), \ > "i" (sizeof(struct bug_entry)) ); \ > } while(0) > @@ -74,7 +87,7 @@ > "\t.align 4\n" \ > "2:\t" __BUG_REL(1b) "\n" \ > "\t.short %0\n" \ > - "\t.blockz %1-4-2\n" \ > + "\t.blockz %c1-(.-2b)\n" \ > "\t.popsection" \ > : : "i" (BUGFLAG_WARNING|(flags)), \ > "i" (sizeof(struct bug_entry)) ); \
diff --git a/arch/parisc/include/asm/bug.h b/arch/parisc/include/asm/bug.h index 833555f74ffa..792dacc2a653 100644 --- a/arch/parisc/include/asm/bug.h +++ b/arch/parisc/include/asm/bug.h @@ -23,8 +23,17 @@ # define __BUG_REL(val) ".word " __stringify(val) #endif - #ifdef CONFIG_DEBUG_BUGVERBOSE + +#if IS_ENABLED(CONFIG_KUNIT) +# define HAVE_BUG_FUNCTION +# define __BUG_FUNC_PTR __BUG_REL(%c1) +# define __BUG_FUNC __func__ +#else +# define __BUG_FUNC_PTR +# define __BUG_FUNC NULL +#endif /* IS_ENABLED(CONFIG_KUNIT) */ + #define BUG() \ do { \ asm volatile("\n" \ @@ -33,10 +42,12 @@ "\t.align 4\n" \ "2:\t" __BUG_REL(1b) "\n" \ "\t" __BUG_REL(%c0) "\n" \ - "\t.short %1, %2\n" \ - "\t.blockz %3-2*4-2*2\n" \ + "\t" __BUG_FUNC_PTR "\n" \ + "\t.short %c2, %c3\n" \ + "\t.blockz %c4-(.-2b)\n" \ "\t.popsection" \ - : : "i" (__FILE__), "i" (__LINE__), \ + : : "i" (__FILE__), "i" (__BUG_FUNC), \ + "i" (__LINE__), \ "i" (0), "i" (sizeof(struct bug_entry)) ); \ unreachable(); \ } while(0) @@ -58,10 +69,12 @@ "\t.align 4\n" \ "2:\t" __BUG_REL(1b) "\n" \ "\t" __BUG_REL(%c0) "\n" \ - "\t.short %1, %2\n" \ - "\t.blockz %3-2*4-2*2\n" \ + "\t" __BUG_FUNC_PTR "\n" \ + "\t.short %c2, %3\n" \ + "\t.blockz %c4-(.-2b)\n" \ "\t.popsection" \ - : : "i" (__FILE__), "i" (__LINE__), \ + : : "i" (__FILE__), "i" (__BUG_FUNC), \ + "i" (__LINE__), \ "i" (BUGFLAG_WARNING|(flags)), \ "i" (sizeof(struct bug_entry)) ); \ } while(0) @@ -74,7 +87,7 @@ "\t.align 4\n" \ "2:\t" __BUG_REL(1b) "\n" \ "\t.short %0\n" \ - "\t.blockz %1-4-2\n" \ + "\t.blockz %c1-(.-2b)\n" \ "\t.popsection" \ : : "i" (BUGFLAG_WARNING|(flags)), \ "i" (sizeof(struct bug_entry)) ); \
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). While at it, declare assembler parameters as constants where possible. Refine .blockz instructions to calculate the necessary padding instead of using fixed values. Signed-off-by: Guenter Roeck <linux@roeck-us.net> --- arch/parisc/include/asm/bug.h | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-)