WSL2-Linux-Kernel/drivers/mtd/chips
Linus Walleij d3c6a08c2b mtd: cfi_cmdset_0001: Byte swap OTP info
commit 565fe150624ee77dc63a735cc1b3bff5101f38a3 upstream.

Currently the offset into the device when looking for OTP
bits can go outside of the address of the MTD NOR devices,
and if that memory isn't readable, bad things happen
on the IXP4xx (added prints that illustrate the problem before
the crash):

cfi_intelext_otp_walk walk OTP on chip 0 start at reg_prot_offset 0x00000100
ixp4xx_copy_from copy from 0x00000100 to 0xc880dd78
cfi_intelext_otp_walk walk OTP on chip 0 start at reg_prot_offset 0x12000000
ixp4xx_copy_from copy from 0x12000000 to 0xc880dd78
8<--- cut here ---
Unable to handle kernel paging request at virtual address db000000
[db000000] *pgd=00000000
(...)

This happens in this case because the IXP4xx is big endian and
the 32- and 16-bit fields in the struct cfi_intelext_otpinfo are not
properly byteswapped. Compare to how the code in read_pri_intelext()
byteswaps the fields in struct cfi_pri_intelext.

Adding a small byte swapping loop for the OTP in read_pri_intelext()
and the crash goes away.

The problem went unnoticed for many years until I enabled
CONFIG_MTD_OTP on the IXP4xx as well, triggering the bug.

Cc: stable@vger.kernel.org
Reviewed-by: Nicolas Pitre <nico@fluxnic.net>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/linux-mtd/20231020-mtd-otp-byteswap-v4-1-0d132c06aa9d@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2023-11-28 16:56:31 +00:00
..
Kconfig mtd: fixup CFI on ixp4xx 2022-01-20 09:13:16 +01:00
Makefile
cfi_cmdset_0001.c mtd: cfi_cmdset_0001: Byte swap OTP info 2023-11-28 16:56:31 +00:00
cfi_cmdset_0002.c mtd: cfi_cmdset_0002: Use chip_ready() for write on S29GL064N 2022-06-09 10:23:25 +02:00
cfi_cmdset_0020.c mtd: cfi: Fix fall-through warnings for Clang 2021-03-11 12:17:39 +01:00
cfi_probe.c mtd: cfi: Add early fixup for S70GL02GS 2018-05-04 09:52:38 +02:00
cfi_util.c mtd: cfi_util: Fix unreachable code issue 2021-07-12 11:15:28 -05:00
chipreg.c mtd: Convert list_for_each to entry variant 2021-06-11 21:05:06 +02:00
fwh_lock.h
gen_probe.c mtd: chips: gen_probe: kill useless initializer in mtd_do_chip_probe() 2019-08-27 17:08:18 +05:30
jedec_probe.c MTD changes: 2018-04-06 12:15:41 -07:00
map_absent.c treewide: Add SPDX license identifier for more missed files 2019-05-21 10:50:45 +02:00
map_ram.c mtd: Stop updating erase_info->state and calling mtd_erase_callback() 2018-03-21 09:50:56 +01:00
map_rom.c mtd: remove the get_unmapped_area method 2017-11-13 21:39:18 +01:00