diff options
| author | Albert ARIBAUD <albert.u.boot@aribaud.net> | 2013-01-08 10:18:02 +0000 | 
|---|---|---|
| committer | Albert ARIBAUD <albert.u.boot@aribaud.net> | 2013-01-08 22:14:50 +0100 | 
| commit | e05e5de7fae5bec79617e113916dac6631251156 (patch) | |
| tree | c4d2bedca6e1ec79e30b229d2da6b979276456af /arch/arm/cpu/arm925t/start.S | |
| parent | 7528cf5f016b5b8b8b12b373f6f31a10bf89233d (diff) | |
| download | olio-uboot-2014.01-e05e5de7fae5bec79617e113916dac6631251156.tar.xz olio-uboot-2014.01-e05e5de7fae5bec79617e113916dac6631251156.zip | |
arm: move C runtime setup code in crt0.S
Move all the C runtime setup code from every start.S
in arch/arm into arch/arm/lib/crt0.S. This covers
the code sequence from setting up the initial stack
to calling into board_init_r().
Also, rewrite the C runtime setup and make functions
board_init_*() and relocate_code() behave according to
normal C semantics (no jumping across the C stack any
more, etc).
Some SPL targets had to be touched because they use
start.S explicitly or for some reason; the relevant
maintainers and custodians are cc:ed.
Signed-off-by: Albert ARIBAUD <albert.u.boot@aribaud.net>
Diffstat (limited to 'arch/arm/cpu/arm925t/start.S')
| -rw-r--r-- | arch/arm/cpu/arm925t/start.S | 61 | 
1 files changed, 8 insertions, 53 deletions
| diff --git a/arch/arm/cpu/arm925t/start.S b/arch/arm/cpu/arm925t/start.S index 3a483f6ca..82f5b8b59 100644 --- a/arch/arm/cpu/arm925t/start.S +++ b/arch/arm/cpu/arm925t/start.S @@ -176,12 +176,7 @@ poll1:  	bl  cpu_init_crit  #endif -/* Set stackpointer in internal RAM to call board_init_f */ -call_board_init_f: -	ldr	sp, =(CONFIG_SYS_INIT_SP_ADDR) -	bic	sp, sp, #7 /* 8-byte alignment for ABI compliance */ -	ldr	r0,=0x00000000 -	bl	board_init_f +	bl	_main  /*------------------------------------------------------------------------------*/ @@ -198,14 +193,10 @@ relocate_code:  	mov	r5, r1	/* save addr of gd */  	mov	r6, r2	/* save addr of destination */ -	/* Set up the stack						    */ -stack_setup: -	mov	sp, r4 -  	adr	r0, _start  	cmp	r0, r6  	moveq	r9, #0		/* no relocation. relocation offset(r9) = 0 */ -	beq	clear_bss		/* skip relocation */ +	beq	relocate_done		/* skip relocation */  	mov	r1, r6			/* r1 <- scratch for copy_loop */  	ldr	r3, _bss_start_ofs  	add	r2, r0, r3		/* r2 <- source end address	    */ @@ -257,51 +248,10 @@ fixnext:  	blo	fixloop  #endif -clear_bss: -#ifndef CONFIG_SPL_BUILD -	ldr	r0, _bss_start_ofs -	ldr	r1, _bss_end_ofs -	mov	r4, r6			/* reloc addr */ -	add	r0, r0, r4 -	add	r1, r1, r4 -	mov	r2, #0x00000000		/* clear			    */ - -clbss_l:cmp	r0, r1			/* clear loop... */ -	bhs	clbss_e			/* if reached end of bss, exit */ -	str	r2, [r0] -	add	r0, r0, #4 -	b	clbss_l -clbss_e: - -	bl coloured_LED_init -	bl red_led_on -#endif - -/* - * We are done. Do not return, instead branch to second part of board - * initialization, now running from RAM. - */ -#ifdef CONFIG_NAND_SPL -	ldr     r0, _nand_boot_ofs -	mov	pc, r0 +relocate_done: -_nand_boot_ofs: -	.word nand_boot -#else -	ldr	r0, _board_init_r_ofs -	adr	r1, _start -	add	lr, r0, r1 -	add	lr, lr, r9 -	/* setup parameters for board_init_r */ -	mov	r0, r5		/* gd_t */ -	mov	r1, r6		/* dest_addr */ -	/* jump to it ... */  	mov	pc, lr -_board_init_r_ofs: -	.word board_init_r - _start -#endif -  _rel_dyn_start_ofs:  	.word __rel_dyn_start - _start  _rel_dyn_end_ofs: @@ -309,6 +259,11 @@ _rel_dyn_end_ofs:  _dynsym_start_ofs:  	.word __dynsym_start - _start +	.globl	c_runtime_cpu_setup +c_runtime_cpu_setup: + +	mov	pc, lr +  /*   *************************************************************************   * |