From: rostedt@goodmis.org (Steven Rostedt)
Subject: [RFC][PATCH 0/3] x86_64/ftrace: Emulate calls from int3 when patching functions
Date: Tue, 07 May 2019 13:42:27 -0400 [thread overview]
Message-ID: <20190507174227.673261270@goodmis.org> (raw)
Message-ID: <20190507174227.6gOmwkJgTfSsLrMWUrttG2cmxaVH36y8Uzfv3TF3P74@z> (raw)
Nicolai Stange discovered that Live Kernel Patching can have unforseen
consequences if tracing is enabled when there are functions that are
patched. The reason being, is that Live Kernel patching is built on top
of ftrace, which will have the patched functions call the live kernel
trampoline directly, and that trampoline will modify the regs->ip address
to return to the patched function.
But in the transition between changing the call to the customized
trampoline, the tracing code is needed to have its handler called
an well, so the function fentry location must be changed from calling
the live kernel patching trampoline, to the ftrace_reg_caller trampoline
which will iterate through all the registered ftrace handlers for
that function.
During this transition, a break point is added to do the live code
modifications. But if that break point is hit, it just skips calling
any handler, and makes the call site act as a nop. For tracing, the
worse that can happen is that you miss a function being traced, but
for live kernel patching the affects are more severe, as the old buggy
function is now called.
To solve this, an int3_emulate_call() is created for x86_64 to allow
ftrace on x86_64 to emulate the call to ftrace_regs_caller() which will
make sure all the registered handlers to that function are still called.
And this keeps live kernel patching happy!
To mimimize the changes, and to avoid controversial patches, this
only changes x86_64. Due to the way x86_32 implements the regs->sp
the complexity of emulating calls on that platform is too much for
stable patches, and live kernel patching does not support x86_32 anyway.
Josh Poimboeuf (1):
x86_64: Add gap to int3 to allow for call emulation
Peter Zijlstra (2):
x86_64: Allow breakpoints to emulate call functions
ftrace/x86_64: Emulate call function while updating in breakpoint handler
----
arch/x86/entry/entry_64.S | 18 ++++++++++++++++--
arch/x86/include/asm/text-patching.h | 22 ++++++++++++++++++++++
arch/x86/kernel/ftrace.c | 32 +++++++++++++++++++++++++++-----
3 files changed, 65 insertions(+), 7 deletions(-)
next reply other threads:[~2019-05-07 17:42 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-07 17:42 Steven Rostedt [this message]
2019-05-07 17:42 ` [RFC][PATCH 0/3] x86_64/ftrace: Emulate calls from int3 when patching functions Steven Rostedt
2019-05-07 17:42 ` rostedt
2019-05-07 17:42 ` [RFC][PATCH 1/3] x86_64: Add gap to int3 to allow for call emulation Steven Rostedt
2019-05-07 17:42 ` Steven Rostedt
2019-05-07 17:42 ` rostedt
2019-05-07 17:56 ` Josh Poimboeuf
2019-05-07 17:56 ` Josh Poimboeuf
2019-05-07 17:56 ` jpoimboe
2019-05-07 18:57 ` Steven Rostedt
2019-05-07 18:57 ` Steven Rostedt
2019-05-07 18:57 ` rostedt
2019-05-07 17:42 ` [RFC][PATCH 2/3] x86_64: Allow breakpoints to emulate call functions Steven Rostedt
2019-05-07 17:42 ` Steven Rostedt
2019-05-07 17:42 ` rostedt
2019-05-07 17:53 ` Josh Poimboeuf
2019-05-07 17:53 ` Josh Poimboeuf
2019-05-07 17:53 ` jpoimboe
2019-05-07 19:01 ` Steven Rostedt
2019-05-07 19:01 ` Steven Rostedt
2019-05-07 19:01 ` rostedt
2019-05-07 19:14 ` Josh Poimboeuf
2019-05-07 19:14 ` Josh Poimboeuf
2019-05-07 19:14 ` jpoimboe
2019-05-07 19:20 ` Steven Rostedt
2019-05-07 19:20 ` Steven Rostedt
2019-05-07 19:20 ` rostedt
2019-05-07 19:49 ` Josh Poimboeuf
2019-05-07 19:49 ` Josh Poimboeuf
2019-05-07 19:49 ` jpoimboe
2019-05-07 19:58 ` Steven Rostedt
2019-05-07 19:58 ` Steven Rostedt
2019-05-07 19:58 ` rostedt
2019-05-07 20:02 ` Josh Poimboeuf
2019-05-07 20:02 ` Josh Poimboeuf
2019-05-07 20:02 ` jpoimboe
2019-05-07 17:42 ` [RFC][PATCH 3/3] ftrace/x86_64: Emulate call function while updating in breakpoint handler Steven Rostedt
2019-05-07 17:42 ` Steven Rostedt
2019-05-07 17:42 ` rostedt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190507174227.673261270@goodmis.org \
--to=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.