![Heiko Carstens](/assets/img/avatar_default.png)
Have a special version of print_symbol() for s390 which clears the most significant bit of addr before calling __print_symbol(). This seems to be better than checking/changing each place in the kernel that saves an instruction pointer. Without this the output would look like: hardirqs last enabled at (30907): [<80018c6a>] 0x80018c6a hardirqs last disabled at (30908): [<8001e48c>] 0x8001e48c softirqs last enabled at (30904): [<8001dc96>] 0x8001dc96 softirqs last disabled at (30897): [<8001dc50>] 0x8001dc50 instead of this: hardirqs last enabled at (19421): [<80018c72>] cpu_idle+0x176/0x1c4 hardirqs last disabled at (19422): [<8001e494>] io_no_vtime+0xa/0x1a softirqs last enabled at (19418): [<8001dc9e>] do_softirq+0xa6/0xe8 softirqs last disabled at (19411): [<8001dc58>] do_softirq+0x60/0xe8 Acked-by: Ingo Molnar <mingo@elte.hu> Cc: Arjan van de Ven <arjan@infradead.org> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
68 lines
1.9 KiB
C
68 lines
1.9 KiB
C
/* Rewritten and vastly simplified by Rusty Russell for in-kernel
|
|
* module loader:
|
|
* Copyright 2002 Rusty Russell <rusty@rustcorp.com.au> IBM Corporation
|
|
*/
|
|
#ifndef _LINUX_KALLSYMS_H
|
|
#define _LINUX_KALLSYMS_H
|
|
|
|
|
|
#define KSYM_NAME_LEN 127
|
|
|
|
#ifdef CONFIG_KALLSYMS
|
|
/* Lookup the address for a symbol. Returns 0 if not found. */
|
|
unsigned long kallsyms_lookup_name(const char *name);
|
|
|
|
/* Lookup an address. modname is set to NULL if it's in the kernel. */
|
|
const char *kallsyms_lookup(unsigned long addr,
|
|
unsigned long *symbolsize,
|
|
unsigned long *offset,
|
|
char **modname, char *namebuf);
|
|
|
|
/* Replace "%s" in format with address, if found */
|
|
extern void __print_symbol(const char *fmt, unsigned long address);
|
|
|
|
#else /* !CONFIG_KALLSYMS */
|
|
|
|
static inline unsigned long kallsyms_lookup_name(const char *name)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline const char *kallsyms_lookup(unsigned long addr,
|
|
unsigned long *symbolsize,
|
|
unsigned long *offset,
|
|
char **modname, char *namebuf)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
/* Stupid that this does nothing, but I didn't create this mess. */
|
|
#define __print_symbol(fmt, addr)
|
|
#endif /*CONFIG_KALLSYMS*/
|
|
|
|
/* This macro allows us to keep printk typechecking */
|
|
static void __check_printsym_format(const char *fmt, ...)
|
|
__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
|
|
|
|
static inline void print_symbol(const char *fmt, unsigned long addr)
|
|
{
|
|
__check_printsym_format(fmt, "");
|
|
__print_symbol(fmt, (unsigned long)
|
|
__builtin_extract_return_addr((void *)addr));
|
|
}
|
|
|
|
#endif /*_LINUX_KALLSYMS_H*/
|