firmware: Change to use positive offset to access relocation entries
authorBin Meng <bmeng@tinylab.org>
Tue, 4 Apr 2023 04:46:01 +0000 (12:46 +0800)
committerAnup Patel <anup@brainfault.org>
Mon, 17 Apr 2023 03:25:55 +0000 (08:55 +0530)
The codes currently skip the very first relocation entry, but later
reference the elements in the relocation entry using minus offsets.

Change to use positive offsets so that there is no need to skip the
first relocation entry.

Signed-off-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Anup Patel <anup@brainfault.org>
Reviewed-by: Xiang W <wxjstz@126.com>
firmware/fw_base.S

index 2d6be70e9d47eb5eb620f708f330c1686e6b87b7..e37df095845da36fe4f26a04403a47930d92ca6e 100644 (file)
@@ -79,13 +79,12 @@ _try_lottery:
        lla     t0, __rel_dyn_start
        lla     t1, __rel_dyn_end
        beq     t0, t1, _relocate_done
-       j       5f
 2:
-       REG_L   t5, -(REGBYTES*2)(t0)   /* t5 <-- relocation info:type */
+       REG_L   t5, REGBYTES(t0)        /* t5 <-- relocation info:type */
        li      t3, R_RISCV_RELATIVE    /* reloc type R_RISCV_RELATIVE */
        bne     t5, t3, 3f
-       REG_L   t3, -(REGBYTES*3)(t0)
-       REG_L   t5, -(REGBYTES)(t0)     /* t5 <-- addend */
+       REG_L   t3, 0(t0)
+       REG_L   t5, (REGBYTES * 2)(t0)  /* t5 <-- addend */
        add     t5, t5, t2
        add     t3, t3, t2
        REG_S   t5, 0(t3)               /* store runtime address to the GOT entry */
@@ -101,11 +100,11 @@ _try_lottery:
        bne     t5, t3, 5f
 
        /* address R_RISCV_64 or R_RISCV_32 cases*/
-       REG_L   t3, -(REGBYTES*3)(t0)
+       REG_L   t3, 0(t0)
        li      t5, SYM_SIZE
        mul     t6, t6, t5
        add     s5, t4, t6
-       REG_L   t6, -(REGBYTES)(t0)     /* t0 <-- addend */
+       REG_L   t6, (REGBYTES * 2)(t0)  /* t0 <-- addend */
        REG_L   t5, REGBYTES(s5)
        add     t5, t5, t6
        add     t5, t5, t2              /* t5 <-- location to fix up in RAM */
@@ -113,8 +112,8 @@ _try_lottery:
        REG_S   t5, 0(t3)               /* store runtime address to the variable */
 
 5:
-       addi    t0, t0, (REGBYTES*3)
-       ble     t0, t1, 2b
+       addi    t0, t0, (REGBYTES * 3)
+       blt     t0, t1, 2b
        j       _relocate_done
 _wait_relocate_copy_done:
        j       _wait_for_boot_hart