Commit 59e87cdc authored by Masami Hiramatsu's avatar Masami Hiramatsu Committed by Ingo Molnar

x86: move deeply indented code to reenter_kprobe

Move some deeply indented code related to re-entrance processing
from kprobe_handler() to reenter_kprobe().
Signed-off-by: default avatarMasami Hiramatsu <mhiramat@redhat.com>
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: Jim Keniston <jkenisto@us.ibm.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 40102d4a
...@@ -432,14 +432,32 @@ void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri, ...@@ -432,14 +432,32 @@ void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,
* within the handler. We save the original kprobes variables and just single * 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. * 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, static int __kprobes reenter_kprobe(struct kprobe *p, struct pt_regs *regs,
struct kprobe_ctlblk *kcb) struct kprobe_ctlblk *kcb)
{ {
if (kcb->kprobe_status == KPROBE_HIT_SS &&
*p->ainsn.insn == BREAKPOINT_INSTRUCTION) {
regs->flags &= ~X86_EFLAGS_TF;
regs->flags |= kcb->kprobe_saved_flags;
return 0;
#ifdef CONFIG_X86_64
} else if (kcb->kprobe_status == KPROBE_HIT_SSDONE) {
/* TODO: Provide re-entrancy from post_kprobes_handler() and
* avoid exception stack corruption while single-stepping on
* the instruction of the new probe.
*/
arch_disarm_kprobe(p);
regs->ip = (unsigned long)p->addr;
reset_current_kprobe();
return 1;
#endif
}
save_previous_kprobe(kcb); save_previous_kprobe(kcb);
set_current_kprobe(p, regs, kcb); set_current_kprobe(p, regs, kcb);
kprobes_inc_nmissed_count(p); kprobes_inc_nmissed_count(p);
prepare_singlestep(p, regs); prepare_singlestep(p, regs);
kcb->kprobe_status = KPROBE_REENTER; kcb->kprobe_status = KPROBE_REENTER;
return 1;
} }
/* /*
...@@ -466,26 +484,8 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) ...@@ -466,26 +484,8 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
if (kprobe_running()) { if (kprobe_running()) {
p = get_kprobe(addr); p = get_kprobe(addr);
if (p) { if (p) {
if (kcb->kprobe_status == KPROBE_HIT_SS && ret = reenter_kprobe(p, regs, kcb);
*p->ainsn.insn == BREAKPOINT_INSTRUCTION) { if (kcb->kprobe_status == KPROBE_REENTER)
regs->flags &= ~X86_EFLAGS_TF;
regs->flags |= kcb->kprobe_saved_flags;
goto no_kprobe;
#ifdef CONFIG_X86_64
} else if (kcb->kprobe_status == KPROBE_HIT_SSDONE) {
/* TODO: Provide re-entrancy from
* post_kprobes_handler() and avoid exception
* stack corruption while single-stepping on
* the instruction of the new probe.
*/
arch_disarm_kprobe(p);
regs->ip = (unsigned long)p->addr;
reset_current_kprobe();
ret = 1;
goto no_kprobe;
#endif
}
reenter_kprobe(p, regs, kcb);
return 1; return 1;
} else { } else {
if (*addr != BREAKPOINT_INSTRUCTION) { if (*addr != BREAKPOINT_INSTRUCTION) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment