GNU Linux-libre 6.5.10-gnu
[releases.git] / arch / powerpc / lib / restart_table.c
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);