From: Greg Kroah-Hartman Date: Mon, 4 Oct 2021 11:21:35 +0000 (+0200) Subject: 4.14-stable patches X-Git-Tag: v4.4.286~24 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c34513b68f921fe1dc1d46f1c9377e4e426457ac;p=thirdparty%2Fkernel%2Fstable-queue.git 4.14-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 hso-fix-bailout-in-error-case-of-probe.patch usb-hso-fix-error-handling-code-of-hso_create_net_device.patch usb-hso-remove-the-bailout-parameter.patch --- diff --git a/queue-4.14/arm-9077-1-plt-move-struct-plt_entries-definition-to-header.patch b/queue-4.14/arm-9077-1-plt-move-struct-plt_entries-definition-to-header.patch new file mode 100644 index 00000000000..5a3d09fa4fa --- /dev/null +++ b/queue-4.14/arm-9077-1-plt-move-struct-plt_entries-definition-to-header.patch @@ -0,0 +1,66 @@ +From foo@baz Mon Oct 4 01:06:28 PM CEST 2021 +From: Florian Fainelli +Date: Mon, 27 Sep 2021 14:02:56 -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: <20210927210259.3216965-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 +@@ -19,6 +19,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.14/arm-9078-1-add-warn-suppress-parameter-to-arm_gen_branch_link.patch b/queue-4.14/arm-9078-1-add-warn-suppress-parameter-to-arm_gen_branch_link.patch new file mode 100644 index 00000000000..30e55e23436 --- /dev/null +++ b/queue-4.14/arm-9078-1-add-warn-suppress-parameter-to-arm_gen_branch_link.patch @@ -0,0 +1,117 @@ +From foo@baz Mon Oct 4 01:06:28 PM CEST 2021 +From: Florian Fainelli +Date: Mon, 27 Sep 2021 14:02:57 -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: <20210927210259.3216965-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 +@@ -13,18 +13,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 +@@ -98,7 +98,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 +@@ -3,8 +3,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; +@@ -12,7 +13,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; + } + +@@ -33,8 +34,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; +@@ -44,7 +45,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; + } + +@@ -54,10 +55,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.14/arm-9079-1-ftrace-add-module_plts-support.patch b/queue-4.14/arm-9079-1-ftrace-add-module_plts-support.patch new file mode 100644 index 00000000000..300d82bba31 --- /dev/null +++ b/queue-4.14/arm-9079-1-ftrace-add-module_plts-support.patch @@ -0,0 +1,295 @@ +From foo@baz Mon Oct 4 01:06:28 PM CEST 2021 +From: Florian Fainelli +Date: Mon, 27 Sep 2021 14:02:58 -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: <20210927210259.3216965-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 + +[florian: resolved merge conflict with struct +dyn_arch_ftrace::old_mcount] + +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 | 50 +++++++++++++++++++++++++++++++++--------- + arch/arm/kernel/module-plts.c | 44 +++++++++++++++++++++++++++++++++--- + 4 files changed, 84 insertions(+), 14 deletions(-) + +--- a/arch/arm/include/asm/ftrace.h ++++ b/arch/arm/include/asm/ftrace.h +@@ -19,6 +19,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 +@@ -30,6 +30,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 +@@ -96,9 +96,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, +@@ -137,14 +138,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_DYNAMIC_FTRACE_WITH_REGS + if (!ret) { + pc = (unsigned long)&ftrace_regs_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); + } +@@ -153,7 +154,7 @@ int ftrace_update_ftrace_func(ftrace_fun + #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); + } +@@ -166,10 +167,22 @@ 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); + } +@@ -182,9 +195,9 @@ int ftrace_modify_call(struct dyn_ftrace + unsigned long new, old; + unsigned long ip = rec->ip; + +- old = ftrace_call_replace(ip, adjust_address(rec, old_addr)); ++ old = ftrace_call_replace(ip, adjust_address(rec, old_addr), true); + +- new = ftrace_call_replace(ip, adjust_address(rec, addr)); ++ new = ftrace_call_replace(ip, adjust_address(rec, addr), true); + + return ftrace_modify_code(rec->ip, old, new, true); + } +@@ -194,12 +207,29 @@ int ftrace_modify_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); + +@@ -207,7 +237,7 @@ 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), true); + 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.14/arm-9098-1-ftrace-module_plt-fix-build-problem-without-dynamic_ftrace.patch b/queue-4.14/arm-9098-1-ftrace-module_plt-fix-build-problem-without-dynamic_ftrace.patch new file mode 100644 index 00000000000..aba93ac836b --- /dev/null +++ b/queue-4.14/arm-9098-1-ftrace-module_plt-fix-build-problem-without-dynamic_ftrace.patch @@ -0,0 +1,39 @@ +From foo@baz Mon Oct 4 01:06:28 PM CEST 2021 +From: Florian Fainelli +Date: Mon, 27 Sep 2021 14:02:59 -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: <20210927210259.3216965-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.14/arm64-extend-workaround-for-erratum-1024718-to-all-versions-of-cortex-a55.patch b/queue-4.14/arm64-extend-workaround-for-erratum-1024718-to-all-versions-of-cortex-a55.patch new file mode 100644 index 00000000000..df2055c3c95 --- /dev/null +++ b/queue-4.14/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 +@@ -450,7 +450,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 +@@ -455,8 +455,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.14/hso-fix-bailout-in-error-case-of-probe.patch b/queue-4.14/hso-fix-bailout-in-error-case-of-probe.patch new file mode 100644 index 00000000000..71f505f60fe --- /dev/null +++ b/queue-4.14/hso-fix-bailout-in-error-case-of-probe.patch @@ -0,0 +1,61 @@ +From 5fcfb6d0bfcda17f0d0656e4e5b3710af2bbaae5 Mon Sep 17 00:00:00 2001 +From: Oliver Neukum +Date: Wed, 5 Aug 2020 14:07:07 +0200 +Subject: hso: fix bailout in error case of probe + +From: Oliver Neukum + +commit 5fcfb6d0bfcda17f0d0656e4e5b3710af2bbaae5 upstream. + +The driver tries to reuse code for disconnect in case +of a failed probe. +If resources need to be freed after an error in probe, the +netdev must not be freed because it has never been registered. +Fix it by telling the helper which path we are in. + +Signed-off-by: Oliver Neukum +Signed-off-by: David S. Miller +Signed-off-by: Ovidiu Panait +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/usb/hso.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/net/usb/hso.c ++++ b/drivers/net/usb/hso.c +@@ -2367,7 +2367,7 @@ static int remove_net_device(struct hso_ + } + + /* Frees our network device */ +-static void hso_free_net_device(struct hso_device *hso_dev) ++static void hso_free_net_device(struct hso_device *hso_dev, bool bailout) + { + int i; + struct hso_net *hso_net = dev2net(hso_dev); +@@ -2390,7 +2390,7 @@ static void hso_free_net_device(struct h + kfree(hso_net->mux_bulk_tx_buf); + hso_net->mux_bulk_tx_buf = NULL; + +- if (hso_net->net) ++ if (hso_net->net && !bailout) + free_netdev(hso_net->net); + + kfree(hso_dev); +@@ -2566,7 +2566,7 @@ static struct hso_device *hso_create_net + + return hso_dev; + exit: +- hso_free_net_device(hso_dev); ++ hso_free_net_device(hso_dev, true); + return NULL; + } + +@@ -3129,7 +3129,7 @@ static void hso_free_interface(struct us + rfkill_unregister(rfk); + rfkill_destroy(rfk); + } +- hso_free_net_device(network_table[i]); ++ hso_free_net_device(network_table[i], false); + } + } + } diff --git a/queue-4.14/series b/queue-4.14/series index a9c61e3345e..03afdb681cd 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -60,3 +60,11 @@ 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 +hso-fix-bailout-in-error-case-of-probe.patch +usb-hso-fix-error-handling-code-of-hso_create_net_device.patch +usb-hso-remove-the-bailout-parameter.patch diff --git a/queue-4.14/usb-hso-fix-error-handling-code-of-hso_create_net_device.patch b/queue-4.14/usb-hso-fix-error-handling-code-of-hso_create_net_device.patch new file mode 100644 index 00000000000..c47eb6af5db --- /dev/null +++ b/queue-4.14/usb-hso-fix-error-handling-code-of-hso_create_net_device.patch @@ -0,0 +1,111 @@ +From a6ecfb39ba9d7316057cea823b196b734f6b18ca Mon Sep 17 00:00:00 2001 +From: Dongliang Mu +Date: Wed, 14 Jul 2021 17:13:22 +0800 +Subject: usb: hso: fix error handling code of hso_create_net_device + +From: Dongliang Mu + +commit a6ecfb39ba9d7316057cea823b196b734f6b18ca upstream. + +The current error handling code of hso_create_net_device is +hso_free_net_device, no matter which errors lead to. For example, +WARNING in hso_free_net_device [1]. + +Fix this by refactoring the error handling code of +hso_create_net_device by handling different errors by different code. + +[1] https://syzkaller.appspot.com/bug?id=66eff8d49af1b28370ad342787413e35bbe76efe + +Reported-by: syzbot+44d53c7255bb1aea22d2@syzkaller.appspotmail.com +Fixes: 5fcfb6d0bfcd ("hso: fix bailout in error case of probe") +Signed-off-by: Dongliang Mu +Signed-off-by: David S. Miller +Signed-off-by: Ovidiu Panait +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/usb/hso.c | 33 +++++++++++++++++++++++---------- + 1 file changed, 23 insertions(+), 10 deletions(-) + +--- a/drivers/net/usb/hso.c ++++ b/drivers/net/usb/hso.c +@@ -2510,7 +2510,7 @@ static struct hso_device *hso_create_net + hso_net_init); + if (!net) { + dev_err(&interface->dev, "Unable to create ethernet device\n"); +- goto exit; ++ goto err_hso_dev; + } + + hso_net = netdev_priv(net); +@@ -2523,13 +2523,13 @@ static struct hso_device *hso_create_net + USB_DIR_IN); + if (!hso_net->in_endp) { + dev_err(&interface->dev, "Can't find BULK IN endpoint\n"); +- goto exit; ++ goto err_net; + } + hso_net->out_endp = hso_get_ep(interface, USB_ENDPOINT_XFER_BULK, + USB_DIR_OUT); + if (!hso_net->out_endp) { + dev_err(&interface->dev, "Can't find BULK OUT endpoint\n"); +- goto exit; ++ goto err_net; + } + SET_NETDEV_DEV(net, &interface->dev); + SET_NETDEV_DEVTYPE(net, &hso_type); +@@ -2538,18 +2538,18 @@ static struct hso_device *hso_create_net + for (i = 0; i < MUX_BULK_RX_BUF_COUNT; i++) { + hso_net->mux_bulk_rx_urb_pool[i] = usb_alloc_urb(0, GFP_KERNEL); + if (!hso_net->mux_bulk_rx_urb_pool[i]) +- goto exit; ++ goto err_mux_bulk_rx; + hso_net->mux_bulk_rx_buf_pool[i] = kzalloc(MUX_BULK_RX_BUF_SIZE, + GFP_KERNEL); + if (!hso_net->mux_bulk_rx_buf_pool[i]) +- goto exit; ++ goto err_mux_bulk_rx; + } + hso_net->mux_bulk_tx_urb = usb_alloc_urb(0, GFP_KERNEL); + if (!hso_net->mux_bulk_tx_urb) +- goto exit; ++ goto err_mux_bulk_rx; + hso_net->mux_bulk_tx_buf = kzalloc(MUX_BULK_TX_BUF_SIZE, GFP_KERNEL); + if (!hso_net->mux_bulk_tx_buf) +- goto exit; ++ goto err_free_tx_urb; + + add_net_device(hso_dev); + +@@ -2557,7 +2557,7 @@ static struct hso_device *hso_create_net + result = register_netdev(net); + if (result) { + dev_err(&interface->dev, "Failed to register device\n"); +- goto exit; ++ goto err_free_tx_buf; + } + + hso_log_port(hso_dev); +@@ -2565,8 +2565,21 @@ static struct hso_device *hso_create_net + hso_create_rfkill(hso_dev, interface); + + return hso_dev; +-exit: +- hso_free_net_device(hso_dev, true); ++ ++err_free_tx_buf: ++ remove_net_device(hso_dev); ++ kfree(hso_net->mux_bulk_tx_buf); ++err_free_tx_urb: ++ usb_free_urb(hso_net->mux_bulk_tx_urb); ++err_mux_bulk_rx: ++ for (i = 0; i < MUX_BULK_RX_BUF_COUNT; i++) { ++ usb_free_urb(hso_net->mux_bulk_rx_urb_pool[i]); ++ kfree(hso_net->mux_bulk_rx_buf_pool[i]); ++ } ++err_net: ++ free_netdev(net); ++err_hso_dev: ++ kfree(hso_dev); + return NULL; + } + diff --git a/queue-4.14/usb-hso-remove-the-bailout-parameter.patch b/queue-4.14/usb-hso-remove-the-bailout-parameter.patch new file mode 100644 index 00000000000..70e1f00cf42 --- /dev/null +++ b/queue-4.14/usb-hso-remove-the-bailout-parameter.patch @@ -0,0 +1,51 @@ +From dcb713d53e2eadf42b878c12a471e74dc6ed3145 Mon Sep 17 00:00:00 2001 +From: Dongliang Mu +Date: Wed, 21 Jul 2021 16:14:57 +0800 +Subject: usb: hso: remove the bailout parameter + +From: Dongliang Mu + +commit dcb713d53e2eadf42b878c12a471e74dc6ed3145 upstream. + +There are two invocation sites of hso_free_net_device. After +refactoring hso_create_net_device, this parameter is useless. +Remove the bailout in the hso_free_net_device and change the invocation +sites of this function. + +Signed-off-by: Dongliang Mu +Signed-off-by: David S. Miller +Signed-off-by: Ovidiu Panait +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/usb/hso.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/net/usb/hso.c ++++ b/drivers/net/usb/hso.c +@@ -2367,7 +2367,7 @@ static int remove_net_device(struct hso_ + } + + /* Frees our network device */ +-static void hso_free_net_device(struct hso_device *hso_dev, bool bailout) ++static void hso_free_net_device(struct hso_device *hso_dev) + { + int i; + struct hso_net *hso_net = dev2net(hso_dev); +@@ -2390,7 +2390,7 @@ static void hso_free_net_device(struct h + kfree(hso_net->mux_bulk_tx_buf); + hso_net->mux_bulk_tx_buf = NULL; + +- if (hso_net->net && !bailout) ++ if (hso_net->net) + free_netdev(hso_net->net); + + kfree(hso_dev); +@@ -3142,7 +3142,7 @@ static void hso_free_interface(struct us + rfkill_unregister(rfk); + rfkill_destroy(rfk); + } +- hso_free_net_device(network_table[i], false); ++ hso_free_net_device(network_table[i]); + } + } + }