X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=kernel%2Fkallsyms.c;h=39277dd6bf90911916db77f2370e2db3a6e070f4;hb=43bc926fffd92024b46cafaf7350d669ba9ca884;hp=bd765adaacd6420e090a12d4ef3c83a2ebf5ea36;hpb=6a77f38946aaee1cd85eeec6cf4229b204c15071;p=linux-2.6.git diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c index bd765adaa..39277dd6b 100644 --- a/kernel/kallsyms.c +++ b/kernel/kallsyms.c @@ -18,6 +18,7 @@ #include #include #include +#include /* for cond_resched */ #include #include @@ -46,6 +47,14 @@ static inline int is_kernel_inittext(unsigned long addr) return 0; } +static inline int is_kernel_extratext(unsigned long addr) +{ + if (addr >= (unsigned long)_sextratext + && addr <= (unsigned long)_eextratext) + return 1; + return 0; +} + static inline int is_kernel_text(unsigned long addr) { if (addr >= (unsigned long)_stext && addr <= (unsigned long)_etext) @@ -145,14 +154,22 @@ unsigned long kallsyms_lookup_name(const char *name) } return module_kallsyms_lookup_name(name); } +EXPORT_SYMBOL_GPL(kallsyms_lookup_name); -/* Lookup an address. modname is set to NULL if it's in the kernel. */ +/* + * Lookup an address + * - modname is set to NULL if it's in the kernel + * - we guarantee that the returned name is valid until we reschedule even if + * it resides in a module + * - we also guarantee that modname will be valid until rescheduled + */ const char *kallsyms_lookup(unsigned long addr, unsigned long *symbolsize, unsigned long *offset, char **modname, char *namebuf) { unsigned long i, low, high, mid; + const char *msym; /* This kernel should never had been booted. */ BUG_ON(!kallsyms_addresses); @@ -161,8 +178,9 @@ const char *kallsyms_lookup(unsigned long addr, namebuf[0] = 0; if ((all_var && is_kernel(addr)) || - (!all_var && (is_kernel_text(addr) || is_kernel_inittext(addr)))) { - unsigned long symbol_end=0; + (!all_var && (is_kernel_text(addr) || is_kernel_inittext(addr) || + is_kernel_extratext(addr)))) { + unsigned long symbol_end = 0; /* do a binary search on the sorted kallsyms_addresses array */ low = 0; @@ -204,7 +222,12 @@ const char *kallsyms_lookup(unsigned long addr, return namebuf; } - return module_address_lookup(addr, symbolsize, offset, modname); + /* see if it's in a module */ + msym = module_address_lookup(addr, symbolsize, offset, modname); + if (msym) + return strncpy(namebuf, msym, KSYM_NAME_LEN); + + return NULL; } /* Replace "%s" in format with address, or returns -errno. */ @@ -342,7 +365,7 @@ static int s_show(struct seq_file *m, void *p) return 0; } -struct seq_operations kallsyms_op = { +static struct seq_operations kallsyms_op = { .start = s_start, .next = s_next, .stop = s_stop, @@ -384,7 +407,7 @@ static struct file_operations kallsyms_operations = { .release = kallsyms_release, }; -int __init kallsyms_init(void) +static int __init kallsyms_init(void) { struct proc_dir_entry *entry;