| #include <asm/interrupt.h> |
| #include <asm/kprobes.h> |
| |
| struct soft_mask_table_entry { |
| unsigned long start; |
| unsigned long end; |
| }; |
| |
| struct restart_table_entry { |
| unsigned long start; |
| unsigned long end; |
| unsigned long fixup; |
| }; |
| |
| extern struct soft_mask_table_entry __start___soft_mask_table[]; |
| extern struct soft_mask_table_entry __stop___soft_mask_table[]; |
| |
| extern struct restart_table_entry __start___restart_table[]; |
| extern struct restart_table_entry __stop___restart_table[]; |
| |
| /* Given an address, look for it in the soft mask table */ |
| bool search_kernel_soft_mask_table(unsigned long addr) |
| { |
| struct soft_mask_table_entry *smte = __start___soft_mask_table; |
| |
| while (smte < __stop___soft_mask_table) { |
| unsigned long start = smte->start; |
| unsigned long end = smte->end; |
| |
| if (addr >= start && addr < end) |
| return true; |
| |
| smte++; |
| } |
| return false; |
| } |
| NOKPROBE_SYMBOL(search_kernel_soft_mask_table); |
| |
| /* Given an address, look for it in the kernel exception table */ |
| unsigned long search_kernel_restart_table(unsigned long addr) |
| { |
| struct restart_table_entry *rte = __start___restart_table; |
| |
| while (rte < __stop___restart_table) { |
| unsigned long start = rte->start; |
| unsigned long end = rte->end; |
| unsigned long fixup = rte->fixup; |
| |
| if (addr >= start && addr < end) |
| return fixup; |
| |
| rte++; |
| } |
| return 0; |
| } |
| NOKPROBE_SYMBOL(search_kernel_restart_table); |