allow bug table entries to use relative pointers (and use it on x86-64)
Subsystems (3)
PATCH 1/1 allow bug table entries to use relative pointers (and use it on x86-64)
This allows reducing the bug table size by half. Perhaps there are other 64-bit architectures that could also make use of this.
Signed-off-by Jan Beulich <[email protected]>
--- arch/x86/Kconfig | 4 ++++ arch/x86/include/asm/bug.h | 2 +- include/asm-generic/bug.h | 8 ++++++++ lib/bug.c | 19 +++++++++++++++++-- 4 files changed, 30 insertions(+), 3 deletions(-)
arch/x86/Kconfig +4 -0
@@ -87,6 +87,10 @@ config GENERIC_IOMAP config GENERIC_BUG def_bool y depends on BUG + select GENERIC_BUG_RELATIVE_POINTERS if X86_64 + +config GENERIC_BUG_RELATIVE_POINTERS + bool config GENERIC_HWEIGHT def_bool y
arch/x86/include/asm/bug.h +1 -1
@@ -9,7 +9,7 @@#ifdef CONFIG_X86_32 # define __BUG_C0 "2:\t.long 1b, %c0\n"#else -# define __BUG_C0 "2:\t.quad 1b, %c0\n" +# define __BUG_C0 "2:\t.long 1b - 2b, %c0 - 2b\n"#endif #define BUG () \
include/asm-generic/bug.h +8 -0
@@ -8,9 +8,17 @@ #ifdef CONFIG_GENERIC_BUG #ifndef __ASSEMBLY__ struct bug_entry { +#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS unsigned long bug_addr; +#else + signed int bug_addr_disp; +#endif #ifdef CONFIG_DEBUG_BUGVERBOSE +#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS const char *file; +#else + signed int file_disp; +#endif unsigned short line; #endif unsigned short flags;
lib/bug.c +17 -2
@@ -5,6 +5,8 @@ CONFIG_BUG - emit BUG traps. Nothing happens without this. CONFIG_GENERIC_BUG - enable this code. + CONFIG_GENERIC_BUG_RELATIVE_POINTERS - use 32-bit pointers relative to + the containing struct bug_entry for bug_addr and file. CONFIG_DEBUG_BUGVERBOSE - emit full file+line information for each BUG CONFIG_BUG and CONFIG_DEBUG_BUGVERBOSE are potentially user-settable
@@ -43,6 +45,15 @@extern const struct bug_entry __start___bug_table[], __stop___bug_table[]; +static inline unsigned long bug_addr (const struct bug_entry *bug) +{ +#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS +return bug->bug_addr; +#else +return (unsigned long )bug + bug->bug_addr_disp; +#endif +} +#ifdef CONFIG_MODULES static LIST_HEAD (module_bug_list);
@@ -55,7 +66,7 @@ static const struct bug_entry *module_fiunsigned i;for (i =0 ; i < mod->num_bugs; ++i, ++bug) -if (bugaddr == bug->bug_addr) +if (bugaddr ==bug_addr (bug))return bug; }return NULL ;
@@ -108,7 +119,7 @@ const struct bug_entry *find_bug(unsigneconst struct bug_entry *bug;for (bug = __start___bug_table; bug < __stop___bug_table; ++bug) -if (bugaddr == bug->bug_addr) +if (bugaddr ==bug_addr (bug))return bug;return module_find_bug (bugaddr);
@@ -133,7 +144,11 @@ enum bug_trap_type report_bug(unsigned lif (bug) {#ifdef CONFIG_DEBUG_BUGVERBOSE +#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS file = bug->file; +#else + file = (const char *)bug + bug->file_disp; +#endif line = bug->line;#endif warning = (bug->flags &BUGFLAG_WARNING ) !=0 ;
Ingo Molnar
AppliedQuoted 11 lines · Jan Beulich
This allows reducing the bug table size by half. Perhaps there are other 64-bit architectures that could also make use of this.
Signed-off-by Jan Beulich <[email protected]>--- arch/x86/Kconfig | 4 ++++ arch/x86/include/asm/bug.h | 2 +- include/asm-generic/bug.h | 8 ++++++++ lib/bug.c | 19 +++++++++++++++++-- 4 files changed, 30 insertions(+), 3 deletions(-)
applied to tip/x86/debug, thanks Jan!
Ingo