MIPS: start.S: optimize BSS initialization

Get the start and end address for clearing BSS from the newly
introduced symbols __bss_start and __bss_end. After GOT is
relocated, those symbols are already pointing to the correct
addresses.

Also optimize the loop by moving the address incrementation
to the delay slot to avoid the initial sub instruction.

Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
This commit is contained in:
Daniel Schwierzeck 2013-02-12 22:22:13 +01:00
parent eea8a320e1
commit 696a3b2a53
3 changed files with 34 additions and 27 deletions

View File

@ -228,17 +228,19 @@ in_ram:
blt t2, t3, 1b blt t2, t3, 1b
addi t4, 4 addi t4, 4
/* Clear BSS */ /*
lw t1, -12(t0) # t1 <-- uboot_end_data * Clear BSS
lw t2, -8(t0) # t2 <-- uboot_end *
add t1, s1 # adjust pointers * GOT is now relocated. Thus __bss_start and __bss_end can be
add t2, s1 * accessed directly via $gp.
*/
la t1, __bss_start # t1 <-- __bss_start
la t2, __bss_end # t2 <-- __bss_end
sub t1, 4
1: 1:
addi t1, 4
bltl t1, t2, 1b
sw zero, 0(t1) sw zero, 0(t1)
blt t1, t2, 1b
addi t1, 4
move a0, s0 # a0 <-- gd move a0, s0 # a0 <-- gd
la t9, board_init_r la t9, board_init_r

View File

@ -220,17 +220,19 @@ in_ram:
blt t2, t3, 1b blt t2, t3, 1b
daddi t8, 8 daddi t8, 8
/* Clear BSS */ /*
ld t1, -24(t0) # t1 <-- uboot_end_data * Clear BSS
ld t2, -16(t0) # t2 <-- uboot_end *
dadd t1, s1 # adjust pointers * GOT is now relocated. Thus __bss_start and __bss_end can be
dadd t2, s1 * accessed directly via $gp.
*/
dla t1, __bss_start # t1 <-- __bss_start
dla t2, __bss_end # t2 <-- __bss_end
dsub t1, 8
1: 1:
daddi t1, 8
bltl t1, t2, 1b
sd zero, 0(t1) sd zero, 0(t1)
blt t1, t2, 1b
daddi t1, 8
move a0, s0 # a0 <-- gd move a0, s0 # a0 <-- gd
dla t9, board_init_r dla t9, board_init_r

View File

@ -143,16 +143,19 @@ in_ram:
blt t2, t3, 1b blt t2, t3, 1b
addi t4, 4 addi t4, 4
/* Clear BSS */ /*
lw t1, -12(t0) # t1 <-- uboot_end_data * Clear BSS
lw t2, -8(t0) # t2 <-- uboot_end *
add t1, t6 # adjust pointers * GOT is now relocated. Thus __bss_start and __bss_end can be
add t2, t6 * accessed directly via $gp.
*/
la t1, __bss_start # t1 <-- __bss_start
la t2, __bss_end # t2 <-- __bss_end
sub t1, 4 1:
1: addi t1, 4
bltl t1, t2, 1b
sw zero, 0(t1) sw zero, 0(t1)
blt t1, t2, 1b
addi t1, 4
move a0, a1 # a0 <-- gd move a0, a1 # a0 <-- gd
la t9, board_init_r la t9, board_init_r