diff options
Diffstat (limited to 'arch/i386/mm')
-rw-r--r-- | arch/i386/mm/extable.c | 19 | ||||
-rw-r--r-- | arch/i386/mm/fault.c | 2 |
2 files changed, 14 insertions, 7 deletions
diff --git a/arch/i386/mm/extable.c b/arch/i386/mm/extable.c index ba34c0395..2eb7ca6aa 100644 --- a/arch/i386/mm/extable.c +++ b/arch/i386/mm/extable.c @@ -4,6 +4,7 @@ #include <linux/config.h> #include <linux/module.h> +#include <linux/spinlock.h> #include <asm/uaccess.h> extern const struct exception_table_entry __start___ex_table[]; @@ -30,26 +31,32 @@ search_one_table(const struct exception_table_entry *first, return 0; } +extern spinlock_t modlist_lock; + unsigned long search_exception_table(unsigned long addr) { - unsigned long ret; - + unsigned long ret = 0; + unsigned long flags; + #ifndef CONFIG_MODULES /* There is only the kernel to search. */ ret = search_one_table(__start___ex_table, __stop___ex_table-1, addr); - if (ret) return ret; + return ret; #else /* The kernel is the last "module" -- no need to treat it special. */ struct module *mp; + + spin_lock_irqsave(&modlist_lock, flags); for (mp = module_list; mp != NULL; mp = mp->next) { if (mp->ex_table_start == NULL) continue; ret = search_one_table(mp->ex_table_start, mp->ex_table_end - 1, addr); - if (ret) return ret; + if (ret) + break; } + spin_unlock_irqrestore(&modlist_lock, flags); + return ret; #endif - - return 0; } diff --git a/arch/i386/mm/fault.c b/arch/i386/mm/fault.c index e2a9ee9fe..ccbc5dce1 100644 --- a/arch/i386/mm/fault.c +++ b/arch/i386/mm/fault.c @@ -81,7 +81,7 @@ extern spinlock_t console_lock, timerlist_lock; /* * Unlock any spinlocks which will prevent us from getting the - * message out (timerlist_lock is aquired through the + * message out (timerlist_lock is acquired through the * console unblank code) */ void bust_spinlocks(void) |