All of lore.kernel.org
 help / color / mirror / Atom feed
From: abelvesa@linux.com (Abel Vesa)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/7] arm: ftrace: Add call modify mechanism
Date: Tue,  6 Dec 2016 17:06:02 +0000	[thread overview]
Message-ID: <1481043967-15602-3-git-send-email-abelvesa@linux.com> (raw)
In-Reply-To: <1481043967-15602-1-git-send-email-abelvesa@linux.com>

Function ftrace_modify_call provides a way to replace ftrace_stub
with the ftrace function. This helps the klp_ftrace_handler to be
called via ftrace_ops_no_ops, which in turn will set the pc with
the patched function's starting address. This is used for
livepatching.

Signed-off-by: Abel Vesa <abelvesa@linux.com>
---
 arch/arm/kernel/ftrace.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/arch/arm/kernel/ftrace.c b/arch/arm/kernel/ftrace.c
index 3f17594..cb4543a 100644
--- a/arch/arm/kernel/ftrace.c
+++ b/arch/arm/kernel/ftrace.c
@@ -139,6 +139,15 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
 
 	ret = ftrace_modify_code(pc, 0, new, false);
 
+#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
+	if (!ret) {
+		pc = (unsigned long)&ftrace_regs_call;
+		new = ftrace_call_replace(pc, (unsigned long)func);
+
+		ret = ftrace_modify_code(pc, 0, new, false);
+	}
+#endif
+
 #ifdef CONFIG_OLD_MCOUNT
 	if (!ret) {
 		pc = (unsigned long)&ftrace_call_old;
@@ -151,6 +160,18 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
 	return ret;
 }
 
