|
|
|
@ -234,11 +234,11 @@ reset: |
|
|
|
|
li t0, CONF_CM_UNCACHED |
|
|
|
|
mtc0 t0, CP0_CONFIG |
|
|
|
|
|
|
|
|
|
/* Initialize GOT pointer. |
|
|
|
|
/* Initialize $gp. |
|
|
|
|
*/ |
|
|
|
|
bal 1f |
|
|
|
|
nop |
|
|
|
|
.word _GLOBAL_OFFSET_TABLE_
|
|
|
|
|
.word _gp
|
|
|
|
|
1: |
|
|
|
|
move gp, ra |
|
|
|
|
lw t1, 0(ra) |
|
|
|
@ -306,9 +306,9 @@ 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 |
|
|
|
@ -341,15 +341,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) |
|
|
|
|