Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+23 −23
Original line number Diff line number Diff line
@@ -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
 * 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)
{
	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);
	set_current_kprobe(p, regs, kcb);
	kprobes_inc_nmissed_count(p);
	prepare_singlestep(p, regs);
	kcb->kprobe_status = KPROBE_REENTER;
	return 1;
}

/*
@@ -466,26 +484,8 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
	if (kprobe_running()) {
		p = get_kprobe(addr);
		if (p) {
			if (kcb->kprobe_status == KPROBE_HIT_SS &&
				*p->ainsn.insn == BREAKPOINT_INSTRUCTION) {
				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);
			ret = reenter_kprobe(p, regs, kcb);
			if (kcb->kprobe_status == KPROBE_REENTER)
				return 1;
		} else {
			if (*addr != BREAKPOINT_INSTRUCTION) {