diff options
Diffstat (limited to 'arch/arm/cpu/pxa/start.S')
| -rw-r--r-- | arch/arm/cpu/pxa/start.S | 31 | 
1 files changed, 15 insertions, 16 deletions
| diff --git a/arch/arm/cpu/pxa/start.S b/arch/arm/cpu/pxa/start.S index e71803eb2..ada91a66c 100644 --- a/arch/arm/cpu/pxa/start.S +++ b/arch/arm/cpu/pxa/start.S @@ -102,7 +102,7 @@ _end_vect:  .globl _TEXT_BASE  _TEXT_BASE: -#ifdef	CONFIG_SPL_BUILD +#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_TEXT_BASE)  	.word	CONFIG_SPL_TEXT_BASE  #else  	.word	CONFIG_SYS_TEXT_BASE @@ -118,9 +118,13 @@ _TEXT_BASE:  _bss_start_ofs:  	.word __bss_start - _start +.globl _image_copy_end_ofs +_image_copy_end_ofs: +	.word __image_copy_end - _start +  .globl _bss_end_ofs  _bss_end_ofs: -	.word __bss_end__ - _start +	.word __bss_end - _start  .globl _end_ofs  _end_ofs: @@ -169,17 +173,13 @@ reset:  /*------------------------------------------------------------------------------*/  #ifndef CONFIG_SPL_BUILD  /* - * void relocate_code (addr_sp, gd, addr_moni) - * - * This "function" does not return, instead it continues in RAM - * after relocating the monitor code. + * void relocate_code(addr_moni)   * + * This function relocates the monitor code.   */  	.globl	relocate_code  relocate_code: -	mov	r4, r0	/* save addr_sp */ -	mov	r5, r1	/* save addr of gd */ -	mov	r6, r2	/* save addr of destination */ +	mov	r6, r0	/* save addr of destination */  /* Disable the Dcache RAM lock for stack now */  #ifdef	CONFIG_CPU_PXA25X @@ -189,16 +189,15 @@ relocate_code:  #endif  	adr	r0, _start -	cmp	r0, r6 -	moveq	r9, #0		/* no relocation. relocation offset(r9) = 0 */ +	subs	r9, r6, r0		/* r9 <- relocation offset */  	beq	relocate_done		/* skip relocation */  	mov	r1, r6			/* r1 <- scratch for copy_loop */ -	ldr	r3, _bss_start_ofs +	ldr	r3, _image_copy_end_ofs  	add	r2, r0, r3		/* r2 <- source end address	    */  copy_loop: -	ldmia	r0!, {r9-r10}		/* copy from source address [r0]    */ -	stmia	r1!, {r9-r10}		/* copy to   target address [r1]    */ +	ldmia	r0!, {r10-r11}		/* copy from source address [r0]    */ +	stmia	r1!, {r10-r11}		/* copy to   target address [r1]    */  	cmp	r0, r2			/* until source end address [r2]    */  	blo	copy_loop @@ -207,7 +206,6 @@ copy_loop:  	 * fix .rel.dyn relocations  	 */  	ldr	r0, _TEXT_BASE		/* r0 <- Text base */ -	sub	r9, r6, r0		/* r9 <- relocation offset */  	ldr	r10, _dynsym_start_ofs	/* r10 <- sym table ofs */  	add	r10, r10, r0		/* r10 <- sym table in FLASH */  	ldr	r2, _rel_dyn_start_ofs	/* r2 <- rel dyn start ofs */ @@ -387,8 +385,9 @@ cpu_init_crit:  	str	r0, [r13]			@ save R0's value.  	ldr	r0, IRQ_STACK_START_IN		@ get data regions start  	str	lr, [r0]			@ save caller lr in position 0 of saved stack -	mrs	r0, spsr			@ get the spsr +	mrs	lr, spsr			@ get the spsr  	str	lr, [r0, #4]			@ save spsr in position 1 of saved stack +	ldr	lr, [r0]			@ restore lr  	ldr	r0, [r13]			@ restore r0  	add	r13, r13, #4			@ pop stack entry  	.endm |