From: Greg Kroah-Hartman Date: Mon, 4 Oct 2021 11:21:20 +0000 (+0200) Subject: 4.9-stable patches X-Git-Tag: v4.4.286~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8152667f3068201a818ac5e3d5c6797e9fc1fb01;p=thirdparty%2Fkernel%2Fstable-queue.git 4.9-stable patches added patches: arm-9077-1-plt-move-struct-plt_entries-definition-to-header.patch arm-9078-1-add-warn-suppress-parameter-to-arm_gen_branch_link.patch arm-9079-1-ftrace-add-module_plts-support.patch arm-9098-1-ftrace-module_plt-fix-build-problem-without-dynamic_ftrace.patch arm64-extend-workaround-for-erratum-1024718-to-all-versions-of-cortex-a55.patch --- diff --git a/queue-4.9/arm-9077-1-plt-move-struct-plt_entries-definition-to-header.patch b/queue-4.9/arm-9077-1-plt-move-struct-plt_entries-definition-to-header.patch new file mode 100644 index 00000000000..583e60c58b5 --- /dev/null +++ b/queue-4.9/arm-9077-1-plt-move-struct-plt_entries-definition-to-header.patch @@ -0,0 +1,66 @@ +From foo@baz Mon Oct 4 01:07:23 PM CEST 2021 +From: Florian Fainelli +Date: Mon, 27 Sep 2021 14:03:13 -0700 +Subject: ARM: 9077/1: PLT: Move struct plt_entries definition to header +To: linux-kernel@vger.kernel.org +Cc: stable@vger.kernel.org, Greg Kroah-Hartman , Sasha Levin , Alex Sverdlin , Russell King , Florian Fainelli , Steven Rostedt , Ingo Molnar , Russell King , linux-arm-kernel@lists.infradead.org (moderated list:ARM PORT) +Message-ID: <20210927210316.3217044-2-f.fainelli@gmail.com> + +From: Alex Sverdlin + +commit 4e271701c17dee70c6e1351c4d7d42e70405c6a9 upstream + +No functional change, later it will be re-used in several files. + +Signed-off-by: Alexander Sverdlin +Signed-off-by: Russell King +Signed-off-by: Florian Fainelli +Signed-off-by: Greg Kroah-Hartman +--- + arch/arm/include/asm/module.h | 9 +++++++++ + arch/arm/kernel/module-plts.c | 9 --------- + 2 files changed, 9 insertions(+), 9 deletions(-) + +--- a/arch/arm/include/asm/module.h ++++ b/arch/arm/include/asm/module.h +@@ -18,6 +18,15 @@ enum { + }; + #endif + ++#define PLT_ENT_STRIDE L1_CACHE_BYTES ++#define PLT_ENT_COUNT (PLT_ENT_STRIDE / sizeof(u32)) ++#define PLT_ENT_SIZE (sizeof(struct plt_entries) / PLT_ENT_COUNT) ++ ++struct plt_entries { ++ u32 ldr[PLT_ENT_COUNT]; ++ u32 lit[PLT_ENT_COUNT]; ++}; ++ + struct mod_plt_sec { + struct elf32_shdr *plt; + int plt_count; +--- a/arch/arm/kernel/module-plts.c ++++ b/arch/arm/kernel/module-plts.c +@@ -14,10 +14,6 @@ + #include + #include + +-#define PLT_ENT_STRIDE L1_CACHE_BYTES +-#define PLT_ENT_COUNT (PLT_ENT_STRIDE / sizeof(u32)) +-#define PLT_ENT_SIZE (sizeof(struct plt_entries) / PLT_ENT_COUNT) +- + #ifdef CONFIG_THUMB2_KERNEL + #define PLT_ENT_LDR __opcode_to_mem_thumb32(0xf8dff000 | \ + (PLT_ENT_STRIDE - 4)) +@@ -26,11 +22,6 @@ + (PLT_ENT_STRIDE - 8)) + #endif + +-struct plt_entries { +- u32 ldr[PLT_ENT_COUNT]; +- u32 lit[PLT_ENT_COUNT]; +-}; +- + static bool in_init(const struct module *mod, unsigned long loc) + { + return loc - (u32)mod->init_layout.base < mod->init_layout.size; diff --git a/queue-4.9/arm-9078-1-add-warn-suppress-parameter-to-arm_gen_branch_link.patch b/queue-4.9/arm-9078-1-add-warn-suppress-parameter-to-arm_gen_branch_link.patch new file mode 100644 index 00000000000..03a1f90ce32 --- /dev/null +++ b/queue-4.9/arm-9078-1-add-warn-suppress-parameter-to-arm_gen_branch_link.patch @@ -0,0 +1,117 @@ +From foo@baz Mon Oct 4 01:07:23 PM CEST 2021 +From: Florian Fainelli +Date: Mon, 27 Sep 2021 14:03:14 -0700 +Subject: ARM: 9078/1: Add warn suppress parameter to arm_gen_branch_link() +To: linux-kernel@vger.kernel.org +Cc: stable@vger.kernel.org, Greg Kroah-Hartman , Sasha Levin , Alex Sverdlin , Russell King , Florian Fainelli , Steven Rostedt , Ingo Molnar , Russell King , linux-arm-kernel@lists.infradead.org (moderated list:ARM PORT) +Message-ID: <20210927210316.3217044-3-f.fainelli@gmail.com> + +From: Alex Sverdlin + +commit 890cb057a46d323fd8c77ebecb6485476614cd21 upstream + +Will be used in the following patch. No functional change. + +Signed-off-by: Alexander Sverdlin +Signed-off-by: Russell King +Signed-off-by: Florian Fainelli +Signed-off-by: Greg Kroah-Hartman +--- + arch/arm/include/asm/insn.h | 8 ++++---- + arch/arm/kernel/ftrace.c | 2 +- + arch/arm/kernel/insn.c | 19 ++++++++++--------- + 3 files changed, 15 insertions(+), 14 deletions(-) + +--- a/arch/arm/include/asm/insn.h ++++ b/arch/arm/include/asm/insn.h +@@ -12,18 +12,18 @@ arm_gen_nop(void) + } + + unsigned long +-__arm_gen_branch(unsigned long pc, unsigned long addr, bool link); ++__arm_gen_branch(unsigned long pc, unsigned long addr, bool link, bool warn); + + static inline unsigned long + arm_gen_branch(unsigned long pc, unsigned long addr) + { +- return __arm_gen_branch(pc, addr, false); ++ return __arm_gen_branch(pc, addr, false, true); + } + + static inline unsigned long +-arm_gen_branch_link(unsigned long pc, unsigned long addr) ++arm_gen_branch_link(unsigned long pc, unsigned long addr, bool warn) + { +- return __arm_gen_branch(pc, addr, true); ++ return __arm_gen_branch(pc, addr, true, warn); + } + + #endif +--- a/arch/arm/kernel/ftrace.c ++++ b/arch/arm/kernel/ftrace.c +@@ -97,7 +97,7 @@ int ftrace_arch_code_modify_post_process + + static unsigned long ftrace_call_replace(unsigned long pc, unsigned long addr) + { +- return arm_gen_branch_link(pc, addr); ++ return arm_gen_branch_link(pc, addr, true); + } + + static int ftrace_modify_code(unsigned long pc, unsigned long old, +--- a/arch/arm/kernel/insn.c ++++ b/arch/arm/kernel/insn.c +@@ -2,8 +2,9 @@ + #include + #include + +-static unsigned long +-__arm_gen_branch_thumb2(unsigned long pc, unsigned long addr, bool link) ++static unsigned long __arm_gen_branch_thumb2(unsigned long pc, ++ unsigned long addr, bool link, ++ bool warn) + { + unsigned long s, j1, j2, i1, i2, imm10, imm11; + unsigned long first, second; +@@ -11,7 +12,7 @@ __arm_gen_branch_thumb2(unsigned long pc + + offset = (long)addr - (long)(pc + 4); + if (offset < -16777216 || offset > 16777214) { +- WARN_ON_ONCE(1); ++ WARN_ON_ONCE(warn); + return 0; + } + +@@ -32,8 +33,8 @@ __arm_gen_branch_thumb2(unsigned long pc + return __opcode_thumb32_compose(first, second); + } + +-static unsigned long +-__arm_gen_branch_arm(unsigned long pc, unsigned long addr, bool link) ++static unsigned long __arm_gen_branch_arm(unsigned long pc, unsigned long addr, ++ bool link, bool warn) + { + unsigned long opcode = 0xea000000; + long offset; +@@ -43,7 +44,7 @@ __arm_gen_branch_arm(unsigned long pc, u + + offset = (long)addr - (long)(pc + 8); + if (unlikely(offset < -33554432 || offset > 33554428)) { +- WARN_ON_ONCE(1); ++ WARN_ON_ONCE(warn); + return 0; + } + +@@ -53,10 +54,10 @@ __arm_gen_branch_arm(unsigned long pc, u + } + + unsigned long +-__arm_gen_branch(unsigned long pc, unsigned long addr, bool link) ++__arm_gen_branch(unsigned long pc, unsigned long addr, bool link, bool warn) + { + if (IS_ENABLED(CONFIG_THUMB2_KERNEL)) +- return __arm_gen_branch_thumb2(pc, addr, link); ++ return __arm_gen_branch_thumb2(pc, addr, link, warn); + else +- return __arm_gen_branch_arm(pc, addr, link); ++ return __arm_gen_branch_arm(pc, addr, link, warn); + } diff --git a/queue-4.9/arm-9079-1-ftrace-add-module_plts-support.patch b/queue-4.9/arm-9079-1-ftrace-add-module_plts-support.patch new file mode 100644 index 00000000000..8e3ffc0ed9b --- /dev/null +++ b/queue-4.9/arm-9079-1-ftrace-add-module_plts-support.patch @@ -0,0 +1,271 @@ +From foo@baz Mon Oct 4 01:07:23 PM CEST 2021 +From: Florian Fainelli +Date: Mon, 27 Sep 2021 14:03:15 -0700 +Subject: ARM: 9079/1: ftrace: Add MODULE_PLTS support +To: linux-kernel@vger.kernel.org +Cc: stable@vger.kernel.org, Greg Kroah-Hartman , Sasha Levin , Alex Sverdlin , Russell King , Florian Fainelli , Steven Rostedt , Ingo Molnar , Russell King , linux-arm-kernel@lists.infradead.org (moderated list:ARM PORT) +Message-ID: <20210927210316.3217044-4-f.fainelli@gmail.com> + +From: Alex Sverdlin + +commit 79f32b221b18c15a98507b101ef4beb52444cc6f upstream + +Teach ftrace_make_call() and ftrace_make_nop() about PLTs. +Teach PLT code about FTRACE and all its callbacks. +Otherwise the following might happen: + +------------[ cut here ]------------ +WARNING: CPU: 14 PID: 2265 at .../arch/arm/kernel/insn.c:14 __arm_gen_branch+0x83/0x8c() +... +Hardware name: LSI Axxia AXM55XX +[] (unwind_backtrace) from [] (show_stack+0x11/0x14) +[] (show_stack) from [] (dump_stack+0x81/0xa8) +[] (dump_stack) from [] (warn_slowpath_common+0x69/0x90) +[] (warn_slowpath_common) from [] (warn_slowpath_null+0x17/0x1c) +[] (warn_slowpath_null) from [] (__arm_gen_branch+0x83/0x8c) +[] (__arm_gen_branch) from [] (ftrace_make_nop+0xf/0x24) +[] (ftrace_make_nop) from [] (ftrace_process_locs+0x27b/0x3e8) +[] (ftrace_process_locs) from [] (load_module+0x11e9/0x1a44) +[] (load_module) from [] (SyS_finit_module+0x59/0x84) +[] (SyS_finit_module) from [] (ret_fast_syscall+0x1/0x18) +---[ end trace e1b64ced7a89adcc ]--- +------------[ cut here ]------------ +WARNING: CPU: 14 PID: 2265 at .../kernel/trace/ftrace.c:1979 ftrace_bug+0x1b1/0x234() +... +Hardware name: LSI Axxia AXM55XX +[] (unwind_backtrace) from [] (show_stack+0x11/0x14) +[] (show_stack) from [] (dump_stack+0x81/0xa8) +[] (dump_stack) from [] (warn_slowpath_common+0x69/0x90) +[] (warn_slowpath_common) from [] (warn_slowpath_null+0x17/0x1c) +[] (warn_slowpath_null) from [] (ftrace_bug+0x1b1/0x234) +[] (ftrace_bug) from [] (ftrace_process_locs+0x285/0x3e8) +[] (ftrace_process_locs) from [] (load_module+0x11e9/0x1a44) +[] (load_module) from [] (SyS_finit_module+0x59/0x84) +[] (SyS_finit_module) from [] (ret_fast_syscall+0x1/0x18) +---[ end trace e1b64ced7a89adcd ]--- +ftrace failed to modify [] 0xe9ef7006 +actual: 02:f0:3b:fa +ftrace record flags: 0 +(0) expected tramp: c0314265 + +Signed-off-by: Alexander Sverdlin +Signed-off-by: Russell King +Signed-off-by: Florian Fainelli +Signed-off-by: Greg Kroah-Hartman +--- + arch/arm/include/asm/ftrace.h | 3 ++ + arch/arm/include/asm/module.h | 1 + arch/arm/kernel/ftrace.c | 45 +++++++++++++++++++++++++++++++++++------- + arch/arm/kernel/module-plts.c | 44 +++++++++++++++++++++++++++++++++++++---- + 4 files changed, 82 insertions(+), 11 deletions(-) + +--- a/arch/arm/include/asm/ftrace.h ++++ b/arch/arm/include/asm/ftrace.h +@@ -14,6 +14,9 @@ struct dyn_arch_ftrace { + #ifdef CONFIG_OLD_MCOUNT + bool old_mcount; + #endif ++#ifdef CONFIG_ARM_MODULE_PLTS ++ struct module *mod; ++#endif + }; + + static inline unsigned long ftrace_call_adjust(unsigned long addr) +--- a/arch/arm/include/asm/module.h ++++ b/arch/arm/include/asm/module.h +@@ -29,6 +29,7 @@ struct plt_entries { + + struct mod_plt_sec { + struct elf32_shdr *plt; ++ struct plt_entries *plt_ent; + int plt_count; + }; + +--- a/arch/arm/kernel/ftrace.c ++++ b/arch/arm/kernel/ftrace.c +@@ -95,9 +95,10 @@ int ftrace_arch_code_modify_post_process + return 0; + } + +-static unsigned long ftrace_call_replace(unsigned long pc, unsigned long addr) ++static unsigned long ftrace_call_replace(unsigned long pc, unsigned long addr, ++ bool warn) + { +- return arm_gen_branch_link(pc, addr, true); ++ return arm_gen_branch_link(pc, addr, warn); + } + + static int ftrace_modify_code(unsigned long pc, unsigned long old, +@@ -136,14 +137,14 @@ int ftrace_update_ftrace_func(ftrace_fun + int ret; + + pc = (unsigned long)&ftrace_call; +- new = ftrace_call_replace(pc, (unsigned long)func); ++ new = ftrace_call_replace(pc, (unsigned long)func, true); + + ret = ftrace_modify_code(pc, 0, new, false); + + #ifdef CONFIG_OLD_MCOUNT + if (!ret) { + pc = (unsigned long)&ftrace_call_old; +- new = ftrace_call_replace(pc, (unsigned long)func); ++ new = ftrace_call_replace(pc, (unsigned long)func, true); + + ret = ftrace_modify_code(pc, 0, new, false); + } +@@ -156,9 +157,21 @@ int ftrace_make_call(struct dyn_ftrace * + { + unsigned long new, old; + unsigned long ip = rec->ip; ++ unsigned long aaddr = adjust_address(rec, addr); ++ struct module *mod = NULL; ++ ++#ifdef CONFIG_ARM_MODULE_PLTS ++ mod = rec->arch.mod; ++#endif + + old = ftrace_nop_replace(rec); +- new = ftrace_call_replace(ip, adjust_address(rec, addr)); ++ new = ftrace_call_replace(ip, aaddr, !mod); ++#ifdef CONFIG_ARM_MODULE_PLTS ++ if (!new && mod) { ++ aaddr = get_module_plt(mod, ip, aaddr); ++ new = ftrace_call_replace(ip, aaddr, true); ++ } ++#endif + + return ftrace_modify_code(rec->ip, old, new, true); + } +@@ -166,12 +179,29 @@ int ftrace_make_call(struct dyn_ftrace * + int ftrace_make_nop(struct module *mod, + struct dyn_ftrace *rec, unsigned long addr) + { ++ unsigned long aaddr = adjust_address(rec, addr); + unsigned long ip = rec->ip; + unsigned long old; + unsigned long new; + int ret; + +- old = ftrace_call_replace(ip, adjust_address(rec, addr)); ++#ifdef CONFIG_ARM_MODULE_PLTS ++ /* mod is only supplied during module loading */ ++ if (!mod) ++ mod = rec->arch.mod; ++ else ++ rec->arch.mod = mod; ++#endif ++ ++ old = ftrace_call_replace(ip, aaddr, ++ !IS_ENABLED(CONFIG_ARM_MODULE_PLTS) || !mod); ++#ifdef CONFIG_ARM_MODULE_PLTS ++ if (!old && mod) { ++ aaddr = get_module_plt(mod, ip, aaddr); ++ old = ftrace_call_replace(ip, aaddr, true); ++ } ++#endif ++ + new = ftrace_nop_replace(rec); + ret = ftrace_modify_code(ip, old, new, true); + +@@ -179,7 +209,8 @@ int ftrace_make_nop(struct module *mod, + if (ret == -EINVAL && addr == MCOUNT_ADDR) { + rec->arch.old_mcount = true; + +- old = ftrace_call_replace(ip, adjust_address(rec, addr)); ++ old = ftrace_call_replace(ip, adjust_address(rec, addr), ++ !IS_ENABLED(CONFIG_ARM_MODULE_PLTS) || !mod); + new = ftrace_nop_replace(rec); + ret = ftrace_modify_code(ip, old, new, true); + } +--- a/arch/arm/kernel/module-plts.c ++++ b/arch/arm/kernel/module-plts.c +@@ -7,6 +7,7 @@ + */ + + #include ++#include + #include + #include + #include +@@ -22,19 +23,52 @@ + (PLT_ENT_STRIDE - 8)) + #endif + ++static const u32 fixed_plts[] = { ++#ifdef CONFIG_FUNCTION_TRACER ++ FTRACE_ADDR, ++ MCOUNT_ADDR, ++#endif ++}; ++ + static bool in_init(const struct module *mod, unsigned long loc) + { + return loc - (u32)mod->init_layout.base < mod->init_layout.size; + } + ++static void prealloc_fixed(struct mod_plt_sec *pltsec, struct plt_entries *plt) ++{ ++ int i; ++ ++ if (!ARRAY_SIZE(fixed_plts) || pltsec->plt_count) ++ return; ++ pltsec->plt_count = ARRAY_SIZE(fixed_plts); ++ ++ for (i = 0; i < ARRAY_SIZE(plt->ldr); ++i) ++ plt->ldr[i] = PLT_ENT_LDR; ++ ++ BUILD_BUG_ON(sizeof(fixed_plts) > sizeof(plt->lit)); ++ memcpy(plt->lit, fixed_plts, sizeof(fixed_plts)); ++} ++ + u32 get_module_plt(struct module *mod, unsigned long loc, Elf32_Addr val) + { + struct mod_plt_sec *pltsec = !in_init(mod, loc) ? &mod->arch.core : + &mod->arch.init; ++ struct plt_entries *plt; ++ int idx; ++ ++ /* cache the address, ELF header is available only during module load */ ++ if (!pltsec->plt_ent) ++ pltsec->plt_ent = (struct plt_entries *)pltsec->plt->sh_addr; ++ plt = pltsec->plt_ent; + +- struct plt_entries *plt = (struct plt_entries *)pltsec->plt->sh_addr; +- int idx = 0; ++ prealloc_fixed(pltsec, plt); ++ ++ for (idx = 0; idx < ARRAY_SIZE(fixed_plts); ++idx) ++ if (plt->lit[idx] == val) ++ return (u32)&plt->ldr[idx]; + ++ idx = 0; + /* + * Look for an existing entry pointing to 'val'. Given that the + * relocations are sorted, this will be the last entry we allocated. +@@ -182,8 +216,8 @@ static unsigned int count_plts(const Elf + int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs, + char *secstrings, struct module *mod) + { +- unsigned long core_plts = 0; +- unsigned long init_plts = 0; ++ unsigned long core_plts = ARRAY_SIZE(fixed_plts); ++ unsigned long init_plts = ARRAY_SIZE(fixed_plts); + Elf32_Shdr *s, *sechdrs_end = sechdrs + ehdr->e_shnum; + Elf32_Sym *syms = NULL; + +@@ -238,6 +272,7 @@ int module_frob_arch_sections(Elf_Ehdr * + mod->arch.core.plt->sh_size = round_up(core_plts * PLT_ENT_SIZE, + sizeof(struct plt_entries)); + mod->arch.core.plt_count = 0; ++ mod->arch.core.plt_ent = NULL; + + mod->arch.init.plt->sh_type = SHT_NOBITS; + mod->arch.init.plt->sh_flags = SHF_EXECINSTR | SHF_ALLOC; +@@ -245,6 +280,7 @@ int module_frob_arch_sections(Elf_Ehdr * + mod->arch.init.plt->sh_size = round_up(init_plts * PLT_ENT_SIZE, + sizeof(struct plt_entries)); + mod->arch.init.plt_count = 0; ++ mod->arch.init.plt_ent = NULL; + + pr_debug("%s: plt=%x, init.plt=%x\n", __func__, + mod->arch.core.plt->sh_size, mod->arch.init.plt->sh_size); diff --git a/queue-4.9/arm-9098-1-ftrace-module_plt-fix-build-problem-without-dynamic_ftrace.patch b/queue-4.9/arm-9098-1-ftrace-module_plt-fix-build-problem-without-dynamic_ftrace.patch new file mode 100644 index 00000000000..93989bfbe36 --- /dev/null +++ b/queue-4.9/arm-9098-1-ftrace-module_plt-fix-build-problem-without-dynamic_ftrace.patch @@ -0,0 +1,39 @@ +From foo@baz Mon Oct 4 01:07:23 PM CEST 2021 +From: Florian Fainelli +Date: Mon, 27 Sep 2021 14:03:16 -0700 +Subject: ARM: 9098/1: ftrace: MODULE_PLT: Fix build problem without DYNAMIC_FTRACE +To: linux-kernel@vger.kernel.org +Cc: stable@vger.kernel.org, Greg Kroah-Hartman , Sasha Levin , Alex Sverdlin , kernel test robot , Russell King , Florian Fainelli , Steven Rostedt , Ingo Molnar , Russell King , linux-arm-kernel@lists.infradead.org (moderated list:ARM PORT) +Message-ID: <20210927210316.3217044-5-f.fainelli@gmail.com> + +From: Alex Sverdlin + +commit 6fa630bf473827aee48cbf0efbbdf6f03134e890 upstream + +FTRACE_ADDR is only defined when CONFIG_DYNAMIC_FTRACE is defined, the +latter is even stronger requirement than CONFIG_FUNCTION_TRACER (which is +enough for MCOUNT_ADDR). + +Link: https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org/thread/ZUVCQBHDMFVR7CCB7JPESLJEWERZDJ3T/ + +Fixes: 1f12fb25c5c5d22f ("ARM: 9079/1: ftrace: Add MODULE_PLTS support") +Reported-by: kernel test robot +Signed-off-by: Alexander Sverdlin +Signed-off-by: Russell King +Signed-off-by: Florian Fainelli +Signed-off-by: Greg Kroah-Hartman +--- + arch/arm/kernel/module-plts.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/arch/arm/kernel/module-plts.c ++++ b/arch/arm/kernel/module-plts.c +@@ -24,7 +24,7 @@ + #endif + + static const u32 fixed_plts[] = { +-#ifdef CONFIG_FUNCTION_TRACER ++#ifdef CONFIG_DYNAMIC_FTRACE + FTRACE_ADDR, + MCOUNT_ADDR, + #endif diff --git a/queue-4.9/arm64-extend-workaround-for-erratum-1024718-to-all-versions-of-cortex-a55.patch b/queue-4.9/arm64-extend-workaround-for-erratum-1024718-to-all-versions-of-cortex-a55.patch new file mode 100644 index 00000000000..39ec2366700 --- /dev/null +++ b/queue-4.9/arm64-extend-workaround-for-erratum-1024718-to-all-versions-of-cortex-a55.patch @@ -0,0 +1,58 @@ +From c0b15c25d25171db4b70cc0b7dbc1130ee94017d Mon Sep 17 00:00:00 2001 +From: Suzuki K Poulose +Date: Wed, 3 Feb 2021 23:00:57 +0000 +Subject: arm64: Extend workaround for erratum 1024718 to all versions of Cortex-A55 + +From: Suzuki K Poulose + +commit c0b15c25d25171db4b70cc0b7dbc1130ee94017d upstream. + +The erratum 1024718 affects Cortex-A55 r0p0 to r2p0. However +we apply the work around for r0p0 - r1p0. Unfortunately this +won't be fixed for the future revisions for the CPU. Thus +extend the work around for all versions of A55, to cover +for r2p0 and any future revisions. + +Cc: stable@vger.kernel.org +Cc: Catalin Marinas +Cc: Will Deacon +Cc: James Morse +Cc: Kunihiko Hayashi +Signed-off-by: Suzuki K Poulose +Link: https://lore.kernel.org/r/20210203230057.3961239-1-suzuki.poulose@arm.com +[will: Update Kconfig help text] +Signed-off-by: Will Deacon +[Nanyon: adjust for stable version below v4.16, which set TCR_HD earlier +in assembly code] +Signed-off-by: Nanyong Sun +Signed-off-by: Greg Kroah-Hartman + +--- + arch/arm64/Kconfig | 2 +- + arch/arm64/mm/proc.S | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +--- a/arch/arm64/Kconfig ++++ b/arch/arm64/Kconfig +@@ -433,7 +433,7 @@ config ARM64_ERRATUM_1024718 + help + This option adds work around for Arm Cortex-A55 Erratum 1024718. + +- Affected Cortex-A55 cores (r0p0, r0p1, r1p0) could cause incorrect ++ Affected Cortex-A55 cores (all revisions) could cause incorrect + update of the hardware dirty bit when the DBM/AP bits are updated + without a break-before-make. The work around is to disable the usage + of hardware DBM locally on the affected cores. CPUs not affected by +--- a/arch/arm64/mm/proc.S ++++ b/arch/arm64/mm/proc.S +@@ -442,8 +442,8 @@ ENTRY(__cpu_setup) + cmp x9, #2 + b.lt 1f + #ifdef CONFIG_ARM64_ERRATUM_1024718 +- /* Disable hardware DBM on Cortex-A55 r0p0, r0p1 & r1p0 */ +- cpu_midr_match MIDR_CORTEX_A55, MIDR_CPU_VAR_REV(0, 0), MIDR_CPU_VAR_REV(1, 0), x1, x2, x3, x4 ++ /* Disable hardware DBM on Cortex-A55 all versions */ ++ cpu_midr_match MIDR_CORTEX_A55, MIDR_CPU_VAR_REV(0, 0), MIDR_CPU_VAR_REV(0xf, 0xf), x1, x2, x3, x4 + cbnz x1, 1f + #endif + orr x10, x10, #TCR_HD // hardware Dirty flag update diff --git a/queue-4.9/series b/queue-4.9/series index 69331de88f5..654536bbccf 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -46,3 +46,8 @@ ipack-ipoctal-fix-module-reference-leak.patch ext4-fix-potential-infinite-loop-in-ext4_dx_readdir.patch net-udp-annotate-data-race-around-udp_sk-sk-corkflag.patch edac-synopsys-fix-wrong-value-type-assignment-for-edac_mode.patch +arm-9077-1-plt-move-struct-plt_entries-definition-to-header.patch +arm-9078-1-add-warn-suppress-parameter-to-arm_gen_branch_link.patch +arm-9079-1-ftrace-add-module_plts-support.patch +arm-9098-1-ftrace-module_plt-fix-build-problem-without-dynamic_ftrace.patch +arm64-extend-workaround-for-erratum-1024718-to-all-versions-of-cortex-a55.patch