aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/kallsyms.h13
-rw-r--r--kernel/kallsyms.c23
2 files changed, 27 insertions, 9 deletions
diff --git a/include/linux/kallsyms.h b/include/linux/kallsyms.h
index 1cebcbc28b47..3e3b92dabe3b 100644
--- a/include/linux/kallsyms.h
+++ b/include/linux/kallsyms.h
@@ -7,6 +7,8 @@
7 7
8 8
9#define KSYM_NAME_LEN 127 9#define KSYM_NAME_LEN 127
10#define KSYM_SYMBOL_LEN (sizeof("%s+%#lx/%#lx [%s]") + KSYM_NAME_LEN + \
11 2*(BITS_PER_LONG*3/10) + MODULE_NAME_LEN + 1)
10 12
11#ifdef CONFIG_KALLSYMS 13#ifdef CONFIG_KALLSYMS
12/* Lookup the address for a symbol. Returns 0 if not found. */ 14/* Lookup the address for a symbol. Returns 0 if not found. */
@@ -22,7 +24,10 @@ const char *kallsyms_lookup(unsigned long addr,
22 unsigned long *offset, 24 unsigned long *offset,
23 char **modname, char *namebuf); 25 char **modname, char *namebuf);
24 26
25/* Replace "%s" in format with address, if found */ 27/* Look up a kernel symbol and return it in a text buffer. */
28extern int sprint_symbol(char *buffer, unsigned long address);
29
30/* Look up a kernel symbol and print it to the kernel messages. */
26extern void __print_symbol(const char *fmt, unsigned long address); 31extern void __print_symbol(const char *fmt, unsigned long address);
27 32
28#else /* !CONFIG_KALLSYMS */ 33#else /* !CONFIG_KALLSYMS */
@@ -47,6 +52,12 @@ static inline const char *kallsyms_lookup(unsigned long addr,
47 return NULL; 52 return NULL;
48} 53}
49 54
55static inline int sprint_symbol(char *buffer, unsigned long addr)
56{
57 *buffer = '\0';
58 return 0;
59}
60
50/* Stupid that this does nothing, but I didn't create this mess. */ 61/* Stupid that this does nothing, but I didn't create this mess. */
51#define __print_symbol(fmt, addr) 62#define __print_symbol(fmt, addr)
52#endif /*CONFIG_KALLSYMS*/ 63#endif /*CONFIG_KALLSYMS*/
diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c
index 6f294ff4f9ee..5a0de8409739 100644
--- a/kernel/kallsyms.c
+++ b/kernel/kallsyms.c
@@ -267,27 +267,33 @@ const char *kallsyms_lookup(unsigned long addr,
267 return NULL; 267 return NULL;
268} 268}
269 269
270/* Replace "%s" in format with address, or returns -errno. */ 270/* Look up a kernel symbol and return it in a text buffer. */
271void __print_symbol(const char *fmt, unsigned long address) 271int sprint_symbol(char *buffer, unsigned long address)
272{ 272{
273 char *modname; 273 char *modname;
274 const char *name; 274 const char *name;
275 unsigned long offset, size; 275 unsigned long offset, size;
276 char namebuf[KSYM_NAME_LEN+1]; 276 char namebuf[KSYM_NAME_LEN+1];
277 char buffer[sizeof("%s+%#lx/%#lx [%s]") + KSYM_NAME_LEN +
278 2*(BITS_PER_LONG*3/10) + MODULE_NAME_LEN + 1];
279 277
280 name = kallsyms_lookup(address, &size, &offset, &modname, namebuf); 278 name = kallsyms_lookup(address, &size, &offset, &modname, namebuf);
281
282 if (!name) 279 if (!name)
283 sprintf(buffer, "0x%lx", address); 280 return sprintf(buffer, "0x%lx", address);
284 else { 281 else {
285 if (modname) 282 if (modname)
286 sprintf(buffer, "%s+%#lx/%#lx [%s]", name, offset, 283 return sprintf(buffer, "%s+%#lx/%#lx [%s]", name, offset,
287 size, modname); 284 size, modname);
288 else 285 else
289 sprintf(buffer, "%s+%#lx/%#lx", name, offset, size); 286 return sprintf(buffer, "%s+%#lx/%#lx", name, offset, size);
290 } 287 }
288}
289
290/* Look up a kernel symbol and print it to the kernel messages. */
291void __print_symbol(const char *fmt, unsigned long address)
292{
293 char buffer[KSYM_SYMBOL_LEN];
294
295 sprint_symbol(buffer, address);
296
291 printk(fmt, buffer); 297 printk(fmt, buffer);
292} 298}
293 299
@@ -452,3 +458,4 @@ static int __init kallsyms_init(void)
452__initcall(kallsyms_init); 458__initcall(kallsyms_init);
453 459
454EXPORT_SYMBOL(__print_symbol); 460EXPORT_SYMBOL(__print_symbol);
461EXPORT_SYMBOL_GPL(sprint_symbol);