diff options
Diffstat (limited to 'arch/ia64/mm/extable.c')
| -rw-r--r-- | arch/ia64/mm/extable.c | 28 | 
1 files changed, 27 insertions, 1 deletions
diff --git a/arch/ia64/mm/extable.c b/arch/ia64/mm/extable.c index 71c50dd8f87..c99a41e29fe 100644 --- a/arch/ia64/mm/extable.c +++ b/arch/ia64/mm/extable.c @@ -8,7 +8,7 @@  #include <linux/sort.h>  #include <asm/uaccess.h> -#include <asm/module.h> +#include <linux/module.h>  static int cmp_ex(const void *a, const void *b)  { @@ -53,6 +53,32 @@ void sort_extable (struct exception_table_entry *start,  	     cmp_ex, swap_ex);  } +static inline unsigned long ex_to_addr(const struct exception_table_entry *x) +{ +	return (unsigned long)&x->addr + x->addr; +} + +#ifdef CONFIG_MODULES +/* + * Any entry referring to the module init will be at the beginning or + * the end. + */ +void trim_init_extable(struct module *m) +{ +	/*trim the beginning*/ +	while (m->num_exentries && +	       within_module_init(ex_to_addr(&m->extable[0]), m)) { +		m->extable++; +		m->num_exentries--; +	} +	/*trim the end*/ +	while (m->num_exentries && +	       within_module_init(ex_to_addr(&m->extable[m->num_exentries-1]), +				  m)) +		m->num_exentries--; +} +#endif /* CONFIG_MODULES */ +  const struct exception_table_entry *  search_extable (const struct exception_table_entry *first,  		const struct exception_table_entry *last,  |