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 */ |
22 | bool 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 */ |
40 | unsigned 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 |