Browse Source

MIPS: start.S: don't save flush_cache parameters in advance

Saving the parameters in advance unnecessarily complicates
the code. The destination address is already saved in the
's2' register, and that register is not clobbered by the
copy loop. The size of the copied data can be computed
after the copy loop is done.

Change the code to compute the size parameter right
before calling flush_cache, and set the destination
address parameter in the delay slot of the actuall
call.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
Cc: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
Gabor Juhos 12 years ago
parent
commit
67d80c9f97
2 changed files with 4 additions and 20 deletions
  1. 2 10
      arch/mips/cpu/mips32/start.S
  2. 2 10
      arch/mips/cpu/mips64/start.S

+ 2 - 10
arch/mips/cpu/mips32/start.S

@@ -296,13 +296,6 @@ relocate_code:
 	 * t1 = target address
 	 * t1 = target address
 	 * t2 = source end address
 	 * t2 = source end address
 	 */
 	 */
-
-	/*
-	 * Save destination address and size for later usage in flush_cache()
-	 */
-	move	a0, t1			# a0 <-- destination addr
-	sub	a1, t2, t0		# a1 <-- size
-
 1:
 1:
 	lw	t3, 0(t0)
 	lw	t3, 0(t0)
 	sw	t3, 0(t1)
 	sw	t3, 0(t1)
@@ -311,11 +304,10 @@ relocate_code:
 	 addu	t1, 4
 	 addu	t1, 4
 
 
 	/* If caches were enabled, we would have to flush them here. */
 	/* If caches were enabled, we would have to flush them here. */
-
-	/* a0 & a1 are already set up for flush_cache(start, size) */
+	sub	a1, t1, s2		# a1 <-- size
 	la	t9, flush_cache
 	la	t9, flush_cache
 	jalr	t9
 	jalr	t9
-	 nop
+	 move	a0, s2			# a0 <-- destination address
 
 
 	/* Jump to where we've relocated ourselves */
 	/* Jump to where we've relocated ourselves */
 	addi	t0, s2, in_ram - _start
 	addi	t0, s2, in_ram - _start

+ 2 - 10
arch/mips/cpu/mips64/start.S

@@ -175,13 +175,6 @@ relocate_code:
 	 * t1 = target address
 	 * t1 = target address
 	 * t2 = source end address
 	 * t2 = source end address
 	 */
 	 */
-
-	/*
-	 * Save destination address and size for dlater usage in flush_cache()
-	 */
-	move	a0, t1			# a0 <-- destination addr
-	dsub	a1, t2, t0		# a1 <-- size
-
 1:
 1:
 	lw	t3, 0(t0)
 	lw	t3, 0(t0)
 	sw	t3, 0(t1)
 	sw	t3, 0(t1)
@@ -190,11 +183,10 @@ relocate_code:
 	 daddu	t1, 4
 	 daddu	t1, 4
 
 
 	/* If caches were enabled, we would have to flush them here. */
 	/* If caches were enabled, we would have to flush them here. */
-
-	/* a0 & a1 are already set up for flush_cache(start, size) */
+	dsub	a1, t1, s2		# a1 <-- size
 	dla	t9, flush_cache
 	dla	t9, flush_cache
 	jalr	t9
 	jalr	t9
-	 nop
+	 move	a0, s2			# a0 <-- destination address
 
 
 	/* Jump to where we've relocated ourselves */
 	/* Jump to where we've relocated ourselves */
 	daddi	t0, s2, in_ram - _start
 	daddi	t0, s2, in_ram - _start