|
@@ -267,27 +267,33 @@ const char *kallsyms_lookup(unsigned long addr,
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-/* Replace "%s" in format with address, or returns -errno. */
|
|
|
-void __print_symbol(const char *fmt, unsigned long address)
|
|
|
+/* Look up a kernel symbol and return it in a text buffer. */
|
|
|
+int sprint_symbol(char *buffer, unsigned long address)
|
|
|
{
|
|
|
char *modname;
|
|
|
const char *name;
|
|
|
unsigned long offset, size;
|
|
|
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);
|
|
|
-
|
|
|
if (!name)
|
|
|
- sprintf(buffer, "0x%lx", address);
|
|
|
+ return sprintf(buffer, "0x%lx", address);
|
|
|
else {
|
|
|
if (modname)
|
|
|
- sprintf(buffer, "%s+%#lx/%#lx [%s]", name, offset,
|
|
|
+ return sprintf(buffer, "%s+%#lx/%#lx [%s]", name, offset,
|
|
|
size, modname);
|
|
|
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);
|
|
|
}
|
|
|
|
|
@@ -452,3 +458,4 @@ static int __init kallsyms_init(void)
|
|
|
__initcall(kallsyms_init);
|
|
|
|
|
|
EXPORT_SYMBOL(__print_symbol);
|
|
|
+EXPORT_SYMBOL_GPL(sprint_symbol);
|