From 82b14ca20a612bbc6a90d9e87957c5b833f87e1c Mon Sep 17 00:00:00 2001 From: Harvey Harrison Date: Wed, 30 Jan 2008 13:32:02 +0100 Subject: [PATCH] --- yaml --- r: 80089 b: refs/heads/master c: 40102d4a41312ad4134c0b802ad074445ce8b17b h: refs/heads/master i: 80087: c1e82124c5e5591f64ea99187fdd46fa9000f4f3 v: v3 --- [refs] | 2 +- trunk/arch/x86/kernel/kprobes.c | 26 +++++++++++++++----------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/[refs] b/[refs] index d3ca6506439d..2d41eee1a211 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ddc66df876fd33d3956f3c3acc1ae334b16eedee +refs/heads/master: 40102d4a41312ad4134c0b802ad074445ce8b17b diff --git a/trunk/arch/x86/kernel/kprobes.c b/trunk/arch/x86/kernel/kprobes.c index f0f2b98b9e20..7dd918633c30 100644 --- a/trunk/arch/x86/kernel/kprobes.c +++ b/trunk/arch/x86/kernel/kprobes.c @@ -427,6 +427,20 @@ void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri, /* Replace the return addr with trampoline addr */ *sara = (unsigned long) &kretprobe_trampoline; } +/* + * We have reentered the kprobe_handler(), since another probe was hit while + * within the handler. We save the original kprobes variables and just single + * step on the instruction of the new probe without calling any user handlers. + */ +static void __kprobes reenter_kprobe(struct kprobe *p, struct pt_regs *regs, + struct kprobe_ctlblk *kcb) +{ + save_previous_kprobe(kcb); + set_current_kprobe(p, regs, kcb); + kprobes_inc_nmissed_count(p); + prepare_singlestep(p, regs); + kcb->kprobe_status = KPROBE_REENTER; +} /* * Interrupts are disabled on entry as trap3 is an interrupt gate and they @@ -471,17 +485,7 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) goto no_kprobe; #endif } - /* We have reentered the kprobe_handler(), since - * another probe was hit while within the handler. - * We here save the original kprobes variables and - * just single step on the instruction of the new probe - * without calling any user handlers. - */ - save_previous_kprobe(kcb); - set_current_kprobe(p, regs, kcb); - kprobes_inc_nmissed_count(p); - prepare_singlestep(p, regs); - kcb->kprobe_status = KPROBE_REENTER; + reenter_kprobe(p, regs, kcb); return 1; } else { if (*addr != BREAKPOINT_INSTRUCTION) {