+int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
+	       unsigned long addr)
+{
+	unsigned long pc = rec->ip;
+	u32 old, new;
+
+	old = arm_gen_branch(pc, old_addr);
+	new = arm_gen_branch(pc, addr);
+
+	return ftrace_modify_code(pc, old, new, true);
+}
+
 int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
 {
 	unsigned long new, old;
-- 
2.7.4

WARNING: multiple messages have this Message-ID (diff)
From: Abel Vesa <abelvesa@linux.com>
To: linux@armlinux.org.uk, jpoimboe@redhat.com, jeyu@redhat.com,
	jikos@kernel.org, mbenes@suse.cz, pmladek@suse.com
Cc: rostedt@goodmis.org, mingo@redhat.com,
	gregkh@linuxfoundation.org, geert+renesas@glider.be,
	davem@davemloft.net, akpm@linux-foundation.org,
	emil.l.velikov@gmail.com, mchehab@kernel.org, linux@roeck-us.net,
	ard.biesheuvel@linaro.org, jens.wiklander@linaro.org,
	jean-philippe.brucker@arm.com, viro@zeniv.linux.org.uk,
	stefano.stabellini@eu.citrix.com, chris.brandt@renesas.com,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	live-patching@vger.kernel.org, Abel Vesa <abelvesa@linux.com>
Subject: [PATCH 2/7] arm: ftrace: Add call modify mechanism
Date: Tue,  6 Dec 2016 17:06:02 +0000	[thread overview]
Message-ID: <1481043967-15602-3-git-send-email-abelvesa@linux.com> (raw)
In-Reply-To: <1481043967-15602-1-git-send-email-abelvesa@linux.com>

Function ftrace_modify_call provides a way to replace ftrace_stub
with the ftrace function. This helps the klp_ftrace_handler to be
called via ftrace_ops_no_ops, which in turn will set the pc with
the patched function's starting address. This is used for
livepatching.

Signed-off-by: Abel Vesa <abelvesa@linux.com>
---
 arch/arm/kernel/ftrace.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/arch/arm/kernel/ftrace.c b/arch/arm/kernel/ftrace.c
index 3f17594..cb4543a 100644
--- a/arch/arm/kernel/ftrace.c
+++ b/arch/arm/kernel/ftrace.c
@@ -139,6 +139,15 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
 
 	ret = ftrace_modify_code(pc, 0, new, false);
 
+#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
+	if (!ret) {
+		pc = (unsigned long)&ftrace_regs_call;
+		new = ftrace_call_replace(pc, (unsigned long)func);
+
+		ret = ftrace_modify_code(pc, 0, new, false);
+	}
+#endif
+
 #ifdef CONFIG_OLD_MCOUNT
 	if (!ret) {
 		pc = (unsigned long)&ftrace_call_old;
@@ -151,6 +160,18 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
 	return ret;
 }
 
+int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
+	       unsigned long addr)
+{
+	unsigned long pc = rec->ip;
+	u32 old, new;
+
+	old = arm_gen_branch(pc, old_addr);
+	new = arm_gen_branch(pc, addr);
+
+	return ftrace_modify_code(pc, old, new, true);
+}
+
 int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
 {
 	unsigned long new, old;
-- 
2.7.4

  parent reply	other threads:[~2016-12-06 17:06 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-06 17:06 [PATCH 0/7] arm: Add livepatch support Abel Vesa
2016-12-06 17:06 ` Abel Vesa
2016-12-06 17:06 ` [PATCH 1/7] arm: Add livepatch arch specific code Abel Vesa
2016-12-06 17:06   ` Abel Vesa
2017-01-16 16:47   ` Miroslav Benes
2017-01-16 16:47     ` Miroslav Benes
2017-01-17  0:22     ` Jessica Yu
2017-01-17  0:22       ` Jessica Yu
2017-01-17  2:27       ` Jessica Yu
2017-01-17  2:27         ` Jessica Yu
2017-01-17 13:53       ` Miroslav Benes
2017-01-17 13:53         ` Miroslav Benes
2016-12-06 17:06 ` Abel Vesa [this message]
2016-12-06 17:06   ` [PATCH 2/7] arm: ftrace: Add call modify mechanism Abel Vesa
2016-12-07 10:37   ` kbuild test robot
2016-12-07 10:37     ` kbuild test robot
2016-12-06 17:06 ` [PATCH 3/7] arm: module: Add apply_relocate_add Abel Vesa
2016-12-06 17:06   ` Abel Vesa
2016-12-07  2:08   ` kbuild test robot
2016-12-07  2:08     ` kbuild test robot
2017-01-17  4:49   ` Jessica Yu
2017-01-17  4:49     ` Jessica Yu
2017-01-18 10:37     ` Miroslav Benes
2017-01-18 10:37       ` Miroslav Benes
2016-12-06 17:06 ` [PATCH 4/7] arm: Add ftrace with regs support Abel Vesa
2016-12-06 17:06   ` Abel Vesa
2016-12-07  2:43   ` Steven Rostedt
2016-12-07  2:43     ` Steven Rostedt
2016-12-07 10:57   ` Russell King - ARM Linux
2016-12-07 10:57     ` Russell King - ARM Linux
2016-12-07 11:58   ` Robin Murphy
2016-12-07 11:58     ` Robin Murphy
2016-12-07 12:10     ` Abel Vesa
2016-12-07 12:10       ` Abel Vesa
2016-12-06 17:06 ` [PATCH 5/7] arm: ftrace: Add ARCH_SUPPORTS_FTRACE_OPS for ftrace with regs Abel Vesa
2016-12-06 17:06   ` Abel Vesa
2016-12-06 17:06 ` [PATCH 6/7] arm: Add livepatch to build if CONFIG_LIVEPATCH Abel Vesa
2016-12-06 17:06   ` Abel Vesa
2016-12-07 15:05   ` Petr Mladek
2016-12-07 15:05     ` Petr Mladek
2016-12-07 16:11     ` Abel Vesa
2016-12-07 16:11       ` Abel Vesa
2017-01-18 12:36   ` Miroslav Benes
2017-01-18 12:36     ` Miroslav Benes
2016-12-06 17:06 ` [PATCH 7/7] arm: Add livepatch necessary arch selects into Kconfig Abel Vesa
2016-12-06 17:06   ` Abel Vesa
2016-12-07  2:45   ` Steven Rostedt
2016-12-07  2:45     ` Steven Rostedt
2016-12-07  6:48   ` kbuild test robot
2016-12-07  6:48     ` kbuild test robot
2017-01-18 12:40   ` Miroslav Benes
2017-01-18 12:40     ` Miroslav Benes
2017-01-18 13:35     ` Russell King - ARM Linux
2017-01-18 13:35       ` Russell King - ARM Linux
2016-12-07  1:35 ` [PATCH 0/7] arm: Add livepatch support zhouchengming
2016-12-07  1:38 ` zhouchengming
2016-12-07  1:38   ` zhouchengming
2016-12-07 11:39   ` Abel Vesa
2016-12-07 11:39     ` Abel Vesa
2016-12-07 15:19 ` Petr Mladek
2016-12-07 15:19   ` Petr Mladek

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=1481043967-15602-3-git-send-email-abelvesa@linux.com \
    --to=abelvesa@linux.com \
    --cc=linux-arm-kernel@lists.infradead.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.