X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=kernel%2Fextable.c;h=7f8f263f85249a15ca8492fa5056c868262aa0f1;hb=27a9da6538ee18046d7bff8e36a9f783542c54c3;hp=c46da6a47036708dc373f074503efe6483bcaf2c;hpb=4a44bac1f98223ed77e47bf3b42fcfd10cddd85f;p=safe%2Fjmp%2Flinux-2.6 diff --git a/kernel/extable.c b/kernel/extable.c index c46da6a..7f8f263 100644 --- a/kernel/extable.c +++ b/kernel/extable.c @@ -15,11 +15,22 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include +#include #include +#include #include -#include -#include + #include +#include + +/* + * mutex protecting text section modification (dynamic code patching). + * some users need to sleep (allocating memory...) while they hold this lock. + * + * NOT exported to modules - patching kernel text is a really delicate matter. + */ +DEFINE_MUTEX(text_mutex); extern struct exception_table_entry __start___ex_table[]; extern struct exception_table_entry __stop___ex_table[]; @@ -49,7 +60,7 @@ static inline int init_kernel_text(unsigned long addr) return 0; } -__notrace_funcgraph int core_kernel_text(unsigned long addr) +int core_kernel_text(unsigned long addr) { if (addr >= (unsigned long)_stext && addr <= (unsigned long)_etext) @@ -61,11 +72,11 @@ __notrace_funcgraph int core_kernel_text(unsigned long addr) return 0; } -__notrace_funcgraph int __kernel_text_address(unsigned long addr) +int __kernel_text_address(unsigned long addr) { if (core_kernel_text(addr)) return 1; - if (__module_text_address(addr)) + if (is_module_text_address(addr)) return 1; /* * There might be init symbols in saved stacktraces. @@ -84,7 +95,7 @@ int kernel_text_address(unsigned long addr) { if (core_kernel_text(addr)) return 1; - return module_text_address(addr) != NULL; + return is_module_text_address(addr); } /* @@ -100,5 +111,5 @@ int func_ptr_is_kernel_text(void *ptr) addr = (unsigned long) dereference_function_descriptor(ptr); if (core_kernel_text(addr)) return 1; - return module_text_address(addr) != NULL; + return is_module_text_address(addr); }