restart_table.c (1366B)
1#include <asm/interrupt.h> 2#include <asm/kprobes.h> 3 4struct soft_mask_table_entry { 5 unsigned long start; 6 unsigned long end; 7}; 8 9struct restart_table_entry { 10 unsigned long start; 11 unsigned long end; 12 unsigned long fixup; 13}; 14 15extern struct soft_mask_table_entry __start___soft_mask_table[]; 16extern struct soft_mask_table_entry __stop___soft_mask_table[]; 17 18extern struct restart_table_entry __start___restart_table[]; 19extern struct restart_table_entry __stop___restart_table[]; 20 21/* Given an address, look for it in the soft mask table */ 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} 37NOKPROBE_SYMBOL(search_kernel_soft_mask_table); 38 39/* Given an address, look for it in the kernel exception table */ 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} 56NOKPROBE_SYMBOL(search_kernel_restart_table);