| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* Rewritten and vastly simplified by Rusty Russell for in-kernel | 
|  | 2 | * module loader: | 
|  | 3 | *   Copyright 2002 Rusty Russell <rusty@rustcorp.com.au> IBM Corporation | 
|  | 4 | */ | 
|  | 5 | #ifndef _LINUX_KALLSYMS_H | 
|  | 6 | #define _LINUX_KALLSYMS_H | 
|  | 7 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 8 |  | 
|  | 9 | #define KSYM_NAME_LEN 127 | 
|  | 10 |  | 
|  | 11 | #ifdef CONFIG_KALLSYMS | 
|  | 12 | /* Lookup the address for a symbol. Returns 0 if not found. */ | 
|  | 13 | unsigned long kallsyms_lookup_name(const char *name); | 
|  | 14 |  | 
|  | 15 | /* Lookup an address.  modname is set to NULL if it's in the kernel. */ | 
|  | 16 | const char *kallsyms_lookup(unsigned long addr, | 
|  | 17 | unsigned long *symbolsize, | 
|  | 18 | unsigned long *offset, | 
|  | 19 | char **modname, char *namebuf); | 
|  | 20 |  | 
|  | 21 | /* Replace "%s" in format with address, if found */ | 
|  | 22 | extern void __print_symbol(const char *fmt, unsigned long address); | 
|  | 23 |  | 
|  | 24 | #else /* !CONFIG_KALLSYMS */ | 
|  | 25 |  | 
|  | 26 | static inline unsigned long kallsyms_lookup_name(const char *name) | 
|  | 27 | { | 
|  | 28 | return 0; | 
|  | 29 | } | 
|  | 30 |  | 
|  | 31 | static inline const char *kallsyms_lookup(unsigned long addr, | 
|  | 32 | unsigned long *symbolsize, | 
|  | 33 | unsigned long *offset, | 
|  | 34 | char **modname, char *namebuf) | 
|  | 35 | { | 
|  | 36 | return NULL; | 
|  | 37 | } | 
|  | 38 |  | 
|  | 39 | /* Stupid that this does nothing, but I didn't create this mess. */ | 
|  | 40 | #define __print_symbol(fmt, addr) | 
|  | 41 | #endif /*CONFIG_KALLSYMS*/ | 
|  | 42 |  | 
|  | 43 | /* This macro allows us to keep printk typechecking */ | 
|  | 44 | static void __check_printsym_format(const char *fmt, ...) | 
|  | 45 | __attribute__((format(printf,1,2))); | 
|  | 46 | static inline void __check_printsym_format(const char *fmt, ...) | 
|  | 47 | { | 
|  | 48 | } | 
|  | 49 | /* ia64 and ppc64 use function descriptors, which contain the real address */ | 
|  | 50 | #if defined(CONFIG_IA64) || defined(CONFIG_PPC64) | 
|  | 51 | #define print_fn_descriptor_symbol(fmt, addr)		\ | 
|  | 52 | do {						\ | 
|  | 53 | unsigned long *__faddr = (unsigned long*) addr;		\ | 
|  | 54 | print_symbol(fmt, __faddr[0]);		\ | 
|  | 55 | } while (0) | 
|  | 56 | #else | 
|  | 57 | #define print_fn_descriptor_symbol(fmt, addr) print_symbol(fmt, addr) | 
|  | 58 | #endif | 
|  | 59 |  | 
|  | 60 | #define print_symbol(fmt, addr)			\ | 
|  | 61 | do {						\ | 
|  | 62 | __check_printsym_format(fmt, "");	\ | 
|  | 63 | __print_symbol(fmt, addr);		\ | 
|  | 64 | } while(0) | 
|  | 65 |  | 
|  | 66 | #endif /*_LINUX_KALLSYMS_H*/ |