summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVasiliy Ulyanov <v.ulyanov@samsung.com>2015-08-26 11:48:46 +0300
committerDmitry Kovalenko <d.kovalenko@samsung.com>2015-08-27 23:34:19 -0700
commit92c2d62a0f2fdfdeb4111787eab7eede6cfc16a3 (patch)
tree74b10f8d1d2402cec21fa23bd0d7e5f72bc2b8fb
parent682fe1a935dceceb6091f8b7c0de1c63a42d6ab2 (diff)
downloadswap-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.c14
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;
}