]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.14-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 4 Oct 2021 11:21:35 +0000 (13:21 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 4 Oct 2021 11:21:35 +0000 (13:21 +0200)
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

queue-4.14/arm-9077-1-plt-move-struct-plt_entries-definition-to-header.patch [new file with mode: 0644]
queue-4.14/arm-9078-1-add-warn-suppress-parameter-to-arm_gen_branch_link.patch [new file with mode: 0644]
queue-4.14/arm-9079-1-ftrace-add-module_plts-support.patch [new file with mode: 0644]
queue-4.14/arm-9098-1-ftrace-module_plt-fix-build-problem-without-dynamic_ftrace.patch [new file with mode: 0644]
queue-4.14/arm64-extend-workaround-for-erratum-1024718-to-all-versions-of-cortex-a55.patch [new file with mode: 0644]
queue-4.14/hso-fix-bailout-in-error-case-of-probe.patch [new file with mode: 0644]
queue-4.14/series
queue-4.14/usb-hso-fix-error-handling-code-of-hso_create_net_device.patch [new file with mode: 0644]
queue-4.14/usb-hso-remove-the-bailout-parameter.patch [new file with mode: 0644]

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 (file)
index 0000000..5a3d09f
--- /dev/null
@@ -0,0 +1,66 @@
+From foo@baz Mon Oct  4 01:06:28 PM CEST 2021
+From: Florian Fainelli <f.fainelli@gmail.com>
+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 <gregkh@linuxfoundation.org>, Sasha Levin <sashal@kernel.org>, Alex Sverdlin <alexander.sverdlin@nokia.com>, Russell King <rmk+kernel@armlinux.org.uk>, Florian Fainelli <f.fainelli@gmail.com>, Steven Rostedt <rostedt@goodmis.org>, Ingo Molnar <mingo@redhat.com>, Russell King <linux@armlinux.org.uk>, linux-arm-kernel@lists.infradead.org (moderated list:ARM PORT)
+Message-ID: <20210927210259.3216965-2-f.fainelli@gmail.com>
+
+From: Alex Sverdlin <alexander.sverdlin@nokia.com>
+
+commit 4e271701c17dee70c6e1351c4d7d42e70405c6a9 upstream
+
+No functional change, later it will be re-used in several files.
+
+Signed-off-by: Alexander Sverdlin <alexander.sverdlin@nokia.com>
+Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 <asm/cache.h>
+ #include <asm/opcodes.h>
+-#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 (file)
index 0000000..30e55e2
--- /dev/null
@@ -0,0 +1,117 @@
+From foo@baz Mon Oct  4 01:06:28 PM CEST 2021
+From: Florian Fainelli <f.fainelli@gmail.com>
+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 <gregkh@linuxfoundation.org>, Sasha Levin <sashal@kernel.org>, Alex Sverdlin <alexander.sverdlin@nokia.com>, Russell King <rmk+kernel@armlinux.org.uk>, Florian Fainelli <f.fainelli@gmail.com>, Steven Rostedt <rostedt@goodmis.org>, Ingo Molnar <mingo@redhat.com>, Russell King <linux@armlinux.org.uk>, linux-arm-kernel@lists.infradead.org (moderated list:ARM PORT)
+Message-ID: <20210927210259.3216965-3-f.fainelli@gmail.com>
+
+From: Alex Sverdlin <alexander.sverdlin@nokia.com>
+
+commit 890cb057a46d323fd8c77ebecb6485476614cd21 upstream
+
+Will be used in the following patch. No functional change.
+
+Signed-off-by: Alexander Sverdlin <alexander.sverdlin@nokia.com>
+Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 <linux/kernel.h>
+ #include <asm/opcodes.h>
+-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 (file)
index 0000000..300d82b
--- /dev/null
@@ -0,0 +1,295 @@
+From foo@baz Mon Oct  4 01:06:28 PM CEST 2021
+From: Florian Fainelli <f.fainelli@gmail.com>
+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 <gregkh@linuxfoundation.org>, Sasha Levin <sashal@kernel.org>, Alex Sverdlin <alexander.sverdlin@nokia.com>, Russell King <rmk+kernel@armlinux.org.uk>, Florian Fainelli <f.fainelli@gmail.com>, Steven Rostedt <rostedt@goodmis.org>, Ingo Molnar <mingo@redhat.com>, Russell King <linux@armlinux.org.uk>, linux-arm-kernel@lists.infradead.org (moderated list:ARM PORT)
+Message-ID: <20210927210259.3216965-4-f.fainelli@gmail.com>
+
+From: Alex Sverdlin <alexander.sverdlin@nokia.com>
+
+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
+[<c0314a49>] (unwind_backtrace) from [<c03115e9>] (show_stack+0x11/0x14)
+[<c03115e9>] (show_stack) from [<c0519f51>] (dump_stack+0x81/0xa8)
+[<c0519f51>] (dump_stack) from [<c032185d>] (warn_slowpath_common+0x69/0x90)
+[<c032185d>] (warn_slowpath_common) from [<c03218f3>] (warn_slowpath_null+0x17/0x1c)
+[<c03218f3>] (warn_slowpath_null) from [<c03143cf>] (__arm_gen_branch+0x83/0x8c)
+[<c03143cf>] (__arm_gen_branch) from [<c0314337>] (ftrace_make_nop+0xf/0x24)
+[<c0314337>] (ftrace_make_nop) from [<c038ebcb>] (ftrace_process_locs+0x27b/0x3e8)
+[<c038ebcb>] (ftrace_process_locs) from [<c0378d79>] (load_module+0x11e9/0x1a44)
+[<c0378d79>] (load_module) from [<c037974d>] (SyS_finit_module+0x59/0x84)
+[<c037974d>] (SyS_finit_module) from [<c030e981>] (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
+[<c0314a49>] (unwind_backtrace) from [<c03115e9>] (show_stack+0x11/0x14)
+[<c03115e9>] (show_stack) from [<c0519f51>] (dump_stack+0x81/0xa8)
+[<c0519f51>] (dump_stack) from [<c032185d>] (warn_slowpath_common+0x69/0x90)
+[<c032185d>] (warn_slowpath_common) from [<c03218f3>] (warn_slowpath_null+0x17/0x1c)
+[<c03218f3>] (warn_slowpath_null) from [<c038e87d>] (ftrace_bug+0x1b1/0x234)
+[<c038e87d>] (ftrace_bug) from [<c038ebd5>] (ftrace_process_locs+0x285/0x3e8)
+[<c038ebd5>] (ftrace_process_locs) from [<c0378d79>] (load_module+0x11e9/0x1a44)
+[<c0378d79>] (load_module) from [<c037974d>] (SyS_finit_module+0x59/0x84)
+[<c037974d>] (SyS_finit_module) from [<c030e981>] (ret_fast_syscall+0x1/0x18)
+---[ end trace e1b64ced7a89adcd ]---
+ftrace failed to modify [<e9ef7006>] 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 <alexander.sverdlin@nokia.com>
+Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 <linux/elf.h>
++#include <linux/ftrace.h>
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+ #include <linux/sort.h>
+@@ -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 (file)
index 0000000..aba93ac
--- /dev/null
@@ -0,0 +1,39 @@
+From foo@baz Mon Oct  4 01:06:28 PM CEST 2021
+From: Florian Fainelli <f.fainelli@gmail.com>
+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 <gregkh@linuxfoundation.org>, Sasha Levin <sashal@kernel.org>, Alex Sverdlin <alexander.sverdlin@nokia.com>, kernel test robot <lkp@intel.com>, Russell King <rmk+kernel@armlinux.org.uk>, Florian Fainelli <f.fainelli@gmail.com>, Steven Rostedt <rostedt@goodmis.org>, Ingo Molnar <mingo@redhat.com>, Russell King <linux@armlinux.org.uk>, linux-arm-kernel@lists.infradead.org (moderated list:ARM PORT)
+Message-ID: <20210927210259.3216965-5-f.fainelli@gmail.com>
+
+From: Alex Sverdlin <alexander.sverdlin@nokia.com>
+
+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 <lkp@intel.com>
+Signed-off-by: Alexander Sverdlin <alexander.sverdlin@nokia.com>
+Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..df2055c
--- /dev/null
@@ -0,0 +1,58 @@
+From c0b15c25d25171db4b70cc0b7dbc1130ee94017d Mon Sep 17 00:00:00 2001
+From: Suzuki K Poulose <suzuki.poulose@arm.com>
+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 <suzuki.poulose@arm.com>
+
+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 <catalin.marinas@arm.com>
+Cc: Will Deacon <will@kernel.org>
+Cc: James Morse <james.morse@arm.com>
+Cc: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
+Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
+Link: https://lore.kernel.org/r/20210203230057.3961239-1-suzuki.poulose@arm.com
+[will: Update Kconfig help text]
+Signed-off-by: Will Deacon <will@kernel.org>
+[Nanyon: adjust for stable version below v4.16, which set TCR_HD earlier
+in assembly code]
+Signed-off-by: Nanyong Sun <sunnanyong@huawei.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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 (file)
index 0000000..71f505f
--- /dev/null
@@ -0,0 +1,61 @@
+From 5fcfb6d0bfcda17f0d0656e4e5b3710af2bbaae5 Mon Sep 17 00:00:00 2001
+From: Oliver Neukum <oneukum@suse.com>
+Date: Wed, 5 Aug 2020 14:07:07 +0200
+Subject: hso: fix bailout in error case of probe
+
+From: Oliver Neukum <oneukum@suse.com>
+
+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 <oneukum@suse.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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);
+               }
+       }
+ }
index a9c61e3345eff72b0e8149814c337c4a5b681666..03afdb681cdc312c7a4363b9edfda9ed89adf030 100644 (file)
@@ -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 (file)
index 0000000..c47eb6a
--- /dev/null
@@ -0,0 +1,111 @@
+From a6ecfb39ba9d7316057cea823b196b734f6b18ca Mon Sep 17 00:00:00 2001
+From: Dongliang Mu <mudongliangabcd@gmail.com>
+Date: Wed, 14 Jul 2021 17:13:22 +0800
+Subject: usb: hso: fix error handling code of hso_create_net_device
+
+From: Dongliang Mu <mudongliangabcd@gmail.com>
+
+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 <mudongliangabcd@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..70e1f00
--- /dev/null
@@ -0,0 +1,51 @@
+From dcb713d53e2eadf42b878c12a471e74dc6ed3145 Mon Sep 17 00:00:00 2001
+From: Dongliang Mu <mudongliangabcd@gmail.com>
+Date: Wed, 21 Jul 2021 16:14:57 +0800
+Subject: usb: hso: remove the bailout parameter
+
+From: Dongliang Mu <mudongliangabcd@gmail.com>
+
+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 <mudongliangabcd@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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]);
+               }
+       }
+ }