]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 4 Jan 2021 12:37:30 +0000 (13:37 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 4 Jan 2021 12:37:30 +0000 (13:37 +0100)
added patches:
of-fix-linker-section-match-table-corruption.patch

queue-4.4/of-fix-linker-section-match-table-corruption.patch [new file with mode: 0644]
queue-4.4/series

diff --git a/queue-4.4/of-fix-linker-section-match-table-corruption.patch b/queue-4.4/of-fix-linker-section-match-table-corruption.patch
new file mode 100644 (file)
index 0000000..8726928
--- /dev/null
@@ -0,0 +1,66 @@
+From 5812b32e01c6d86ba7a84110702b46d8a8531fe9 Mon Sep 17 00:00:00 2001
+From: Johan Hovold <johan@kernel.org>
+Date: Mon, 23 Nov 2020 11:23:12 +0100
+Subject: of: fix linker-section match-table corruption
+
+From: Johan Hovold <johan@kernel.org>
+
+commit 5812b32e01c6d86ba7a84110702b46d8a8531fe9 upstream.
+
+Specify type alignment when declaring linker-section match-table entries
+to prevent gcc from increasing alignment and corrupting the various
+tables with padding (e.g. timers, irqchips, clocks, reserved memory).
+
+This is specifically needed on x86 where gcc (typically) aligns larger
+objects like struct of_device_id with static extent on 32-byte
+boundaries which at best prevents matching on anything but the first
+entry. Specifying alignment when declaring variables suppresses this
+optimisation.
+
+Here's a 64-bit example where all entries are corrupt as 16 bytes of
+padding has been inserted before the first entry:
+
+       ffffffff8266b4b0 D __clk_of_table
+       ffffffff8266b4c0 d __of_table_fixed_factor_clk
+       ffffffff8266b5a0 d __of_table_fixed_clk
+       ffffffff8266b680 d __clk_of_table_sentinel
+
+And here's a 32-bit example where the 8-byte-aligned table happens to be
+placed on a 32-byte boundary so that all but the first entry are corrupt
+due to the 28 bytes of padding inserted between entries:
+
+       812b3ec0 D __irqchip_of_table
+       812b3ec0 d __of_table_irqchip1
+       812b3fa0 d __of_table_irqchip2
+       812b4080 d __of_table_irqchip3
+       812b4160 d irqchip_of_match_end
+
+Verified on x86 using gcc-9.3 and gcc-4.9 (which uses 64-byte
+alignment), and on arm using gcc-7.2.
+
+Note that there are no in-tree users of these tables on x86 currently
+(even if they are included in the image).
+
+Fixes: 54196ccbe0ba ("of: consolidate linker section OF match table declarations")
+Fixes: f6e916b82022 ("irqchip: add basic infrastructure")
+Cc: stable <stable@vger.kernel.org>     # 3.9
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Link: https://lore.kernel.org/r/20201123102319.8090-2-johan@kernel.org
+[ johan: adjust context to 5.4 ]
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ include/linux/of.h |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/include/linux/of.h
++++ b/include/linux/of.h
+@@ -941,6 +941,7 @@ static inline int of_get_available_child
+ #define _OF_DECLARE(table, name, compat, fn, fn_type)                 \
+       static const struct of_device_id __of_table_##name              \
+               __used __section(__##table##_of_table)                  \
++              __aligned(__alignof__(struct of_device_id))             \
+                = { .compatible = compat,                              \
+                    .data = (fn == (fn_type)NULL) ? fn : fn  }
+ #else
index 02c8d84d238aea7b6754008de90443823f646ef8..a54ca5b8ccc5ce3145c1790111b3060e81e4fa72 100644 (file)
@@ -9,3 +9,4 @@ s390-smp-perform-initial-cpu-reset-also-for-smt-sibl.patch
 s390-dasd-fix-hanging-device-offline-processing.patch
 usb-serial-digi_acceleport-fix-write-wakeup-deadlock.patch
 uapi-move-constants-from-linux-kernel.h-to-linux-const.h.patch
+of-fix-linker-section-match-table-corruption.patch