]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
arm64: Properly clear BSS
authorIlias Apalodimas <ilias.apalodimas@linaro.org>
Tue, 2 Sep 2025 06:08:12 +0000 (09:08 +0300)
committerTom Rini <trini@konsulko.com>
Tue, 9 Sep 2025 18:43:26 +0000 (12:43 -0600)
Brock reports a breakage on an RK3568 SoC. His patch is
correct but he never followed up on the requested changes.

We currently use ldr to calculate the address of __bss_start and
__bss_end. However the absolute addresses of the literal pool are never
relocated and we end up clearing the wrong memory section. Use
PC-relative addressing instead.

Link: https://lore.kernel.org/u-boot/zfknlzcemnnaka5w2er5wjwefwoidrpndc4gjhx6d5xr6nlcjr@pasfayjiutii/
Suggested-by: brock_zheng <yzheng@techyauld.com>
Reported-by: brock_zheng <yzheng@techyauld.com>
Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
arch/arm/lib/crt0_64.S

index f3f279f2c39cd27cc30801805999092d582cef52..3e7627aa389bd580859d4bf9bce6103b97ce6b98 100644 (file)
@@ -158,8 +158,10 @@ relocation_return:
 /*
  * Clear BSS section
  */
-       ldr     x0, =__bss_start                /* this is auto-relocated! */
-       ldr     x1, =__bss_end                  /* this is auto-relocated! */
+       adrp    x0, __bss_start
+       add     x0, x0, #:lo12:__bss_start
+       adrp    x1, __bss_end
+       add     x1, x1, #:lo12:__bss_end
 clear_loop:
        str     xzr, [x0], #8
        cmp     x0, x1