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

Commit 74e59dfc authored by Oleg Nesterov's avatar Oleg Nesterov
Browse files

uprobes: Change handle_swbp() to expose bp_vaddr to handler_chain()



Change handle_swbp() to set regs->ip = bp_vaddr in advance, this is
what consumer->handler() needs but uprobe_get_swbp_addr() is not
exported.

This also simplifies the code and makes it more consistent across
the supported architectures. handle_swbp() becomes the only caller
of uprobe_get_swbp_addr().

Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
Acked-by: default avatarAnanth N Mavinakayanahalli <ananth@in.ibm.com>
parent cf31ec3f
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -681,7 +681,6 @@ static bool __skip_sstep(struct arch_uprobe *auprobe, struct pt_regs *regs)
			continue;

		if (auprobe->insn[i] == 0x90) {
			regs->ip = uprobe_get_swbp_addr(regs);
			regs->ip += i + 1;
			return true;
		}
+7 −8
Original line number Diff line number Diff line
@@ -1504,6 +1504,10 @@ static void handle_swbp(struct pt_regs *regs)
		}
		return;
	}

	/* change it in advance for ->handler() and restart */
	instruction_pointer_set(regs, bp_vaddr);

	/*
	 * TODO: move copy_insn/etc into _register and remove this hack.
	 * After we hit the bp, _unregister + _register can install the
@@ -1511,14 +1515,14 @@ static void handle_swbp(struct pt_regs *regs)
	 */
	smp_rmb(); /* pairs with wmb() in install_breakpoint() */
	if (unlikely(!test_bit(UPROBE_COPY_INSN, &uprobe->flags)))
		goto restart;
		goto out;

	utask = current->utask;
	if (!utask) {
		utask = add_utask();
		/* Cannot allocate; re-execute the instruction. */
		if (!utask)
			goto restart;
			goto out;
	}

	handler_chain(uprobe, regs);
@@ -1531,12 +1535,7 @@ static void handle_swbp(struct pt_regs *regs)
		return;
	}

restart:
	/*
	 * cannot singlestep; cannot skip instruction;
	 * re-execute the instruction.
	 */
	instruction_pointer_set(regs, bp_vaddr);
	/* can_skip_sstep() succeeded, or restart if can't singlestep */
out:
	put_uprobe(uprobe);
}
+2 −2
Original line number Diff line number Diff line
@@ -492,7 +492,7 @@ static void uprobe_trace_func(struct trace_uprobe *tu, struct pt_regs *regs)
		return;

	entry = ring_buffer_event_data(event);
	entry->ip = uprobe_get_swbp_addr(task_pt_regs(current));
	entry->ip = instruction_pointer(task_pt_regs(current));
	data = (u8 *)&entry[1];
	for (i = 0; i < tu->nr_args; i++)
		call_fetch(&tu->args[i].fetch, regs, data + tu->args[i].offset);
@@ -667,7 +667,7 @@ static void uprobe_perf_func(struct trace_uprobe *tu, struct pt_regs *regs)
	if (!entry)
		goto out;

	entry->ip = uprobe_get_swbp_addr(task_pt_regs(current));
	entry->ip = instruction_pointer(task_pt_regs(current));
	data = (u8 *)&entry[1];
	for (i = 0; i < tu->nr_args; i++)
		call_fetch(&tu->args[i].fetch, regs, data + tu->args[i].offset);