diff options
Diffstat (limited to 'arch/m68k/cpu/mcf5445x/start.S')
| -rw-r--r-- | arch/m68k/cpu/mcf5445x/start.S | 57 | 
1 files changed, 37 insertions, 20 deletions
| diff --git a/arch/m68k/cpu/mcf5445x/start.S b/arch/m68k/cpu/mcf5445x/start.S index a083c3d45d2..5c3bfff7918 100644 --- a/arch/m68k/cpu/mcf5445x/start.S +++ b/arch/m68k/cpu/mcf5445x/start.S @@ -533,6 +533,39 @@ relocate_code:  	cmp.l	%a1,%a2  	bgt.s	1b +#define R_68K_32	1 +#define R_68K_RELATIVE	22 + +	move.l #(__rel_dyn_start), %a1 +	move.l #(__rel_dyn_end), %a2 + +fixloop: +	move.l	(%a1)+, %d1	/* Elf32_Rela r_offset */ +	move.l	(%a1)+, %d2	/* Elf32_Rela r_info */ +	move.l	(%a1)+, %d3	/* Elf32_Rela r_addend */ + +	andi.l	#0xff, %d2 +	cmp.l	#R_68K_32, %d2 +	beq.s	fixup +	cmp.l	#R_68K_RELATIVE, %d2 +	beq.s	fixup + +	bra	fixnext + +fixup: +	/* relative fix: store addend plus offset at dest location */ +	move.l	%a0, %a3 +	add.l	%d1, %a3 +	sub.l   #CONFIG_SYS_MONITOR_BASE, %a3 +	move.l	(%a3), %d4 +	add.l	%a0, %d4 +	sub.l   #CONFIG_SYS_MONITOR_BASE, %d4 +	move.l	%d4, (%a3) + +fixnext: +	cmp.l	%a1, %a2 +	bge.s	fixloop +  /*   * We are done. Do not return, instead branch to second part of board   * initialization, now running from RAM. @@ -547,10 +580,8 @@ clear_bss:  	/*  	 * Now clear BSS segment  	 */ -	move.l	%a0, %a1 -	add.l	#(_sbss - CONFIG_SYS_MONITOR_BASE),%a1 -	move.l	%a0, %d1 -	add.l	#(_ebss - CONFIG_SYS_MONITOR_BASE),%d1 +	move.l	#(_sbss), %a1 +	move.l	#(_ebss), %d1  6:  	clr.l	(%a1)+  	cmp.l	%a1,%d1 @@ -559,24 +590,10 @@ clear_bss:  	/*  	 * fix got table in RAM  	 */ -	move.l	%a0, %a1 -	add.l	#(__got_start - CONFIG_SYS_MONITOR_BASE),%a1 -	move.l	%a1,%a5			/* fix got pointer register a5 */ - -	move.l	%a0, %a2 -	add.l	#(__got_end - CONFIG_SYS_MONITOR_BASE),%a2 - -7: -	move.l	(%a1),%d1 -	sub.l	#_start,%d1 -	add.l	%a0,%d1 -	move.l	%d1,(%a1)+ -	cmp.l	%a2, %a1 -	bne	7b +	move.l	#(__got_start), %a5	/* fix got pointer register a5 */  	/* calculate relative jump to board_init_r in ram */ -	move.l	%a0, %a1 -	add.l	#(board_init_r - CONFIG_SYS_MONITOR_BASE), %a1 +	move.l	#(board_init_r), %a1  	/* set parameters for board_init_r */  	move.l	%a0,-(%sp)		/* dest_addr */ | 
