Back to home page

OSCL-LXR

 
 

    


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 /* Given an address, look for it in the soft mask table */
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 /* Given an address, look for it in the kernel exception table */
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);