diff options
author | Vasiliy Ulyanov <v.ulyanov@samsung.com> | 2015-08-26 11:48:46 +0300 |
---|---|---|
committer | Dmitry Kovalenko <d.kovalenko@samsung.com> | 2015-08-27 23:34:19 -0700 |
commit | 92c2d62a0f2fdfdeb4111787eab7eede6cfc16a3 (patch) | |
tree | 74b10f8d1d2402cec21fa23bd0d7e5f72bc2b8fb | |
parent | 682fe1a935dceceb6091f8b7c0de1c63a42d6ab2 (diff) | |
download | swap-modules-92c2d62a0f2fdfdeb4111787eab7eede6cfc16a3.tar.gz swap-modules-92c2d62a0f2fdfdeb4111787eab7eede6cfc16a3.tar.bz2 swap-modules-92c2d62a0f2fdfdeb4111787eab7eede6cfc16a3.zip |
[IMPROVE] Implement kretprobe skipping
If entry_handler returns a non-zero value we will not install
probe on the return address.
Change-Id: Iee2ef0ffadb85d7661b4d46ae30d88cef2d7bc0f
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
-rw-r--r-- | kprobe/swap_kprobes.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/kprobe/swap_kprobes.c b/kprobe/swap_kprobes.c index ece1f7f8..1a082780 100644 --- a/kprobe/swap_kprobes.c +++ b/kprobe/swap_kprobes.c @@ -686,15 +686,21 @@ static int pre_handler_kretprobe(struct kprobe *p, struct pt_regs *regs) /* TODO: test - remove retprobe after func entry but before its exit */ ri = get_free_rp_inst(rp); if (ri != NULL) { + int skip = 0; + ri->rp = rp; ri->task = current; if (rp->entry_handler) - rp->entry_handler(ri, regs); - - swap_arch_prepare_kretprobe(ri, regs); + skip = rp->entry_handler(ri, regs); - add_rp_inst(ri); + if (skip) { + add_rp_inst(ri); + recycle_rp_inst(ri); + } else { + swap_arch_prepare_kretprobe(ri, regs); + add_rp_inst(ri); + } } else { ++rp->nmissed; } |