0001 #include <asm/interrupt.h>
0002 #include <asm/kprobes.h>
0003
0004 struct soft_mask_table_entry {
0005 unsigned long start;
0006 unsigned long end;
0007 };
0008
0009 struct restart_table_entry {
0010 unsigned long start;
0011 unsigned long end;
0012 unsigned long fixup;
0013 };
0014
0015 extern struct soft_mask_table_entry __start___soft_mask_table[];
0016 extern struct soft_mask_table_entry __stop___soft_mask_table[];
0017
0018 extern struct restart_table_entry __start___restart_table[];
0019 extern struct restart_table_entry __stop___restart_table[];
0020
0021
0022 bool search_kernel_soft_mask_table(unsigned long addr)
0023 {
0024 struct soft_mask_table_entry *smte = __start___soft_mask_table;
0025
0026 while (smte < __stop___soft_mask_table) {
0027 unsigned long start = smte->start;
0028 unsigned long end = smte->end;
0029
0030 if (addr >= start && addr < end)
0031 return true;
0032
0033 smte++;
0034 }
0035 return false;
0036 }
0037 NOKPROBE_SYMBOL(search_kernel_soft_mask_table);
0038
0039
0040 unsigned long search_kernel_restart_table(unsigned long addr)
0041 {
0042 struct restart_table_entry *rte = __start___restart_table;
0043
0044 while (rte < __stop___restart_table) {
0045 unsigned long start = rte->start;
0046 unsigned long end = rte->end;
0047 unsigned long fixup = rte->fixup;
0048
0049 if (addr >= start && addr < end)
0050 return fixup;
0051
0052 rte++;
0053 }
0054 return 0;
0055 }
0056 NOKPROBE_SYMBOL(search_kernel_restart_table);