From: duwe@lst.de (Torsten Duwe)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 2/2] arm64: implement live patching
Date: Mon, 27 Jun 2016 17:17:22 +0200 (CEST) [thread overview]
Message-ID: <20160627151722.B81C968D29@newverein.lst.de> (raw)
In-Reply-To: <20160627151500.2247A68D20@newverein.lst.de>
On top of FTRACE_WITH_REGS and the klp changes that go into v4.7
this is straightforward.
Signed-off-by: Torsten Duwe <duwe@suse.de>
---
arch/arm64/Kconfig | 3 +++
arch/arm64/include/asm/livepatch.h | 37 +++++++++++++++++++++++++++++++++++++
arch/arm64/kernel/entry-ftrace.S | 13 +++++++++++++
3 files changed, 53 insertions(+)
create mode 100644 arch/arm64/include/asm/livepatch.h
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index 36a0e26..cb5adf3 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -80,6 +80,7 @@ config ARM64
select HAVE_GENERIC_DMA_COHERENT
select HAVE_HW_BREAKPOINT if PERF_EVENTS
select HAVE_IRQ_TIME_ACCOUNTING
+ select HAVE_LIVEPATCH
select HAVE_MEMBLOCK
select HAVE_MEMBLOCK_NODE_MAP if NUMA
select HAVE_PATA_PLATFORM
@@ -1042,4 +1043,6 @@ if CRYPTO
source "arch/arm64/crypto/Kconfig"
endif
+source "kernel/livepatch/Kconfig"
+
source "lib/Kconfig"
diff --git a/arch/arm64/include/asm/livepatch.h b/arch/arm64/include/asm/livepatch.h
new file mode 100644
index 0000000..6b9a3d1
--- /dev/null
+++ b/arch/arm64/include/asm/livepatch.h
@@ -0,0 +1,37 @@
+/*
+ * livepatch.h - arm64-specific Kernel Live Patching Core
+ *
+ * Copyright (C) 2016 SUSE
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef _ASM_ARM64_LIVEPATCH_H
+#define _ASM_ARM64_LIVEPATCH_H
+
+#include <linux/module.h>
+#include <linux/ftrace.h>
+
+#ifdef CONFIG_LIVEPATCH
+static inline int klp_check_compiler_support(void)
+{
+ return 0;
+}
+
+static inline void klp_arch_set_pc(struct pt_regs *regs, unsigned long ip)
+{
+ regs->pc = ip;
+}
+#endif /* CONFIG_LIVEPATCH */
+
+#endif /* _ASM_ARM64_LIVEPATCH_H */
diff --git a/arch/arm64/kernel/entry-ftrace.S b/arch/arm64/kernel/entry-ftrace.S
index 3ebe791..b166cbf 100644
--- a/arch/arm64/kernel/entry-ftrace.S
+++ b/arch/arm64/kernel/entry-ftrace.S
@@ -204,6 +204,9 @@ ENTRY(ftrace_caller)
str x9, [sp, #S_LR]
/* The program counter just after the ftrace call site */
str lr, [sp, #S_PC]
+#if defined(CONFIG_LIVEPATCH) && defined(CONFIG_FUNCTION_GRAPH_TRACER)
+ mov x19,lr /* remember old return address */
+#endif
/* The stack pointer as it was on ftrace_caller entry... */
add x29, sp, #S_FRAME_SIZE+16 /* ...is also our new FP */
str x29, [sp, #S_SP]
@@ -219,6 +222,16 @@ ftrace_call:
bl ftrace_stub
+#if defined(CONFIG_LIVEPATCH) && defined(CONFIG_FUNCTION_GRAPH_TRACER)
+ /* Is the trace function a live patcher an has messed with
+ * the return address?
+ */
+ ldr x9, [sp, #S_PC]
+ cmp x9, x19 /* compare with the value we remembered */
+ /* to not call graph tracer's "call" mechanism twice! */
+ b.eq ftrace_regs_return
+#endif
+
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
.global ftrace_graph_call
ftrace_graph_call: // ftrace_graph_caller();
--
2.6.6
next prev parent reply other threads:[~2016-06-27 15:17 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-27 15:15 [PATCH v2 0/2] arm64 live patching Torsten Duwe
2016-06-27 15:17 ` [PATCH v2 1/2] arm64: implement FTRACE_WITH_REGS Torsten Duwe
2016-07-01 12:53 ` Josh Poimboeuf
2016-07-04 9:18 ` Torsten Duwe
2016-07-03 5:17 ` kbuild test robot
2016-07-08 14:58 ` Petr Mladek
2016-07-08 15:07 ` Torsten Duwe
2016-07-08 15:24 ` Petr Mladek
2016-07-08 15:48 ` Josh Poimboeuf
2016-07-08 15:57 ` Steven Rostedt
2016-07-08 20:24 ` Torsten Duwe
2016-07-08 21:08 ` Steven Rostedt
2016-07-09 9:06 ` Torsten Duwe
2016-07-15 18:36 ` Steven Rostedt
2016-07-08 15:49 ` Steven Rostedt
2016-06-27 15:17 ` Torsten Duwe [this message]
2016-07-11 14:03 ` [PATCH v2 2/2] arm64: implement live patching Miroslav Benes
2016-07-11 21:58 ` Jessica Yu
2016-07-12 9:47 ` Miroslav Benes
2016-07-13 0:11 ` [PATCH] arm64: take SHN_LIVEPATCH syms into account when calculating plt_max_entries Jessica Yu
2016-08-17 9:38 ` Miroslav Benes
2016-08-11 16:46 ` [PATCH v2 2/2] arm64: implement live patching Torsten Duwe
2016-07-15 16:03 ` Paul Gortmaker
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=20160627151722.B81C968D29@newverein.lst.de \
--to=duwe@lst.de \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).