mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-30 16:39:35 +00:00
ee3a4a708a
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>
74 lines
1.3 KiB
ArmAsm
74 lines
1.3 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0+ */
|
|
/*
|
|
* Copyright (C) 2016 Vladimir Zapolskiy <vz@mleia.com>
|
|
* Copyright (C) 2007, 2010 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
|
|
*/
|
|
|
|
#include <asm-offsets.h>
|
|
#include <config.h>
|
|
|
|
.text
|
|
.align 2
|
|
|
|
.global _start
|
|
_start:
|
|
mov.l ._lowlevel_init, r0
|
|
100: bsrf r0
|
|
nop
|
|
|
|
bsr 1f
|
|
nop
|
|
1: sts pr, r5
|
|
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
|
|
add #4, r4
|
|
cmp/hs r6, r4
|
|
bf 2b
|
|
|
|
#ifndef CONFIG_OF_SEPARATE
|
|
mov.l ._bss_start, r4
|
|
mov.l ._bss_end, r5
|
|
mov #0, r1
|
|
|
|
3: mov.l r1, @r4 /* bss clear */
|
|
add #4, r4
|
|
cmp/hs r5, r4
|
|
bf 3b
|
|
#endif
|
|
|
|
mov.l ._gd_init, r13 /* global data */
|
|
mov.l ._stack_init, r15 /* stack */
|
|
|
|
mov.l ._sh_generic_init, r0
|
|
jsr @r0
|
|
mov #0, r4
|
|
|
|
loop:
|
|
bra loop
|
|
|
|
.align 2
|
|
|
|
._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)
|
|
._stack_init: .long (_start - GENERATED_GBL_DATA_SIZE - CONFIG_SYS_MALLOC_LEN - 16)
|
|
._sh_generic_init: .long board_init_f
|