aboutsummaryrefslogtreecommitdiff
path: root/arch/sh
diff options
context:
space:
mode:
authorMarek Vasut2019-09-01 18:05:03 +0200
committerMarek Vasut2019-09-02 17:38:42 +0200
commitee3a4a708a36fec81126d86f6baabaf4e053ed22 (patch)
tree3486e385432ac1defb118413a5b0adc92c7c1584 /arch/sh
parent6756762024ccacf48e1419a02e0880f337a9030f (diff)
sh: Fix OF_SEPARATE support
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>
Diffstat (limited to 'arch/sh')
-rw-r--r--arch/sh/cpu/u-boot.lds1
-rw-r--r--arch/sh/lib/start.S14
2 files changed, 15 insertions, 0 deletions
diff --git a/arch/sh/cpu/u-boot.lds b/arch/sh/cpu/u-boot.lds
index 7b225a6bd9a..47302da252a 100644
--- a/arch/sh/cpu/u-boot.lds
+++ b/arch/sh/cpu/u-boot.lds
@@ -75,6 +75,7 @@ SECTIONS
PROVIDE (__init_end = .);
PROVIDE (reloc_dst_end = .);
+ PROVIDE (_end = .);
PROVIDE (bss_start = .);
PROVIDE (__bss_start = .);
diff --git a/arch/sh/lib/start.S b/arch/sh/lib/start.S
index f5350b90643..f9f26d37798 100644
--- a/arch/sh/lib/start.S
+++ b/arch/sh/lib/start.S
@@ -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)