MIPS: simplify relocated _G_O_T_ address calculation
authorGabor Juhos <juhosg@openwrt.org>
Wed, 30 Jan 2013 04:56:37 +0000 (04:56 +0000)
committerDaniel Schwierzeck <daniel.schwierzeck@gmail.com>
Wed, 30 Jan 2013 22:32:52 +0000 (23:32 +0100)
The difference between the address of the original
and the relocated _GLOBAL_OFFSET_TABLE_ is always
the same as the relocation offset.

The relocation offset is already computed and it is
available in the 's1/t6' register. Use that to adjust
the relocated _G_O_T_ address, instead of calculating
the offset again from the _gp value.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
Cc: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
Cc: Xiangfu Liu <xiangfu@openmobilefree.net>
arch/mips/cpu/mips32/start.S
arch/mips/cpu/mips64/start.S
arch/mips/cpu/xburst/start.S

index 77f1103216df9fb81a9a29b67aa784ecc6b4c75e..51ce914fadb642bece1aa9ae760de466e9531561 100644 (file)
@@ -314,7 +314,6 @@ relocate_code:
        jr      t0
         nop
 
-       .word   _gp
        .word   _GLOBAL_OFFSET_TABLE_
        .word   uboot_end_data
        .word   uboot_end
@@ -329,9 +328,7 @@ in_ram:
         */
        lw      t3, -4(t0)              # t3 <-- num_got_entries
        lw      t4, -16(t0)             # t4 <-- _GLOBAL_OFFSET_TABLE_
-       lw      t5, -20(t0)             # t5 <-- _gp
-       sub     t4, t5                  # compute offset
-       add     t4, t4, gp              # t4 now holds relocated _G_O_T_
+       add     t4, s1                  # t4 now holds relocated _G_O_T_
        addi    t4, t4, 8               # skipping first two entries
        li      t2, 2
 1:
index 80e6bb1398db3690c5398e50edc2dbee20a861c4..15225945e9b89ecada9caabcbd5ef6ba6fcccda7 100644 (file)
@@ -193,7 +193,6 @@ relocate_code:
        jr      t0
         nop
 
-       .dword  _gp
        .dword  _GLOBAL_OFFSET_TABLE_
        .dword  uboot_end_data
        .dword  uboot_end
@@ -208,9 +207,7 @@ in_ram:
         */
        ld      t3, -8(t0)              # t3 <-- num_got_entries
        ld      t8, -32(t0)             # t8 <-- _GLOBAL_OFFSET_TABLE_
-       ld      t9, -40(t0)             # t9 <-- _gp
-       dsub    t8, t9                  # compute offset
-       dadd    t8, t8, gp              # t8 now holds relocated _G_O_T_
+       dadd    t8, s1                  # t8 now holds relocated _G_O_T_
        daddi   t8, t8, 16              # skipping first two entries
        dli     t2, 2
 1:
index 194d7452e1a6f9e959c221fb4f02703fc739ca0a..9e637dfe998380d495014ebcb39ba43e5c8dcc7c 100644 (file)
@@ -122,7 +122,6 @@ relocate_code:
        jr      t0
         nop
 
-       .word   _gp
        .word   _GLOBAL_OFFSET_TABLE_
        .word   uboot_end_data
        .word   uboot_end
@@ -137,9 +136,7 @@ in_ram:
         */
        lw      t3, -4(t0)              # t3 <-- num_got_entries
        lw      t4, -16(t0)             # t4 <-- _GLOBAL_OFFSET_TABLE_
-       lw      t5, -20(t0)             # t5 <-- _gp
-       sub     t4, t5                  # compute offset
-       add     t4, t4, gp              # t4 now holds relocated _G_O_T_
+       add     t4, t6                  # t4 now holds relocated _G_O_T_
        addi    t4, t4, 8               # skipping first two entries
        li      t2, 2
 1: