X-Git-Url: http://pilppa.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=kernel%2Fextable.c;h=e136ed8d82ba56ab81283a48fe3d6cfb41c23c79;hb=1b8ee916f5e5f0de1367a5a437ba504a96953836;hp=feb0317cf09ab5960d0288a31ec00d03ae5a6335;hpb=54a696bd07c14d3b1192d03ce7269bc59b45209a;p=linux-2.6-omap-h63xx.git diff --git a/kernel/extable.c b/kernel/extable.c index feb0317cf09..e136ed8d82b 100644 --- a/kernel/extable.c +++ b/kernel/extable.c @@ -67,3 +67,19 @@ int kernel_text_address(unsigned long addr) return 1; return module_text_address(addr) != NULL; } + +/* + * On some architectures (PPC64, IA64) function pointers + * are actually only tokens to some data that then holds the + * real function address. As a result, to find if a function + * pointer is part of the kernel text, we need to do some + * special dereferencing first. + */ +int func_ptr_is_kernel_text(void *ptr) +{ + unsigned long addr; + addr = (unsigned long) dereference_function_descriptor(ptr); + if (core_kernel_text(addr)) + return 1; + return module_text_address(addr) != NULL; +}