]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 1 Mar 2021 13:29:54 +0000 (14:29 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 1 Mar 2021 13:29:54 +0000 (14:29 +0100)
added patches:
gpio-pcf857x-fix-missing-first-interrupt.patch
module-ignore-_global_offset_table_-when-warning-for-undefined-symbols.patch

queue-4.4/gpio-pcf857x-fix-missing-first-interrupt.patch [new file with mode: 0644]
queue-4.4/module-ignore-_global_offset_table_-when-warning-for-undefined-symbols.patch [new file with mode: 0644]
queue-4.4/series

diff --git a/queue-4.4/gpio-pcf857x-fix-missing-first-interrupt.patch b/queue-4.4/gpio-pcf857x-fix-missing-first-interrupt.patch
new file mode 100644 (file)
index 0000000..0d4e87c
--- /dev/null
@@ -0,0 +1,45 @@
+From a8002a35935aaefcd6a42ad3289f62bab947f2ca Mon Sep 17 00:00:00 2001
+From: Maxim Kiselev <bigunclemax@gmail.com>
+Date: Wed, 17 Feb 2021 14:10:00 +0100
+Subject: gpio: pcf857x: Fix missing first interrupt
+
+From: Maxim Kiselev <bigunclemax@gmail.com>
+
+commit a8002a35935aaefcd6a42ad3289f62bab947f2ca upstream.
+
+If no n_latch value will be provided at driver probe then all pins will
+be used as an input:
+
+    gpio->out = ~n_latch;
+
+In that case initial state for all pins is "one":
+
+    gpio->status = gpio->out;
+
+So if pcf857x IRQ happens with change pin value from "zero" to "one"
+then we miss it, because of "one" from IRQ and "one" from initial state
+leaves corresponding pin unchanged:
+change = (gpio->status ^ status) & gpio->irq_enabled;
+
+The right solution will be to read actual state at driver probe.
+
+Cc: stable@vger.kernel.org
+Fixes: 6e20a0a429bd ("gpio: pcf857x: enable gpio_to_irq() support")
+Signed-off-by: Maxim Kiselev <bigunclemax@gmail.com>
+Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpio/gpio-pcf857x.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/gpio/gpio-pcf857x.c
++++ b/drivers/gpio/gpio-pcf857x.c
+@@ -370,7 +370,7 @@ static int pcf857x_probe(struct i2c_clie
+        * reset state.  Otherwise it flags pins to be driven low.
+        */
+       gpio->out = ~n_latch;
+-      gpio->status = gpio->out;
++      gpio->status = gpio->read(gpio->client);
+       status = gpiochip_add(&gpio->chip);
+       if (status < 0)
diff --git a/queue-4.4/module-ignore-_global_offset_table_-when-warning-for-undefined-symbols.patch b/queue-4.4/module-ignore-_global_offset_table_-when-warning-for-undefined-symbols.patch
new file mode 100644 (file)
index 0000000..636c21e
--- /dev/null
@@ -0,0 +1,80 @@
+From ebfac7b778fac8b0e8e92ec91d0b055f046b4604 Mon Sep 17 00:00:00 2001
+From: Fangrui Song <maskray@google.com>
+Date: Fri, 15 Jan 2021 11:52:22 -0800
+Subject: module: Ignore _GLOBAL_OFFSET_TABLE_ when warning for undefined symbols
+
+From: Fangrui Song <maskray@google.com>
+
+commit ebfac7b778fac8b0e8e92ec91d0b055f046b4604 upstream.
+
+clang-12 -fno-pic (since
+https://github.com/llvm/llvm-project/commit/a084c0388e2a59b9556f2de0083333232da3f1d6)
+can emit `call __stack_chk_fail@PLT` instead of `call __stack_chk_fail`
+on x86.  The two forms should have identical behaviors on x86-64 but the
+former causes GNU as<2.37 to produce an unreferenced undefined symbol
+_GLOBAL_OFFSET_TABLE_.
+
+(On x86-32, there is an R_386_PC32 vs R_386_PLT32 difference but the
+linker behavior is identical as far as Linux kernel is concerned.)
+
+Simply ignore _GLOBAL_OFFSET_TABLE_ for now, like what
+scripts/mod/modpost.c:ignore_undef_symbol does. This also fixes the
+problem for gcc/clang -fpie and -fpic, which may emit `call foo@PLT` for
+external function calls on x86.
+
+Note: ld -z defs and dynamic loaders do not error for unreferenced
+undefined symbols so the module loader is reading too much.  If we ever
+need to ignore more symbols, the code should be refactored to ignore
+unreferenced symbols.
+
+Cc: <stable@vger.kernel.org>
+Link: https://github.com/ClangBuiltLinux/linux/issues/1250
+Link: https://sourceware.org/bugzilla/show_bug.cgi?id=27178
+Reported-by: Marco Elver <elver@google.com>
+Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
+Reviewed-by: Nathan Chancellor <natechancellor@gmail.com>
+Tested-by: Marco Elver <elver@google.com>
+Signed-off-by: Fangrui Song <maskray@google.com>
+Signed-off-by: Jessica Yu <jeyu@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ kernel/module.c |   21 +++++++++++++++++++--
+ 1 file changed, 19 insertions(+), 2 deletions(-)
+
+--- a/kernel/module.c
++++ b/kernel/module.c
+@@ -2107,6 +2107,21 @@ static int verify_export_symbols(struct
+       return 0;
+ }
++static bool ignore_undef_symbol(Elf_Half emachine, const char *name)
++{
++      /*
++       * On x86, PIC code and Clang non-PIC code may have call foo@PLT. GNU as
++       * before 2.37 produces an unreferenced _GLOBAL_OFFSET_TABLE_ on x86-64.
++       * i386 has a similar problem but may not deserve a fix.
++       *
++       * If we ever have to ignore many symbols, consider refactoring the code to
++       * only warn if referenced by a relocation.
++       */
++      if (emachine == EM_386 || emachine == EM_X86_64)
++              return !strcmp(name, "_GLOBAL_OFFSET_TABLE_");
++      return false;
++}
++
+ /* Change all symbols so that st_value encodes the pointer directly. */
+ static int simplify_symbols(struct module *mod, const struct load_info *info)
+ {
+@@ -2148,8 +2163,10 @@ static int simplify_symbols(struct modul
+                               break;
+                       }
+-                      /* Ok if weak.  */
+-                      if (!ksym && ELF_ST_BIND(sym[i].st_info) == STB_WEAK)
++                      /* Ok if weak or ignored.  */
++                      if (!ksym &&
++                          (ELF_ST_BIND(sym[i].st_info) == STB_WEAK ||
++                           ignore_undef_symbol(info->hdr->e_machine, name)))
+                               break;
+                       pr_warn("%s: Unknown symbol %s (err %li)\n",
index 526e6ffe7451b8c9841d06339c7fadd0a263ba43..39efd2b0766fe58dd0ec11f68c4ca666ed3d4f88 100644 (file)
@@ -78,3 +78,5 @@ floppy-reintroduce-o_ndelay-fix.patch
 mm-hugetlb-fix-a-race-between-freeing-and-dissolving-the-page.patch
 usb-renesas_usbhs-clear-pipe-running-flag-in-usbhs_pkt_pop.patch
 libnvdimm-dimm-avoid-race-between-probe-and-available_slots_show.patch
+module-ignore-_global_offset_table_-when-warning-for-undefined-symbols.patch
+gpio-pcf857x-fix-missing-first-interrupt.patch