[PATCH] uboot-lantiq: danube: fix hanging lzma kernel uncompression

Hauke Mehrtens hauke at hauke-m.de
Sun Nov 7 15:23:28 PST 2021


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 <dev at 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 <dev at 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 <dev at 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



More information about the openwrt-devel mailing list