diff options
Diffstat (limited to 'cpu/mips/start.S')
| -rw-r--r-- | cpu/mips/start.S | 69 | 
1 files changed, 35 insertions, 34 deletions
| diff --git a/cpu/mips/start.S b/cpu/mips/start.S index e91e2137d..c92b16278 100644 --- a/cpu/mips/start.S +++ b/cpu/mips/start.S @@ -22,13 +22,11 @@   * MA 02111-1307 USA   */ -  #include <config.h>  #include <version.h>  #include <asm/regdef.h>  #include <asm/mipsregs.h> -  #define RVECENT(f,n) \     b f; nop  #define XVECENT(f,bev) \ @@ -192,7 +190,7 @@ _start:  	.word	0x00000000  	.word	0x03e00008  	.word	0x00000000 -	.word   0x00000000 +	.word	0x00000000  /* 0xbfc00428 */  	.word	0xdc870000  	.word	0xfca70000 @@ -203,7 +201,7 @@ _start:  	.word	0x00000000  	.word	0x03e00008  	.word	0x00000000 -	.word   0x00000000 +	.word	0x00000000  #endif /* CONFIG_PURPLE */  	.align 4  reset: @@ -234,34 +232,32 @@ reset:  	li	t0, CONF_CM_UNCACHED  	mtc0	t0, CP0_CONFIG -	/* Initialize GOT pointer. -	*/ -	bal     1f +	/* Initialize $gp. +	 */ +	bal	1f  	nop -	.word   _GLOBAL_OFFSET_TABLE_ -	1: -	move    gp, ra -	lw      t1, 0(ra) -	move	gp, t1 +	.word	_gp +1: +	lw	gp, 0(ra)  #ifdef CONFIG_INCA_IP  	/* Disable INCA-IP Watchdog.  	 */ -	la      t9, disable_incaip_wdt -	jalr    t9 +	la	t9, disable_incaip_wdt +	jalr	t9  	nop  #endif  	/* Initialize any external memory.  	 */ -	la      t9, lowlevel_init -	jalr    t9 +	la	t9, lowlevel_init +	jalr	t9  	nop  	/* Initialize caches...  	 */ -	la      t9, mips_cache_reset -	jalr    t9 +	la	t9, mips_cache_reset +	jalr	t9  	nop  	/* ... and enable them. @@ -269,12 +265,11 @@ reset:  	li	t0, CONF_CM_CACHABLE_NONCOHERENT  	mtc0	t0, CP0_CONFIG -  	/* Set up temporary stack.  	 */  	li	a0, CFG_INIT_SP_OFFSET -	la      t9, mips_cache_lock -	jalr    t9 +	la	t9, mips_cache_lock +	jalr	t9  	nop  	li	t0, CFG_SDRAM_BASE + CFG_INIT_SP_OFFSET @@ -284,7 +279,6 @@ reset:  	j	t9  	nop -  /*   * void relocate_code (addr_sp, gd, addr_moni)   * @@ -298,7 +292,7 @@ reset:  	.globl	relocate_code  	.ent	relocate_code  relocate_code: -	move	sp, a0		/* Set new stack pointer		*/ +	move	sp, a0		/* Set new stack pointer	*/  	li	t0, CFG_MONITOR_BASE  	la	t3, in_ram @@ -306,14 +300,14 @@ relocate_code:  	move	t1, a2  	/* -	 * Fix GOT pointer: +	 * Fix $gp:  	 * -	 * New GOT-PTR = (old GOT-PTR - CFG_MONITOR_BASE) + Destination Address +	 * New $gp = (Old $gp - CFG_MONITOR_BASE) + Destination Address  	 */  	move	t6, gp  	sub	gp, CFG_MONITOR_BASE -	add	gp, a2			/* gp now adjusted		*/ -	sub	t6, gp, t6		/* t6 <-- relocation offset	*/ +	add	gp, a2		/* gp now adjusted		*/ +	sub	t6, gp, t6	/* t6 <-- relocation offset	*/  	/*  	 * t0 = source address @@ -329,7 +323,7 @@ relocate_code:  	sw	t3, 0(t1)  	addu	t0, 4  	ble	t0, t2, 1b -	addu	t1, 4			/* delay slot			*/ +	addu	t1, 4		/* delay slot			*/  #endif  	/* If caches were enabled, we would have to flush them here. @@ -341,15 +335,22 @@ relocate_code:  	j	t0  	nop +	.gpword	_GLOBAL_OFFSET_TABLE_	/* _GLOBAL_OFFSET_TABLE_ - _gp	*/  	.word	uboot_end_data  	.word	uboot_end  	.word	num_got_entries  in_ram: -	/* Now we want to update GOT. +	/* +	 * Now we want to update GOT. +	 * +	 * GOT[0] is reserved. GOT[1] is also reserved for the dynamic object +	 * generated by GNU ld. Skip these reserved entries from relocation.  	 */  	lw	t3, -4(t0)	/* t3 <-- num_got_entries	*/ -	addi	t4, gp, 8	/* Skipping first two entries.	*/ +	lw	t4, -16(t0)	/* t4 <-- (_GLOBAL_OFFSET_TABLE_ - _gp)	*/ +	add	t4, t4, gp	/* t4 now holds _GLOBAL_OFFSET_TABLE_	*/ +	addi	t4, t4, 8	/* Skipping first two entries.	*/  	li	t2, 2  1:  	lw	t1, 0(t4) @@ -369,7 +370,8 @@ in_ram:  	add	t2, t6  	sub	t1, 4 -1:	addi	t1, 4 +1: +	addi	t1, 4  	bltl	t1, t2, 1b  	sw	zero, 0(t1)	/* delay slot			*/ @@ -380,11 +382,10 @@ in_ram:  	.end	relocate_code -  	/* Exception handlers.  	 */  romReserved: -	b romReserved +	b	romReserved  romExcHandle: -	b romExcHandle +	b	romExcHandle |