diff options
author | Robert Peterson <rpeterso@redhat.com> | 2007-04-30 18:09:48 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-04-30 19:40:39 -0400 |
commit | 42e380832a6911c8a3173ee0172fbc0e4864d80b (patch) | |
tree | f336312f9476b62bc6f00a85d5506b1cd1c18d4f /kernel | |
parent | de34ed91c4ffa4727964a832c46e624dd1495cf5 (diff) |
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: Robert 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: Paulo Marques <pmarques@grupopie.com>
Signed-off-by: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/kallsyms.c | 23 |
1 files changed, 15 insertions, 8 deletions
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. */ |
271 | void __print_symbol(const char *fmt, unsigned long address) | 271 | int 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. */ | ||
291 | void __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 | ||
454 | EXPORT_SYMBOL(__print_symbol); | 460 | EXPORT_SYMBOL(__print_symbol); |
461 | EXPORT_SYMBOL_GPL(sprint_symbol); | ||