summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlaf Hering <olh@suse.de>2004-11-07 04:11:09 -0800
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-11-07 04:11:09 -0800
commit7602d24973c896f3d5070d96e8c19377d6e25c36 (patch)
tree7c80a8a13b97e1f11b249829eac32bec43928a9f
parent38b7c3b242e7664a1b5ffde439b4375c6770ba76 (diff)
[PATCH] fix initcall_debug on ppc64/ia64
ia64 and ppc64 have function descriptors. Booting with initcall_debug will print the descriptor address, not the address and name of the actual function. Another indirection is required. Tested on ppc, ppc64 and ia64. Signed-off-by: Olaf Hering <olh@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--include/linux/kallsyms.h10
-rw-r--r--init/main.c2
2 files changed, 11 insertions, 1 deletions
diff --git a/include/linux/kallsyms.h b/include/linux/kallsyms.h
index 1a5dce8f9346..9bbd04092365 100644
--- a/include/linux/kallsyms.h
+++ b/include/linux/kallsyms.h
@@ -47,6 +47,16 @@ __attribute__((format(printf,1,2)));
static inline void __check_printsym_format(const char *fmt, ...)
{
}
+/* ia64 and ppc64 use function descriptors, which contain the real address */
+#if defined(CONFIG_IA64) || defined(CONFIG_PPC64)
+#define print_fn_descriptor_symbol(fmt, addr) \
+do { \
+ unsigned long *__faddr = (unsigned long*) addr; \
+ print_symbol(fmt, __faddr[0]); \
+} while (0)
+#else
+#define print_fn_descriptor_symbol(fmt, addr) print_symbol(fmt, addr)
+#endif
#define print_symbol(fmt, addr) \
do { \
diff --git a/init/main.c b/init/main.c
index 4b20c9303bd4..ecc39fafe51c 100644
--- a/init/main.c
+++ b/init/main.c
@@ -604,7 +604,7 @@ static void __init do_initcalls(void)
if (initcall_debug) {
printk(KERN_DEBUG "Calling initcall 0x%p", *call);
- print_symbol(": %s()", (unsigned long) *call);
+ print_fn_descriptor_symbol(": %s()", (unsigned long) *call);
printk("\n");
}