|
@@ -1272,7 +1272,7 @@ NOKPROBE_SYMBOL(cleanup_rp_inst);
|
|
|
|
|
|
/*
|
|
/*
|
|
* Add the new probe to ap->list. Fail if this is the
|
|
* Add the new probe to ap->list. Fail if this is the
|
|
-* second jprobe at the address - two jprobes can't coexist
|
|
|
|
|
|
+* second break_handler at the address
|
|
*/
|
|
*/
|
|
static int add_new_kprobe(struct kprobe *ap, struct kprobe *p)
|
|
static int add_new_kprobe(struct kprobe *ap, struct kprobe *p)
|
|
{
|
|
{
|
|
@@ -1812,77 +1812,6 @@ unsigned long __weak arch_deref_entry_point(void *entry)
|
|
return (unsigned long)entry;
|
|
return (unsigned long)entry;
|
|
}
|
|
}
|
|
|
|
|
|
-#if 0
|
|
|
|
-int register_jprobes(struct jprobe **jps, int num)
|
|
|
|
-{
|
|
|
|
- int ret = 0, i;
|
|
|
|
-
|
|
|
|
- if (num <= 0)
|
|
|
|
- return -EINVAL;
|
|
|
|
-
|
|
|
|
- for (i = 0; i < num; i++) {
|
|
|
|
- ret = register_jprobe(jps[i]);
|
|
|
|
-
|
|
|
|
- if (ret < 0) {
|
|
|
|
- if (i > 0)
|
|
|
|
- unregister_jprobes(jps, i);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return ret;
|
|
|
|
-}
|
|
|
|
-EXPORT_SYMBOL_GPL(register_jprobes);
|
|
|
|
-
|
|
|
|
-int register_jprobe(struct jprobe *jp)
|
|
|
|
-{
|
|
|
|
- unsigned long addr, offset;
|
|
|
|
- struct kprobe *kp = &jp->kp;
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Verify probepoint as well as the jprobe handler are
|
|
|
|
- * valid function entry points.
|
|
|
|
- */
|
|
|
|
- addr = arch_deref_entry_point(jp->entry);
|
|
|
|
-
|
|
|
|
- if (kallsyms_lookup_size_offset(addr, NULL, &offset) && offset == 0 &&
|
|
|
|
- kprobe_on_func_entry(kp->addr, kp->symbol_name, kp->offset)) {
|
|
|
|
- kp->pre_handler = setjmp_pre_handler;
|
|
|
|
- kp->break_handler = longjmp_break_handler;
|
|
|
|
- return register_kprobe(kp);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return -EINVAL;
|
|
|
|
-}
|
|
|
|
-EXPORT_SYMBOL_GPL(register_jprobe);
|
|
|
|
-
|
|
|
|
-void unregister_jprobe(struct jprobe *jp)
|
|
|
|
-{
|
|
|
|
- unregister_jprobes(&jp, 1);
|
|
|
|
-}
|
|
|
|
-EXPORT_SYMBOL_GPL(unregister_jprobe);
|
|
|
|
-
|
|
|
|
-void unregister_jprobes(struct jprobe **jps, int num)
|
|
|
|
-{
|
|
|
|
- int i;
|
|
|
|
-
|
|
|
|
- if (num <= 0)
|
|
|
|
- return;
|
|
|
|
- mutex_lock(&kprobe_mutex);
|
|
|
|
- for (i = 0; i < num; i++)
|
|
|
|
- if (__unregister_kprobe_top(&jps[i]->kp) < 0)
|
|
|
|
- jps[i]->kp.addr = NULL;
|
|
|
|
- mutex_unlock(&kprobe_mutex);
|
|
|
|
-
|
|
|
|
- synchronize_sched();
|
|
|
|
- for (i = 0; i < num; i++) {
|
|
|
|
- if (jps[i]->kp.addr)
|
|
|
|
- __unregister_kprobe_bottom(&jps[i]->kp);
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-EXPORT_SYMBOL_GPL(unregister_jprobes);
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
#ifdef CONFIG_KRETPROBES
|
|
#ifdef CONFIG_KRETPROBES
|
|
/*
|
|
/*
|
|
* This kprobe pre_handler is registered with every kretprobe. When probe
|
|
* This kprobe pre_handler is registered with every kretprobe. When probe
|
|
@@ -2329,8 +2258,6 @@ static void report_probe(struct seq_file *pi, struct kprobe *p,
|
|
|
|
|
|
if (p->pre_handler == pre_handler_kretprobe)
|
|
if (p->pre_handler == pre_handler_kretprobe)
|
|
kprobe_type = "r";
|
|
kprobe_type = "r";
|
|
- else if (p->pre_handler == setjmp_pre_handler)
|
|
|
|
- kprobe_type = "j";
|
|
|
|
else
|
|
else
|
|
kprobe_type = "k";
|
|
kprobe_type = "k";
|
|
|
|
|
|
@@ -2637,6 +2564,3 @@ late_initcall(debugfs_kprobe_init);
|
|
#endif /* CONFIG_DEBUG_FS */
|
|
#endif /* CONFIG_DEBUG_FS */
|
|
|
|
|
|
module_init(init_kprobes);
|
|
module_init(init_kprobes);
|
|
-
|
|
|
|
-/* defined in arch/.../kernel/kprobes.c */
|
|
|
|
-EXPORT_SYMBOL_GPL(jprobe_return);
|
|
|