Extend print_symbol capability
[linux-2.6.git] / kernel / kallsyms.c
index 6f294ff..5a0de84 100644 (file)
@@ -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);