Commit 42e38083 authored by Robert Peterson's avatar Robert Peterson Committed by Linus Torvalds

Extend print_symbol capability

Today's print_symbol function dumps a kernel symbol with printk.  This
patch extends the functionality of kallsyms.c so that the symbol lookup
function may be used without the printk.  This is useful for modules that
want to dump symbols elsewhere, for example, to debugfs.  I intend to use
the new function call in the GFS2 file system (which will be a separate
patch).

[akpm@linux-foundation.org: build fix]
[clameter@sgi.com: sprint_symbol should return length of string like sprintf]
Signed-off-by: default avatarRobert Peterson <rpeterso@redhat.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Roman Zippel <zippel@linux-m68k.org>
Cc: "Randy.Dunlap" <rdunlap@xenotime.net>
Cc: Sam Ravnborg <sam@ravnborg.org>
Acked-by: default avatarPaulo Marques <pmarques@grupopie.com>
Signed-off-by: default avatarChristoph Lameter <clameter@sgi.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent de34ed91
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
#define KSYM_NAME_LEN 127 #define KSYM_NAME_LEN 127
#define KSYM_SYMBOL_LEN (sizeof("%s+%#lx/%#lx [%s]") + KSYM_NAME_LEN + \
2*(BITS_PER_LONG*3/10) + MODULE_NAME_LEN + 1)
#ifdef CONFIG_KALLSYMS #ifdef CONFIG_KALLSYMS
/* Lookup the address for a symbol. Returns 0 if not found. */ /* Lookup the address for a symbol. Returns 0 if not found. */
...@@ -22,7 +24,10 @@ const char *kallsyms_lookup(unsigned long addr, ...@@ -22,7 +24,10 @@ const char *kallsyms_lookup(unsigned long addr,
unsigned long *offset, unsigned long *offset,
char **modname, char *namebuf); char **modname, char *namebuf);
/* Replace "%s" in format with address, if found */ /* Look up a kernel symbol and return it in a text buffer. */
extern int sprint_symbol(char *buffer, unsigned long address);
/* Look up a kernel symbol and print it to the kernel messages. */
extern void __print_symbol(const char *fmt, unsigned long address); extern void __print_symbol(const char *fmt, unsigned long address);
#else /* !CONFIG_KALLSYMS */ #else /* !CONFIG_KALLSYMS */
...@@ -47,6 +52,12 @@ static inline const char *kallsyms_lookup(unsigned long addr, ...@@ -47,6 +52,12 @@ static inline const char *kallsyms_lookup(unsigned long addr,
return NULL; return NULL;
} }
static inline int sprint_symbol(char *buffer, unsigned long addr)
{
*buffer = '\0';
return 0;
}
/* Stupid that this does nothing, but I didn't create this mess. */ /* Stupid that this does nothing, but I didn't create this mess. */
#define __print_symbol(fmt, addr) #define __print_symbol(fmt, addr)
#endif /*CONFIG_KALLSYMS*/ #endif /*CONFIG_KALLSYMS*/
......
...@@ -267,27 +267,33 @@ const char *kallsyms_lookup(unsigned long addr, ...@@ -267,27 +267,33 @@ const char *kallsyms_lookup(unsigned long addr,
return NULL; return NULL;
} }
/* Replace "%s" in format with address, or returns -errno. */ /* Look up a kernel symbol and return it in a text buffer. */
void __print_symbol(const char *fmt, unsigned long address) int sprint_symbol(char *buffer, unsigned long address)
{ {
char *modname; char *modname;
const char *name; const char *name;
unsigned long offset, size; unsigned long offset, size;
char namebuf[KSYM_NAME_LEN+1]; char namebuf[KSYM_NAME_LEN+1];
char buffer[sizeof("%s+%#lx/%#lx [%s]") + KSYM_NAME_LEN +
2*(BITS_PER_LONG*3/10) + MODULE_NAME_LEN + 1];
name = kallsyms_lookup(address, &size, &offset, &modname, namebuf); name = kallsyms_lookup(address, &size, &offset, &modname, namebuf);
if (!name) if (!name)
sprintf(buffer, "0x%lx", address); return sprintf(buffer, "0x%lx", address);
else { else {
if (modname) if (modname)
sprintf(buffer, "%s+%#lx/%#lx [%s]", name, offset, return sprintf(buffer, "%s+%#lx/%#lx [%s]", name, offset,
size, modname); size, modname);
else else
sprintf(buffer, "%s+%#lx/%#lx", name, offset, size); return sprintf(buffer, "%s+%#lx/%#lx", name, offset, size);
} }
}
/* Look up a kernel symbol and print it to the kernel messages. */
void __print_symbol(const char *fmt, unsigned long address)
{
char buffer[KSYM_SYMBOL_LEN];
sprint_symbol(buffer, address);
printk(fmt, buffer); printk(fmt, buffer);
} }
...@@ -452,3 +458,4 @@ static int __init kallsyms_init(void) ...@@ -452,3 +458,4 @@ static int __init kallsyms_init(void)
__initcall(kallsyms_init); __initcall(kallsyms_init);
EXPORT_SYMBOL(__print_symbol); EXPORT_SYMBOL(__print_symbol);
EXPORT_SYMBOL_GPL(sprint_symbol);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment