mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-11-03 21:48:15 +00:00 
			
		
		
		
	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>
		
			
				
	
	
		
			75 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			75 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
 |