lkml.org 
[lkml]   [2022]   [Jan]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH 1/1] kallsyms: print module name in %ps/S case when KALLSYMS is disabled
Date
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
\
 
 \ /
  Last update: 2022-02-01 05:02    [W:0.086 / U:0.948 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site