This implements the new option to clear BSS early in SPL for standard arm
crt0.

BSS is cleared before calling board_init_f() and thus not cleared before
calling board_init_r() as it is not relocated in SPL.

Signed-off-by: Simon Goldschmidt <simon.k.r.goldschm...@gmail.com>
---

 arch/arm/lib/crt0.S | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/arch/arm/lib/crt0.S b/arch/arm/lib/crt0.S
index fe312db690..b06e54e144 100644
--- a/arch/arm/lib/crt0.S
+++ b/arch/arm/lib/crt0.S
@@ -80,6 +80,26 @@ ENTRY(_main)
        mov     r9, r0
        bl      board_init_f_init_reserve
 
+#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_CLEAR_BSS_F)
+       ldr     r0, =__bss_start
+
+#ifdef CONFIG_USE_ARCH_MEMSET
+       ldr     r3, =__bss_end
+       mov     r1, #0x00000000         /* prepare zero to clear BSS */
+
+       subs    r2, r3, r0              /* r2 = memset len */
+       bl      memset
+#else
+       ldr     r1, =__bss_end
+       mov     r2, #0x00000000         /* prepare zero to clear BSS */
+
+clbss_l:cmp    r0, r1                  /* while not at end of BSS */
+       strlo   r2, [r0]                /* clear 32-bit BSS word */
+       addlo   r0, r0, #4              /* move to next */
+       blo     clbss_l
+#endif
+#endif
+
        mov     r0, #0
        bl      board_init_f
 
@@ -124,6 +144,7 @@ here:
        movne   sp, r0
        movne   r9, r0
 # endif
+#if !defined(CONFIG_SPL_BUILD) || !defined(CONFIG_SPL_CLEAR_BSS_F)
        ldr     r0, =__bss_start        /* this is auto-relocated! */
 
 #ifdef CONFIG_USE_ARCH_MEMSET
@@ -141,6 +162,7 @@ clbss_l:cmp r0, r1                  /* while not at end of 
BSS */
        addlo   r0, r0, #4              /* move to next */
        blo     clbss_l
 #endif
+#endif
 
 #if ! defined(CONFIG_SPL_BUILD)
        bl coloured_LED_init
-- 
2.17.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to