1 #include <asm/interrupt.h> 2 #include <asm/kprobes.h> 3 4 struct soft_mask_table_entry { 5 unsigned long start; 6 unsigned long end; 7 }; 8 9 struct restart_table_entry { 10 unsigned long start; 11 unsigned long end; 12 unsigned long fixup; 13 }; 14 15 extern struct soft_mask_table_entry __start___soft_mask_table[]; 16 extern struct soft_mask_table_entry __stop___soft_mask_table[]; 17 18 extern struct restart_table_entry __start___restart_table[]; 19 extern struct restart_table_entry __stop___restart_table[]; 20 21 /* Given an address, look for it in the soft mask table */ search_kernel_soft_mask_table(unsigned long addr)22bool search_kernel_soft_mask_table(unsigned long addr) 23 { 24 struct soft_mask_table_entry *smte = __start___soft_mask_table; 25 26 while (smte < __stop___soft_mask_table) { 27 unsigned long start = smte->start; 28 unsigned long end = smte->end; 29 30 if (addr >= start && addr < end) 31 return true; 32 33 smte++; 34 } 35 return false; 36 } 37 NOKPROBE_SYMBOL(search_kernel_soft_mask_table); 38 39 /* Given an address, look for it in the kernel exception table */ search_kernel_restart_table(unsigned long addr)40unsigned long search_kernel_restart_table(unsigned long addr) 41 { 42 struct restart_table_entry *rte = __start___restart_table; 43 44 while (rte < __stop___restart_table) { 45 unsigned long start = rte->start; 46 unsigned long end = rte->end; 47 unsigned long fixup = rte->fixup; 48 49 if (addr >= start && addr < end) 50 return fixup; 51 52 rte++; 53 } 54 return 0; 55 } 56 NOKPROBE_SYMBOL(search_kernel_restart_table); 57