linux/arch/arm/boot/compressed
Andre Przywara a92882a4d2 ARM: 9159/1: decompressor: Avoid UNPREDICTABLE NOP encoding
In the decompressor's head.S we need to start with an instruction that
is some kind of NOP, but also mimics as the PE/COFF header, when the
kernel is linked as an UEFI application. The clever solution here is
"tstne r0, #0x4d000", which in the worst case just clobbers the
condition flags, and bears the magic "MZ" signature in the lowest 16 bits.

However the encoding used (0x13105a4d) is actually not valid, since bits
[15:12] are supposed to be 0 (written as "(0)" in the ARM ARM).
Violating this is UNPREDICTABLE, and *can* trigger an UNDEFINED
exception. Common Cortex cores seem to ignore those bits, but QEMU
chooses to trap, so the code goes fishing because of a missing exception
handler at this point. We are just saved by the fact that commonly (with
-kernel or when running from U-Boot) the "Z" bit is set, so the
instruction is never executed. See [0] for more details.

To make things more robust and avoid UNPREDICTABLE behaviour in the
kernel code, lets replace this with a "two-instruction NOP":
The first instruction is an exclusive OR, the effect of which the second
instruction reverts. This does not leave any trace, neither in a
register nor in the condition flags. Also it's a perfectly valid
encoding. Kudos to Peter Maydell for coming up with this gem.

[0] https://lore.kernel.org/qemu-devel/YTPIdbUCmwagL5%2FD@os.inf.tu-dresden.de/T/

Link: https://lore.kernel.org/linux-arm-kernel/20210908162617.104962-1-andre.przywara@arm.com/T/

Fixes: 81a0bc39ea ("ARM: add UEFI stub support")
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reported-by: Adam Lackorzynski <adam@l4re.org>
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
2021-12-17 11:34:32 +00:00
..
.gitignore ARM: 9154/1: decompressor: do not copy source files while building 2021-12-17 11:34:30 +00:00
ashldi3.S ARM: 9154/1: decompressor: do not copy source files while building 2021-12-17 11:34:30 +00:00
atags_to_fdt.c ARM: 9083/1: uncompress: atags_to_fdt: Spelling s/REturn/Return/ 2021-06-07 12:56:21 +01:00
big-endian.S ARM: 8933/1: replace Sun/Solaris style flag on section directive 2019-11-15 22:21:19 +00:00
bswapsdi2.S ARM: 9154/1: decompressor: do not copy source files while building 2021-12-17 11:34:30 +00:00
debug.S ARM: 9005/1: debug: Select flow control for all debug UARTs 2020-09-15 14:35:28 +01:00
decompress.c ARM: 9134/1: remove duplicate memcpy() definition 2021-10-19 10:37:36 +01:00
efi-header.S ARM: 9159/1: decompressor: Avoid UNPREDICTABLE NOP encoding 2021-12-17 11:34:32 +00:00
fdt.c ARM: 8969/1: decompressor: simplify libfdt builds 2020-04-29 13:28:59 +01:00
fdt_check_mem_start.c ARM: 9124/1: uncompress: Parse "linux,usable-memory-range" DT property 2021-10-19 10:30:55 +01:00
fdt_ro.c ARM: 8969/1: decompressor: simplify libfdt builds 2020-04-29 13:28:59 +01:00
fdt_rw.c ARM: 8969/1: decompressor: simplify libfdt builds 2020-04-29 13:28:59 +01:00
fdt_wip.c ARM: 8969/1: decompressor: simplify libfdt builds 2020-04-29 13:28:59 +01:00
font.c ARM: 9154/1: decompressor: do not copy source files while building 2021-12-17 11:34:30 +00:00
head-sa1100.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
head-sharpsl.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
head-xscale.S License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
head.S ARM: 9159/1: decompressor: Avoid UNPREDICTABLE NOP encoding 2021-12-17 11:34:32 +00:00
hyp-stub.S ARM: 9154/1: decompressor: do not copy source files while building 2021-12-17 11:34:30 +00:00
lib1funcs.S ARM: 9154/1: decompressor: do not copy source files while building 2021-12-17 11:34:30 +00:00
ll_char_wr.S treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
Makefile ARM: 9154/1: decompressor: do not copy source files while building 2021-12-17 11:34:30 +00:00
misc.c Merge branch 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm 2018-04-09 09:19:30 -07:00
misc.h ARM: decompressor: fix warning introduced in fortify patch 2018-04-05 23:56:40 +01:00
piggy.S ARM: 8933/1: replace Sun/Solaris style flag on section directive 2019-11-15 22:21:19 +00:00
string.c lib/string: Move helper functions out of string.c 2021-09-25 08:20:49 -07:00
vmlinux.lds.S ARM development for 5.10-rc1: 2020-10-20 09:18:31 -07:00