diff options
Diffstat (limited to 'kernel/extable.c')
| -rw-r--r-- | kernel/extable.c | 30 | 
1 files changed, 27 insertions, 3 deletions
diff --git a/kernel/extable.c b/kernel/extable.c index 7f8f263f852..d8a6446adbc 100644 --- a/kernel/extable.c +++ b/kernel/extable.c @@ -35,10 +35,16 @@ DEFINE_MUTEX(text_mutex);  extern struct exception_table_entry __start___ex_table[];  extern struct exception_table_entry __stop___ex_table[]; +/* Cleared by build time tools if the table is already sorted. */ +u32 __initdata __visible main_extable_sort_needed = 1; +  /* Sort the kernel's built-in exception table */  void __init sort_main_extable(void)  { -	sort_extable(__start___ex_table, __stop___ex_table); +	if (main_extable_sort_needed && __stop___ex_table > __start___ex_table) { +		pr_notice("Sorting __ex_table...\n"); +		sort_extable(__start___ex_table, __stop___ex_table); +	}  }  /* Given an address, look for it in the exception tables. */ @@ -55,7 +61,7 @@ const struct exception_table_entry *search_exception_tables(unsigned long addr)  static inline int init_kernel_text(unsigned long addr)  {  	if (addr >= (unsigned long)_sinittext && -	    addr <= (unsigned long)_einittext) +	    addr < (unsigned long)_einittext)  		return 1;  	return 0;  } @@ -63,7 +69,7 @@ static inline int init_kernel_text(unsigned long addr)  int core_kernel_text(unsigned long addr)  {  	if (addr >= (unsigned long)_stext && -	    addr <= (unsigned long)_etext) +	    addr < (unsigned long)_etext)  		return 1;  	if (system_state == SYSTEM_BOOTING && @@ -72,6 +78,24 @@ int core_kernel_text(unsigned long addr)  	return 0;  } +/** + * core_kernel_data - tell if addr points to kernel data + * @addr: address to test + * + * Returns true if @addr passed in is from the core kernel data + * section. + * + * Note: On some archs it may return true for core RODATA, and false + *  for others. But will always be true for core RW data. + */ +int core_kernel_data(unsigned long addr) +{ +	if (addr >= (unsigned long)_sdata && +	    addr < (unsigned long)_edata) +		return 1; +	return 0; +} +  int __kernel_text_address(unsigned long addr)  {  	if (core_kernel_text(addr))  | 
