ARM: 8550/1: protect idiv patching against undefined gcc behavior
authorNicolas Pitre <nicolas.pitre@linaro.org>
Mon, 14 Mar 2016 01:55:45 +0000 (02:55 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 7 Apr 2016 20:57:02 +0000 (21:57 +0100)
commit208fae5c3b9431013ad7bcea07cbcee114e7d163
treeda2ce503a9f38d131a3157aa7ef3fdf5ab81b4a1
parentf2335a2a0a590c88e6cb68e4fb8cd835e81e827e
ARM: 8550/1: protect idiv patching against undefined gcc behavior

It was reported that a kernel with CONFIG_ARM_PATCH_IDIV=y stopped
booting when compiled with the upcoming gcc 6.  Turns out that turning
a function address into a writable array is undefined and gcc 6 decided
it was OK to omit the store to the first word of the function while
still preserving the store to the second word.

Even though gcc 6 is now fixed to behave more coherently, it is a
mystery that gcc 4 and gcc 5 actually produce wanted code in the kernel.
And in fact the reduced test case to illustrate the issue does indeed
break with gcc < 6 as well.

In any case, let's guard the kernel against undefined compiler behavior
by hiding the nature of the array location as suggested by gcc
developers.

Reference: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70128

Signed-off-by: Nicolas Pitre <nico@linaro.org>
Reported-by: Marcin Juszkiewicz <mjuszkiewicz@redhat.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: stable@vger.kernel.org # v4.5
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/kernel/setup.c