At least since gcc 7.3.0 (OpenWrt 18.06) lwr/lwl are used in the assembly of LzmaProps_Decode. The instructions are using unaligned access, which locks up danube boards using memory mapped NOR flash.
It isn't clear whether it is a limitation of the flash chip or a limitation of the EBU. Moving the pointer to the next int position and accessing accessing just the first byte, let gcc use sll instead of lwr/lwl and prevents the unaligned access. Signed-off-by: Mathias Kresin <d...@kresin.me> --- .../0030-lzma-fix-unaligned-access.patch | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 package/boot/uboot-lantiq/patches/0030-lzma-fix-unaligned-access.patch diff --git a/package/boot/uboot-lantiq/patches/0030-lzma-fix-unaligned-access.patch b/package/boot/uboot-lantiq/patches/0030-lzma-fix-unaligned-access.patch new file mode 100644 index 0000000000..de9afe0bf5 --- /dev/null +++ b/package/boot/uboot-lantiq/patches/0030-lzma-fix-unaligned-access.patch @@ -0,0 +1,32 @@ +From a335c4c0532cf0d09b31e73f8461d3b4d0ce6f9a Mon Sep 17 00:00:00 2001 +From: Mathias Kresin <d...@kresin.me> +Date: Sun, 31 Oct 2021 23:04:54 +0100 +Subject: [PATCH] lzma: fix unaligned access + +At least since gcc 7.3.0 (OpenWrt 18.06) lwr/lwl are used in the +assembly of LzmaProps_Decode. The instructions are using unaligned +access, which locks up danube boards using memory mapped NOR flash. + +It isn't clear whether it is a limitation of the flash chip or a +limitation of the EBU. + +Moving the pointer to the next int position and accessing accessing just +the first byte, let gcc use sll instead of lwr/lwl and prevents the +unaligned access. + +Signed-off-by: Mathias Kresin <d...@kresin.me> +--- + lib/lzma/LzmaDec.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/lib/lzma/LzmaDec.c ++++ b/lib/lzma/LzmaDec.c +@@ -929,7 +929,7 @@ SRes LzmaProps_Decode(CLzmaProps *p, con + if (size < LZMA_PROPS_SIZE) + return SZ_ERROR_UNSUPPORTED; + else +- dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24); ++ dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)(data+1)[0] << 24); + + if (dicSize < LZMA_DIC_MIN) + dicSize = LZMA_DIC_MIN; -- 2.25.1 _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel