projects
/
oweals
/
u-boot.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[MIPS] cpu/mips/cache.S: Introduce NESTED/LEAF/END macros
[oweals/u-boot.git]
/
cpu
/
mips
/
start.S
diff --git
a/cpu/mips/start.S
b/cpu/mips/start.S
index ff105a418401c953cd817ef8b1e42eeec30c7d23..930f9b3fde1a902eb2bb631dae12a0ad854726ea 100644
(file)
--- a/
cpu/mips/start.S
+++ b/
cpu/mips/start.S
@@
-22,13
+22,11
@@
* MA 02111-1307 USA
*/
* MA 02111-1307 USA
*/
-
#include <config.h>
#include <version.h>
#include <asm/regdef.h>
#include <asm/mipsregs.h>
#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) \
#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 0x03e00008
.word 0x00000000
- .word 0x00000000
+ .word 0x00000000
/* 0xbfc00428 */
.word 0xdc870000
.word 0xfca70000
/* 0xbfc00428 */
.word 0xdc870000
.word 0xfca70000
@@
-203,7
+201,7
@@
_start:
.word 0x00000000
.word 0x03e00008
.word 0x00000000
.word 0x00000000
.word 0x03e00008
.word 0x00000000
- .word 0x00000000
+ .word 0x00000000
#endif /* CONFIG_PURPLE */
.align 4
reset:
#endif /* CONFIG_PURPLE */
.align 4
reset:
@@
-234,21
+232,32
@@
reset:
li t0, CONF_CM_UNCACHED
mtc0 t0, CP0_CONFIG
li t0, CONF_CM_UNCACHED
mtc0 t0, CP0_CONFIG
+ /* Initialize $gp.
+ */
+ bal 1f
+ nop
+ .word _gp
+1:
+ lw gp, 0(ra)
+
#ifdef CONFIG_INCA_IP
/* Disable INCA-IP Watchdog.
*/
#ifdef CONFIG_INCA_IP
/* Disable INCA-IP Watchdog.
*/
- bal disable_incaip_wdt
+ la t9, disable_incaip_wdt
+ jalr t9
nop
#endif
/* Initialize any external memory.
*/
nop
#endif
/* Initialize any external memory.
*/
- bal lowlevel_init
+ la t9, lowlevel_init
+ jalr t9
nop
/* Initialize caches...
*/
nop
/* Initialize caches...
*/
- bal mips_cache_reset
+ la t9, mips_cache_reset
+ jalr t9
nop
/* ... and enable them.
nop
/* ... and enable them.
@@
-256,30
+265,22
@@
reset:
li t0, CONF_CM_CACHABLE_NONCOHERENT
mtc0 t0, CP0_CONFIG
li t0, CONF_CM_CACHABLE_NONCOHERENT
mtc0 t0, CP0_CONFIG
-
/* Set up temporary stack.
*/
/* Set up temporary stack.
*/
+#ifdef CFG_INIT_RAM_LOCK_MIPS
li a0, CFG_INIT_SP_OFFSET
li a0, CFG_INIT_SP_OFFSET
- bal mips_cache_lock
+ la t9, mips_cache_lock
+ jalr t9
nop
nop
+#endif
li t0, CFG_SDRAM_BASE + CFG_INIT_SP_OFFSET
la sp, 0(t0)
li t0, CFG_SDRAM_BASE + CFG_INIT_SP_OFFSET
la sp, 0(t0)
- /* Initialize GOT pointer.
- */
- bal 1f
- nop
- .word _GLOBAL_OFFSET_TABLE_ - 1f + 4
-1:
- move gp, ra
- lw t1, 0(ra)
- add gp, t1
la t9, board_init_f
j t9
nop
la t9, board_init_f
j t9
nop
-
/*
* void relocate_code (addr_sp, gd, addr_moni)
*
/*
* void relocate_code (addr_sp, gd, addr_moni)
*
@@
-293,7
+294,7
@@
reset:
.globl relocate_code
.ent relocate_code
relocate_code:
.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
li t0, CFG_MONITOR_BASE
la t3, in_ram
@@
-301,14
+302,14
@@
relocate_code:
move t1, a2
/*
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
*/
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
/*
* t0 = source address
@@
-324,7
+325,7
@@
relocate_code:
sw t3, 0(t1)
addu t0, 4
ble t0, t2, 1b
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.
#endif
/* If caches were enabled, we would have to flush them here.
@@
-336,15
+337,22
@@
relocate_code:
j t0
nop
j t0
nop
+ .gpword _GLOBAL_OFFSET_TABLE_ /* _GLOBAL_OFFSET_TABLE_ - _gp */
.word uboot_end_data
.word uboot_end
.word num_got_entries
in_ram:
.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 */
*/
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)
li t2, 2
1:
lw t1, 0(t4)
@@
-364,7
+372,8
@@
in_ram:
add t2, t6
sub t1, 4
add t2, t6
sub t1, 4
-1: addi t1, 4
+1:
+ addi t1, 4
bltl t1, t2, 1b
sw zero, 0(t1) /* delay slot */
bltl t1, t2, 1b
sw zero, 0(t1) /* delay slot */
@@
-375,11
+384,10
@@
in_ram:
.end relocate_code
.end relocate_code
-
/* Exception handlers.
*/
romReserved:
/* Exception handlers.
*/
romReserved:
- b romReserved
+ b
romReserved
romExcHandle:
romExcHandle:
- b romExcHandle
+ b
romExcHandle