#include <linux/elf.h>
#include <linux/ftrace.h>
#include <linux/memory.h>
#include <linux/extable.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/init.h>
#include <linux/kprobes.h>
#include <linux/filter.h>
#include <asm/sections.h>
#include <linux/uaccess.h>
DEFINE_MUTEX(…) …;
extern struct exception_table_entry __start___ex_table[];
extern struct exception_table_entry __stop___ex_table[];
u32 __initdata __visible main_extable_sort_needed = …;
void __init sort_main_extable(void)
{ … }
const
struct exception_table_entry *search_kernel_exception_table(unsigned long addr)
{ … }
const struct exception_table_entry *search_exception_tables(unsigned long addr)
{ … }
int notrace core_kernel_text(unsigned long addr)
{ … }
int __kernel_text_address(unsigned long addr)
{ … }
int kernel_text_address(unsigned long addr)
{ … }
#ifdef CONFIG_HAVE_FUNCTION_DESCRIPTORS
void *dereference_function_descriptor(void *ptr)
{
func_desc_t *desc = ptr;
void *p;
if (!get_kernel_nofault(p, (void *)&desc->addr))
ptr = p;
return ptr;
}
EXPORT_SYMBOL_GPL(dereference_function_descriptor);
void *dereference_kernel_function_descriptor(void *ptr)
{
if (ptr < (void *)__start_opd || ptr >= (void *)__end_opd)
return ptr;
return dereference_function_descriptor(ptr);
}
#endif
int func_ptr_is_kernel_text(void *ptr)
{ … }