sh: Fix OF_SEPARATE support
authorMarek Vasut <marek.vasut+renesas@gmail.com>
Sun, 1 Sep 2019 16:05:03 +0000 (18:05 +0200)
committerMarek Vasut <marex@denx.de>
Mon, 2 Sep 2019 15:38:42 +0000 (17:38 +0200)
If the OF_SEPARATE is enabled, the DT is appended past the _end symbol.
The current code however clears BSS very early, which overwrites the DT
blob with zeroes. Moreover, the early code relocates U-Boot into RAM to
the correct location, but does not relocate the DT.

This patch adds code to relocate the DT and avoids clearing BSS too
early, thus addressing both problems with OF_SEPARATE on SH.

Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Cc: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
arch/sh/cpu/u-boot.lds
arch/sh/lib/start.S

index 7b225a6bd9a08f95da0dc1214aea27f78e74a1b6..47302da252a9311369d50b4d3df7b8f32edeb9f5 100644 (file)
@@ -75,6 +75,7 @@ SECTIONS
 
        PROVIDE (__init_end = .);
        PROVIDE (reloc_dst_end = .);
+       PROVIDE (_end = .);
 
        PROVIDE (bss_start = .);
        PROVIDE (__bss_start = .);
index f5350b90643c0bf13d7293e926df5d47a33788b0..f9f26d377981198a98dd3c49b02081b4b41ba95c 100644 (file)
@@ -22,6 +22,17 @@ _start:
        mov.l   ._reloc_dst, r4
        add     #(_start-1b), r5
        mov.l   ._reloc_dst_end, r6
+#ifdef CONFIG_OF_SEPARATE
+       mov.l   ._reloc_size, r0
+       add     r5, r0
+       add     #4, r0
+       mov.l   @r0, r0
+       swap.b  r0, r0
+       swap.w  r0, r0
+       swap.b  r0, r0
+       add     #4, r0
+       add     r0, r6
+#endif
 
 2:     mov.l   @r5+, r1
        mov.l   r1, @r4
@@ -29,6 +40,7 @@ _start:
        cmp/hs  r6, r4
        bf      2b
 
+#ifndef CONFIG_OF_SEPARATE
        mov.l   ._bss_start, r4
        mov.l   ._bss_end, r5
        mov     #0, r1
@@ -37,6 +49,7 @@ _start:
        add     #4, r4
        cmp/hs  r5, r4
        bf      3b
+#endif
 
        mov.l   ._gd_init, r13          /* global data */
        mov.l   ._stack_init, r15       /* stack */
@@ -53,6 +66,7 @@ loop:
 ._lowlevel_init:       .long   (lowlevel_init - (100b + 4))
 ._reloc_dst:           .long   _start
 ._reloc_dst_end:       .long   reloc_dst_end
+._reloc_size:          .long   (_end - _start)
 ._bss_start:           .long   bss_start
 ._bss_end:             .long   bss_end
 ._gd_init:             .long   (_start - GENERATED_GBL_DATA_SIZE)