The current code uses four instructions and a
temporary register to calculate the relocation
offset and to adjust the gp register.

The relocation offset can be calculated directly
from the CONFIG_SYS_MONITOR_BASE constant and from
the destination address. The resulting offset can
be used to adjust the gp pointer.

This approach makes the code a bit simpler because
it needs two instructions only.

Signed-off-by: Gabor Juhos <juh...@openwrt.org>
Cc: Daniel Schwierzeck <daniel.schwierz...@googlemail.com>
---
 arch/mips/cpu/mips32/start.S |   12 +++---------
 arch/mips/cpu/mips64/start.S |   12 +++---------
 2 files changed, 6 insertions(+), 18 deletions(-)

diff --git a/arch/mips/cpu/mips32/start.S b/arch/mips/cpu/mips32/start.S
index 64a606f..d67dafa 100644
--- a/arch/mips/cpu/mips32/start.S
+++ b/arch/mips/cpu/mips32/start.S
@@ -283,19 +283,13 @@ relocate_code:
        move    s2, a2                  # save destination address in s2
 
        li      t0, CONFIG_SYS_MONITOR_BASE
+       sub     s1, s2, t0              # s1 <-- relocation offset
+
        la      t3, in_ram
        lw      t2, -12(t3)             # t2 <-- uboot_end_data
        move    t1, a2
 
-       /*
-        * Fix $gp:
-        *
-        * New $gp = (Old $gp - CONFIG_SYS_MONITOR_BASE) + Destination Address
-        */
-       move    t6, gp
-       sub     gp, CONFIG_SYS_MONITOR_BASE
-       add     gp, a2                  # gp now adjusted
-       sub     s1, gp, t6              # s1 <-- relocation offset
+       add     gp, s1                  # adjust gp
 
        /*
         * t0 = source address
diff --git a/arch/mips/cpu/mips64/start.S b/arch/mips/cpu/mips64/start.S
index 3c0f1c3..d213c8e 100644
--- a/arch/mips/cpu/mips64/start.S
+++ b/arch/mips/cpu/mips64/start.S
@@ -162,19 +162,13 @@ relocate_code:
        move    s2, a2                  # save destination address in s2
 
        dli     t0, CONFIG_SYS_MONITOR_BASE
+       dsub    s1, s2, t0              # s1 <-- relocation offset
+
        dla     t3, in_ram
        ld      t2, -24(t3)             # t2 <-- uboot_end_data
        move    t1, a2
 
-       /*
-        * Fix $gp:
-        *
-        * New $gp = (Old $gp - CONFIG_SYS_MONITOR_BASE) + Destination Address
-        */
-       move    t8, gp
-       dsub    gp, CONFIG_SYS_MONITOR_BASE
-       dadd    gp, a2                  # gp now adjusted
-       dsub    s1, gp, t8              # s1 <-- relocation offset
+       dadd    gp, s1                  # adjust gp
 
        /*
         * t0 = source address
-- 
1.7.10

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to