]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 5.7
authorSasha Levin <sashal@kernel.org>
Fri, 17 Jul 2020 14:29:07 +0000 (10:29 -0400)
committerSasha Levin <sashal@kernel.org>
Fri, 17 Jul 2020 14:29:07 +0000 (10:29 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-5.7/arm64-alternatives-don-t-patch-up-internal-branches.patch [new file with mode: 0644]
queue-5.7/series

diff --git a/queue-5.7/arm64-alternatives-don-t-patch-up-internal-branches.patch b/queue-5.7/arm64-alternatives-don-t-patch-up-internal-branches.patch
new file mode 100644 (file)
index 0000000..f1a39fb
--- /dev/null
@@ -0,0 +1,64 @@
+From c7913d690bfa9663c5611866c0dc4dc54b79190e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 9 Jul 2020 15:59:53 +0300
+Subject: arm64/alternatives: don't patch up internal branches
+
+From: Ard Biesheuvel <ardb@kernel.org>
+
+[ Upstream commit 5679b28142193a62f6af93249c0477be9f0c669b ]
+
+Commit f7b93d42945c ("arm64/alternatives: use subsections for replacement
+sequences") moved the alternatives replacement sequences into subsections,
+in order to keep the as close as possible to the code that they replace.
+
+Unfortunately, this broke the logic in branch_insn_requires_update,
+which assumed that any branch into kernel executable code was a branch
+that required updating, which is no longer the case now that the code
+sequences that are patched in are in the same section as the patch site
+itself.
+
+So the only way to discriminate branches that require updating and ones
+that don't is to check whether the branch targets the replacement sequence
+itself, and so we can drop the call to kernel_text_address() entirely.
+
+Fixes: f7b93d42945c ("arm64/alternatives: use subsections for replacement sequences")
+Reported-by: Alexandru Elisei <alexandru.elisei@arm.com>
+Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
+Tested-by: Alexandru Elisei <alexandru.elisei@arm.com>
+Link: https://lore.kernel.org/r/20200709125953.30918-1-ardb@kernel.org
+Signed-off-by: Will Deacon <will@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/kernel/alternative.c | 16 ++--------------
+ 1 file changed, 2 insertions(+), 14 deletions(-)
+
+diff --git a/arch/arm64/kernel/alternative.c b/arch/arm64/kernel/alternative.c
+index d1757ef1b1e74..73039949b5ce2 100644
+--- a/arch/arm64/kernel/alternative.c
++++ b/arch/arm64/kernel/alternative.c
+@@ -43,20 +43,8 @@ bool alternative_is_applied(u16 cpufeature)
+  */
+ static bool branch_insn_requires_update(struct alt_instr *alt, unsigned long pc)
+ {
+-      unsigned long replptr;
+-
+-      if (kernel_text_address(pc))
+-              return true;
+-
+-      replptr = (unsigned long)ALT_REPL_PTR(alt);
+-      if (pc >= replptr && pc <= (replptr + alt->alt_len))
+-              return false;
+-
+-      /*
+-       * Branching into *another* alternate sequence is doomed, and
+-       * we're not even trying to fix it up.
+-       */
+-      BUG();
++      unsigned long replptr = (unsigned long)ALT_REPL_PTR(alt);
++      return !(pc >= replptr && pc <= (replptr + alt->alt_len));
+ }
+ #define align_down(x, a)      ((unsigned long)(x) & ~(((unsigned long)(a)) - 1))
+-- 
+2.25.1
+
index 19a6739240026e274a465d4b22aad0075364b5b4..cdcd27ce8f277cb7258aec07fc59e6499c61cae3 100644 (file)
@@ -56,3 +56,4 @@ arm64-add-midr-value-for-kryo4xx-gold-cpu-cores.patch
 arm64-add-kryo4xx-gold-cpu-cores-to-erratum-list-146.patch
 arm64-add-kryo4xx-silver-cpu-cores-to-erratum-list-1.patch
 i2c-eg20t-load-module-automatically-if-id-matches.patch
+arm64-alternatives-don-t-patch-up-internal-branches.patch