]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
common/spl: use memmove() in load_simple_fit()
authorRasmus Villemoes <ravi@prevas.dk>
Tue, 19 Aug 2025 10:55:54 +0000 (12:55 +0200)
committerTom Rini <trini@konsulko.com>
Tue, 9 Sep 2025 16:35:59 +0000 (10:35 -0600)
I had trouble booting some am335x boards (both
beagleboneblack and a custom board). SPL would start just fine, and
apparently load U-Boot proper, but it would hang when jumping to
U-Boot.

While debugging, I stumbled on this memcpy() which from code
inspection very much looked to have overlapping src and dst, and
indeed a simple printf revealed

  calling memcpy(0x8087bf68, 0x8087bf80, 0xf7f8)

Now, it will always be with src > dst, our memcpy()
implementations "most likely" do forward-copying, and in the end it
turned out that this wasn't the culprit after all [*].

But to avoid me or others barking up the wrong tree in the future, and
because this use of memcpy() is technically undefined, use memmove()
instead.

[*] That was 358d1cc232c ("spl: Align FDT load address"), which has
since been fixed in master but not the v2025.07 I worked of by
52caad0d14a ("ARM: Align image end to 8 bytes to fit DT alignment").

Signed-off-by: Rasmus Villemoes <ravi@prevas.dk>
Reviewed-by: Heinrich Schuchardt <heinrich.schuchardt@gmx.de>
common/spl/spl_fit.c

index 25f3c822a498f14b551d76322670a17d2b4942c2..746c3d2fa28d1b196cadee4c44387f6d4188e563 100644 (file)
@@ -353,7 +353,7 @@ static int load_simple_fit(struct spl_load_info *info, ulong fit_offset,
                }
                length = loadEnd - CONFIG_SYS_LOAD_ADDR;
        } else {
-               memcpy(load_ptr, src, length);
+               memmove(load_ptr, src, length);
        }
 
        if (image_info) {