Messages in this thread Patch in this message | | | Date | Mon, 21 Apr 2008 14:34:39 +0200 | From | Peter Oberparleiter <> | Subject | [RFC PATCH 5/8] module: add function to map address to containing module |
| |
From: Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
module_address() maps an address to the module containing it in either text or data section. Required by the gcov profiling infrastructure to associate profiling data structures with modules.
Signed-off-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com> --- include/linux/module.h | 1 + kernel/module.c | 23 ++++++++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-)
Index: linux-2.6.25/include/linux/module.h =================================================================== --- linux-2.6.25.orig/include/linux/module.h +++ linux-2.6.25/include/linux/module.h @@ -380,6 +380,7 @@ static inline int module_is_live(struct /* Is this address in a module? (second is with no locks, for oops) */ struct module *module_text_address(unsigned long addr); struct module *__module_text_address(unsigned long addr); +struct module *module_address(unsigned long addr); int is_module_address(unsigned long addr); /* Returns 0 and fills in value, defined and namebuf, or -ERANGE if Index: linux-2.6.25/kernel/module.c =================================================================== --- linux-2.6.25.orig/kernel/module.c +++ linux-2.6.25/kernel/module.c @@ -2527,10 +2527,16 @@ const struct exception_table_entry *sear return e; } -/* - * Is this a valid module address? +/** + * module_address - map an address to the containing module + * @addr: address for which the containing module should be searched + * + * Return the module which contains the address in either text or data + * section. Return NULL if no matching module was found. Callers should + * be aware that no reference counting is being performed for the returned + * module reference. */ -int is_module_address(unsigned long addr) +struct module *module_address(unsigned long addr) { struct module *mod; @@ -2539,15 +2545,22 @@ int is_module_address(unsigned long addr list_for_each_entry(mod, &modules, list) { if (within(addr, mod->module_core, mod->core_size)) { preempt_enable(); - return 1; + return mod; } } preempt_enable(); - return 0; + return NULL; } +/* + * Is this a valid module address? + */ +int is_module_address(unsigned long addr) +{ + return module_address(addr) ? 1 : 0; +} /* Is this a valid kernel address? */ struct module *__module_text_address(unsigned long addr)
| |