From 2847a1a2b2ae474b1840f9038768646b01e249f2 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Mon, 3 Jul 2006 00:24:24 -0700 Subject: [PATCH] --- yaml --- r: 31764 b: refs/heads/master c: 4d435f9d8ff01ae726a2a84edb9c2457787a337e h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/linux/module.h | 6 ++++++ trunk/kernel/module.c | 23 +++++++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 2633d31f57b3..f3967a70541a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 93e028148fce0be9787de7fb097fa4c8582b78c1 +refs/heads/master: 4d435f9d8ff01ae726a2a84edb9c2457787a337e diff --git a/trunk/include/linux/module.h b/trunk/include/linux/module.h index 9e9dc7c24d95..d06c74fb8c26 100644 --- a/trunk/include/linux/module.h +++ b/trunk/include/linux/module.h @@ -358,6 +358,7 @@ static inline int module_is_live(struct module *mod) /* 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); +int is_module_address(unsigned long addr); /* Returns module and fills in value, defined and namebuf, or NULL if symnum out of range. */ @@ -496,6 +497,11 @@ static inline struct module *__module_text_address(unsigned long addr) return NULL; } +static inline int is_module_address(unsigned long addr) +{ + return 0; +} + /* Get/put a kernel symbol (calls should be symmetric) */ #define symbol_get(x) ({ extern typeof(x) x __attribute__((weak)); &(x); }) #define symbol_put(x) do { } while(0) diff --git a/trunk/kernel/module.c b/trunk/kernel/module.c index 281172f01e9a..0351625767b1 100644 --- a/trunk/kernel/module.c +++ b/trunk/kernel/module.c @@ -2159,6 +2159,29 @@ const struct exception_table_entry *search_module_extables(unsigned long addr) return e; } +/* + * Is this a valid module address? + */ +int is_module_address(unsigned long addr) +{ + unsigned long flags; + struct module *mod; + + spin_lock_irqsave(&modlist_lock, flags); + + list_for_each_entry(mod, &modules, list) { + if (within(addr, mod->module_core, mod->core_size)) { + spin_unlock_irqrestore(&modlist_lock, flags); + return 1; + } + } + + spin_unlock_irqrestore(&modlist_lock, flags); + + return 0; +} + + /* Is this a valid kernel address? We don't grab the lock: we are oopsing. */ struct module *__module_text_address(unsigned long addr) {