1 /* Rewritten and vastly simplified by Rusty Russell for in-kernel 2 * module loader: 3 * Copyright 2002 Rusty Russell <[email protected]> IBM Corporation 4 */ 5 #ifndef _LINUX_KALLSYMS_H 6 #define _LINUX_KALLSYMS_H 7 8 #include <linux/errno.h> 9 #include <linux/stddef.h> 10 11 #define KSYM_NAME_LEN 128 12 #define KSYM_SYMBOL_LEN (sizeof("%s+%#lx/%#lx [%s]") + (KSYM_NAME_LEN - 1) + \ 13 2*(BITS_PER_LONG*3/10) + (MODULE_NAME_LEN - 1) + 1) 14 15 #ifdef CONFIG_KALLSYMS 16 /* Lookup the address for a symbol. Returns 0 if not found. */ 17 unsigned long kallsyms_lookup_name(const char *name); 18 19 extern int kallsyms_lookup_size_offset(unsigned long addr, 20 unsigned long *symbolsize, 21 unsigned long *offset); 22 23 /* Lookup an address. modname is set to NULL if it's in the kernel. */ 24 const char *kallsyms_lookup(unsigned long addr, 25 unsigned long *symbolsize, 26 unsigned long *offset, 27 char **modname, char *namebuf); 28 29 /* Look up a kernel symbol and return it in a text buffer. */ 30 extern int sprint_symbol(char *buffer, unsigned long address); 31 32 /* Look up a kernel symbol and print it to the kernel messages. */ 33 extern void __print_symbol(const char *fmt, unsigned long address); 34 35 int lookup_symbol_name(unsigned long addr, char *symname); 36 int lookup_symbol_attrs(unsigned long addr, unsigned long *size, unsigned long *offset, char *modname, char *name); 37 38 #else /* !CONFIG_KALLSYMS */ 39 40 static inline unsigned long kallsyms_lookup_name(const char *name) 41 { 42 return 0; 43 } 44 45 static inline int kallsyms_lookup_size_offset(unsigned long addr, 46 unsigned long *symbolsize, 47 unsigned long *offset) 48 { 49 return 0; 50 } 51 52 static inline const char *kallsyms_lookup(unsigned long addr, 53 unsigned long *symbolsize, 54 unsigned long *offset, 55 char **modname, char *namebuf) 56 { 57 return NULL; 58 } 59 60 static inline int sprint_symbol(char *buffer, unsigned long addr) 61 { 62 *buffer = '\0'; 63 return 0; 64 } 65 66 static inline int lookup_symbol_name(unsigned long addr, char *symname) 67 { 68 return -ERANGE; 69 } 70 71 static inline int lookup_symbol_attrs(unsigned long addr, unsigned long *size, unsigned long *offset, char *modname, char *name) 72 { 73 return -ERANGE; 74 } 75 76 /* Stupid that this does nothing, but I didn't create this mess. */ 77 #define __print_symbol(fmt, addr) 78 #endif /*CONFIG_KALLSYMS*/ 79 80 /* This macro allows us to keep printk typechecking */ 81 static void __check_printsym_format(const char *fmt, ...) 82 __attribute__((format(printf,1,2))); 83 static inline void __check_printsym_format(const char *fmt, ...) 84 { 85 } 86 /* ia64 and ppc64 use function descriptors, which contain the real address */ 87 #if defined(CONFIG_IA64) || defined(CONFIG_PPC64) 88 #define print_fn_descriptor_symbol(fmt, addr) \ 89 do { \ 90 unsigned long *__faddr = (unsigned long*) addr; \ 91 print_symbol(fmt, __faddr[0]); \ 92 } while (0) 93 #else 94 #define print_fn_descriptor_symbol(fmt, addr) print_symbol(fmt, addr) 95 #endif 96 97 static inline void print_symbol(const char *fmt, unsigned long addr) 98 { 99 __check_printsym_format(fmt, ""); 100 __print_symbol(fmt, (unsigned long) 101 __builtin_extract_return_addr((void *)addr)); 102 } 103 104 #ifndef CONFIG_64BIT 105 #define print_ip_sym(ip) \ 106 do { \ 107 printk("[<%08lx>]", ip); \ 108 print_symbol(" %s\n", ip); \ 109 } while(0) 110 #else 111 #define print_ip_sym(ip) \ 112 do { \ 113 printk("[<%016lx>]", ip); \ 114 print_symbol(" %s\n", ip); \ 115 } while(0) 116 #endif 117 118 #endif /*_LINUX_KALLSYMS_H*/ 119