X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=kernel%2Fextable.c;h=e136ed8d82ba56ab81283a48fe3d6cfb41c23c79;hb=264b29900657f53fb4ddc8bf08f447c4c227b2cf;hp=feb0317cf09ab5960d0288a31ec00d03ae5a6335;hpb=5250d329e38cdf7580faeb9c53c17d3588d7d19c;p=firefly-linux-kernel-4.4.55.git diff --git a/kernel/extable.c b/kernel/extable.c index feb0317cf09a..e136ed8d82ba 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; +}