diff options
Diffstat (limited to 'kernel/kprobes.c')
-rw-r--r-- | kernel/kprobes.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index ceeadfcabb76..5b5ac76671e7 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
@@ -96,9 +96,6 @@ static raw_spinlock_t *kretprobe_table_lock_ptr(unsigned long hash) | |||
96 | static struct kprobe_blackpoint kprobe_blacklist[] = { | 96 | static struct kprobe_blackpoint kprobe_blacklist[] = { |
97 | {"preempt_schedule",}, | 97 | {"preempt_schedule",}, |
98 | {"native_get_debugreg",}, | 98 | {"native_get_debugreg",}, |
99 | {"irq_entries_start",}, | ||
100 | {"common_interrupt",}, | ||
101 | {"mcount",}, /* mcount can be called from everywhere */ | ||
102 | {NULL} /* Terminator */ | 99 | {NULL} /* Terminator */ |
103 | }; | 100 | }; |
104 | 101 | ||
@@ -1324,12 +1321,18 @@ out: | |||
1324 | return ret; | 1321 | return ret; |
1325 | } | 1322 | } |
1326 | 1323 | ||
1324 | bool __weak arch_within_kprobe_blacklist(unsigned long addr) | ||
1325 | { | ||
1326 | /* The __kprobes marked functions and entry code must not be probed */ | ||
1327 | return addr >= (unsigned long)__kprobes_text_start && | ||
1328 | addr < (unsigned long)__kprobes_text_end; | ||
1329 | } | ||
1330 | |||
1327 | static int __kprobes in_kprobes_functions(unsigned long addr) | 1331 | static int __kprobes in_kprobes_functions(unsigned long addr) |
1328 | { | 1332 | { |
1329 | struct kprobe_blackpoint *kb; | 1333 | struct kprobe_blackpoint *kb; |
1330 | 1334 | ||
1331 | if (addr >= (unsigned long)__kprobes_text_start && | 1335 | if (arch_within_kprobe_blacklist(addr)) |
1332 | addr < (unsigned long)__kprobes_text_end) | ||
1333 | return -EINVAL; | 1336 | return -EINVAL; |
1334 | /* | 1337 | /* |
1335 | * If there exists a kprobe_blacklist, verify and | 1338 | * If there exists a kprobe_blacklist, verify and |