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 Pigginbool 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 Pigginunsigned 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