xref: /openbmc/linux/arch/powerpc/lib/restart_table.c (revision 762f99f4f3cb41a775b5157dd761217beba65873)
1f23699c9SNicholas Piggin #include <asm/interrupt.h>
2f23699c9SNicholas Piggin #include <asm/kprobes.h>
3f23699c9SNicholas Piggin 
4*325678fdSNicholas Piggin struct soft_mask_table_entry {
5*325678fdSNicholas Piggin 	unsigned long start;
6*325678fdSNicholas Piggin 	unsigned long end;
7*325678fdSNicholas Piggin };
8*325678fdSNicholas Piggin 
9f23699c9SNicholas Piggin struct restart_table_entry {
10f23699c9SNicholas Piggin 	unsigned long start;
11f23699c9SNicholas Piggin 	unsigned long end;
12f23699c9SNicholas Piggin 	unsigned long fixup;
13f23699c9SNicholas Piggin };
14f23699c9SNicholas Piggin 
15*325678fdSNicholas Piggin extern struct soft_mask_table_entry __start___soft_mask_table[];
16*325678fdSNicholas Piggin extern struct soft_mask_table_entry __stop___soft_mask_table[];
17*325678fdSNicholas Piggin 
18f23699c9SNicholas Piggin extern struct restart_table_entry __start___restart_table[];
19f23699c9SNicholas Piggin extern struct restart_table_entry __stop___restart_table[];
20f23699c9SNicholas Piggin 
21*325678fdSNicholas Piggin /* Given an address, look for it in the soft mask table */
search_kernel_soft_mask_table(unsigned long addr)22*325678fdSNicholas Piggin bool search_kernel_soft_mask_table(unsigned long addr)
23*325678fdSNicholas Piggin {
24*325678fdSNicholas Piggin 	struct soft_mask_table_entry *smte = __start___soft_mask_table;
25*325678fdSNicholas Piggin 
26*325678fdSNicholas Piggin 	while (smte < __stop___soft_mask_table) {
27*325678fdSNicholas Piggin 		unsigned long start = smte->start;
28*325678fdSNicholas Piggin 		unsigned long end = smte->end;
29*325678fdSNicholas Piggin 
30*325678fdSNicholas Piggin 		if (addr >= start && addr < end)
31*325678fdSNicholas Piggin 			return true;
32*325678fdSNicholas Piggin 
33*325678fdSNicholas Piggin 		smte++;
34*325678fdSNicholas Piggin 	}
35*325678fdSNicholas Piggin 	return false;
36*325678fdSNicholas Piggin }
37*325678fdSNicholas Piggin NOKPROBE_SYMBOL(search_kernel_soft_mask_table);
38*325678fdSNicholas Piggin 
39f23699c9SNicholas Piggin /* Given an address, look for it in the kernel exception table */
search_kernel_restart_table(unsigned long addr)40f23699c9SNicholas Piggin unsigned long search_kernel_restart_table(unsigned long addr)
41f23699c9SNicholas Piggin {
42f23699c9SNicholas Piggin 	struct restart_table_entry *rte = __start___restart_table;
43f23699c9SNicholas Piggin 
44f23699c9SNicholas Piggin 	while (rte < __stop___restart_table) {
45f23699c9SNicholas Piggin 		unsigned long start = rte->start;
46f23699c9SNicholas Piggin 		unsigned long end = rte->end;
47f23699c9SNicholas Piggin 		unsigned long fixup = rte->fixup;
48f23699c9SNicholas Piggin 
49f23699c9SNicholas Piggin 		if (addr >= start && addr < end)
50f23699c9SNicholas Piggin 			return fixup;
51f23699c9SNicholas Piggin 
52f23699c9SNicholas Piggin 		rte++;
53f23699c9SNicholas Piggin 	}
54f23699c9SNicholas Piggin 	return 0;
55f23699c9SNicholas Piggin }
56f23699c9SNicholas Piggin NOKPROBE_SYMBOL(search_kernel_restart_table);
57