On Fri, Mar 29, 2024 at 07:55:53PM -0500, Sam Protsenko wrote:

> When "memory" node is being processed in fdt_pack_reg() on ARM64
> platforms, an unaligned bus access might happen, which leads to
> "synchronous abort" CPU exception. Consider next dts example:
> 
>     / {
>         #address-cells = <2>;
>         #size-cells = <1>;
> 
>         memory@80000000 {
>             device_type = "memory";
>             reg = <0x0 0x80000000 0x3ab00000>,
>                   <0x0 0xc0000000 0x40000000>,
>                   <0x8 0x80000000 0x80000000>;
>         };
>     };
> 
> After fdt_pack_reg() reads the first addr/size entry from such memory
> node, the "p" pointer becomes 12 bytes shifted from its original value
> (8 bytes for two address cells + 4 bytes for one size cell). So now it's
> not 64-bit aligned, and an attempt to do 64-bit bus access to that
> address will cause an abort like this:
> 
>     "Synchronous Abort" handler, esr 0x96000021, far 0xba235efc
> 
> This issue was originally reported by David Virag [1] who observed it
> happening on Samsung Exynos7885 SoC (ARM64), and later the same issue
> was observed on Samsung Exynos850 (ARM64).
> 
> Fix the issue by using put_unaligned_be64() helper, which takes care of
> possible unaligned 64-bit accesses. That solution was proposed by Simon
> Glass in the original thread [1].
> 
> [1] https://lists.denx.de/pipermail/u-boot/2023-July/522074.html
> 
> Fixes: 739a01ed8e02 ("fdt_support: fix an endian bug of 
> fdt_fixup_memory_banks")
> Suggested-by: Simon Glass <s...@google.com>
> Reported-by: David Virag <virag.david...@gmail.com>
> Closes: https://lists.denx.de/pipermail/u-boot/2023-July/522074.html
> Signed-off-by: Sam Protsenko <semen.protse...@linaro.org>
> Reviewed-by: Heinrich Schuchardt <xypron.g...@gmx.de>

Applied to u-boot/master, thanks!

-- 
Tom

Attachment: signature.asc
Description: PGP signature

Reply via email to