From 29f8eba078b79bdc8348031943f8fed74b0927ae Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Fri, 17 Jul 2020 10:29:07 -0400 Subject: [PATCH] Fixes for 5.7 Signed-off-by: Sasha Levin --- ...ves-don-t-patch-up-internal-branches.patch | 64 +++++++++++++++++++ queue-5.7/series | 1 + 2 files changed, 65 insertions(+) create mode 100644 queue-5.7/arm64-alternatives-don-t-patch-up-internal-branches.patch 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 index 00000000000..f1a39fba36b --- /dev/null +++ b/queue-5.7/arm64-alternatives-don-t-patch-up-internal-branches.patch @@ -0,0 +1,64 @@ +From c7913d690bfa9663c5611866c0dc4dc54b79190e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 Jul 2020 15:59:53 +0300 +Subject: arm64/alternatives: don't patch up internal branches + +From: Ard Biesheuvel + +[ 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 +Signed-off-by: Ard Biesheuvel +Tested-by: Alexandru Elisei +Link: https://lore.kernel.org/r/20200709125953.30918-1-ardb@kernel.org +Signed-off-by: Will Deacon +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.7/series b/queue-5.7/series index 19a67392400..cdcd27ce8f2 100644 --- a/queue-5.7/series +++ b/queue-5.7/series @@ -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 -- 2.47.3