On 11/3/21 12:10 AM, Mathias Kresin wrote:
11/2/21 11:52 PM, Hauke Mehrtens:
On 11/2/21 11:35 PM, Mathias Kresin wrote:
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);

Please add a small comment on top of this line in case someone applies these patches to a git tree and looks only at this code.

Sorry, I don't get it. Why should such a comment be required?

0030-lzma-fix-unaligned-access.patch can be applied to an u-boot git repository as it is using "git am". It has a proper commit text which describes the change as well.

Hi Mathias,

Could you pleae add a short comment into the code before:
dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)(data+1)[0] << 24);

Hauke

_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to