Messages in this thread Patch in this message | | | From | Maninder Singh <> | Subject | [PATCH 1/1] kallsyms: print module name in %ps/S case when KALLSYMS is disabled | Date | Tue, 1 Feb 2022 09:30:44 +0530 |
| |
original: With KALLSYMS %pS %ps [16.4200] hello_init+0x0/0x24 [crash] hello_init [crash]
Without KALLSYMS: [16.2200] 0xbe200040 0xbe200040
With Patch (Without KALLSYMS:) load address + current offset [Module Name]
[13.5993] 0xbe200000+0x40 [crash] 0xbe200000+0x40 [crash]
It will help in better debugging and checking when KALLSYMS is disabled, user will get information about module name and load address of module.
verified for arm64: / # insmod /crash.ko
[ 19.263556] 0xffff800000ec0000+0x38 [crash]
..
[ 19.276023] Call trace: [ 19.276277] 0xffff800000ec0000+0x28 [crash] [ 19.276567] 0xffff800000ec0000+0x58 [crash] [ 19.276727] 0xffff800000ec0000+0x74 [crash] [ 19.276866] 0xffff8000080127d0 [ 19.276978] 0xffff80000812d95c [ 19.277085] 0xffff80000812f554
Signed-off-by: Vaneet Narang <v.narang@samsung.com> Signed-off-by: Maninder Singh <maninder1.s@samsung.com> --- include/linux/kallsyms.h | 27 +++++++++++++++++++++++++++ lib/vsprintf.c | 5 +++-- 2 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/include/linux/kallsyms.h b/include/linux/kallsyms.h index 5fb17dd4b6fa..ebfeb6099c28 100644 --- a/include/linux/kallsyms.h +++ b/include/linux/kallsyms.h @@ -163,6 +163,33 @@ static inline bool kallsyms_show_value(const struct cred *cred) return false; } +#ifdef CONFIG_MODULES +static inline int fill_minimal_module_info(char *sym, int size, unsigned long value) +{ + struct module *mod; + unsigned long offset; + int ret = 0; + + preempt_disable(); + mod = __module_address(value); + if (mod) { + offset = value - (unsigned long)mod->core_layout.base; + snprintf(sym, size - 1, "0x%lx+0x%lx [%s]", + (unsigned long)mod->core_layout.base, offset, mod->name); + + sym[size - 1] = '\0'; + ret = 1; + } + + preempt_enable(); + return ret; +} +#else +static inline int fill_minimal_module_info(char *sym, int size, unsigned long value) +{ + return 0; +} +#endif /*CONFIG_MODULES*/ #endif /*CONFIG_KALLSYMS*/ static inline void print_ip_sym(const char *loglvl, unsigned long ip) diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 61528094ec87..41c74abb1726 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -985,9 +985,7 @@ char *symbol_string(char *buf, char *end, void *ptr, struct printf_spec spec, const char *fmt) { unsigned long value; -#ifdef CONFIG_KALLSYMS char sym[KSYM_SYMBOL_LEN]; -#endif if (fmt[1] == 'R') ptr = __builtin_extract_return_addr(ptr); @@ -1007,6 +1005,9 @@ char *symbol_string(char *buf, char *end, void *ptr, return string_nocheck(buf, end, sym, spec); #else + if (fill_minimal_module_info(sym, KSYM_SYMBOL_LEN, value)) + return string_nocheck(buf, end, sym, spec); + return special_hex_number(buf, end, value, sizeof(void *)); #endif } -- 2.17.1
| |