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

Commit ab4ead02 authored by Kevin Hao's avatar Kevin Hao Committed by Steven Rostedt
Browse files

ftrace/x86: skip over the breakpoint for ftrace caller



In commit 8a4d0a68 "ftrace: Use breakpoint method to update ftrace
caller", we choose to use breakpoint method to update the ftrace
caller. But we also need to skip over the breakpoint in function
ftrace_int3_handler() for them. Otherwise weird things would happen.

Cc: stable@vger.kernel.org # 3.5+
Signed-off-by: default avatarKevin Hao <haokexin@gmail.com>
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
parent 9cd804ac
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -248,6 +248,15 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
	return ret;
}

static int is_ftrace_caller(unsigned long ip)
{
	if (ip == (unsigned long)(&ftrace_call) ||
		ip == (unsigned long)(&ftrace_regs_call))
		return 1;

	return 0;
}

/*
 * A breakpoint was added to the code address we are about to
 * modify, and this is the handle that will just skip over it.
@@ -257,10 +266,13 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
 */
int ftrace_int3_handler(struct pt_regs *regs)
{
	unsigned long ip;

	if (WARN_ON_ONCE(!regs))
		return 0;

	if (!ftrace_location(regs->ip - 1))
	ip = regs->ip - 1;
	if (!ftrace_location(ip) && !is_ftrace_caller(ip))
		return 0;

	regs->ip += MCOUNT_INSN_SIZE - 1;