[PATCH v3 04/10] firmware: fw_base.S: Simplify relocate

Xiang W wxjstz at 126.com
Wed Jan 17 02:42:01 PST 2024


Regardless of whether the FW_PIC macro is defined or not, the
starting address of load/link and the runtime offset are required.
Regardless of whether it is boot hart or not, the runtime offset
are required. so the code to obtain these values is moved forward.

Signed-off-by: Xiang W <wxjstz at 126.com>
---
 firmware/fw_base.S | 41 +++++++++++------------------------------
 1 file changed, 11 insertions(+), 30 deletions(-)

diff --git a/firmware/fw_base.S b/firmware/fw_base.S
index 3d88704..18dd0c5 100644
--- a/firmware/fw_base.S
+++ b/firmware/fw_base.S
@@ -52,6 +52,12 @@ _start:
 	call	fw_boot_hart
 	add	a6, a0, zero
 	MOV_3R	a0, s0, a1, s1, a2, s2
+
+	lla	t2, _fw_start /* load start */
+	lla	t0, _link_start
+	REG_L	t0, 0(t0)     /* link start */
+	sub	t6, t2, t0    /* runtime offset */
+
 	li	a7, -1
 	beq	a6, a7, _try_lottery
 	/* Jump to relocation wait loop if we are not boot hart */
@@ -63,17 +69,7 @@ _try_lottery:
 	amoadd.w a6, a7, (a6)
 	bnez	a6, _wait_relocate_copy_done
 
-	/* Save load address */
-	lla	t0, _load_start
-	lla	t1, _fw_start
-	REG_S	t1, 0(t0)
-
 #ifdef FW_PIC
-	/* relocate the global table content */
-	lla	t0, _link_start
-	REG_L	t0, 0(t0)
-	/* t1 shall has the address of _fw_start */
-	sub	t2, t1, t0
 	lla	t0, __rel_dyn_start
 	lla	t1, __rel_dyn_end
 	beq	t0, t1, _relocate_done
@@ -83,8 +79,8 @@ _try_lottery:
 	bne	t5, t3, 3f
 	REG_L	t3, 0(t0)
 	REG_L	t5, (REGBYTES * 2)(t0)	/* t5 <-- addend */
-	add	t5, t5, t2
-	add	t3, t3, t2
+	add	t5, t5, t6
+	add	t3, t3, t6
 	REG_S	t5, 0(t3)		/* store runtime address to the GOT entry */
 
 3:
@@ -96,11 +92,7 @@ _wait_relocate_copy_done:
 #else
 	/* Relocate if load address != link address */
 _relocate:
-	lla	t0, _link_start
-	REG_L	t0, 0(t0)	  /* link start */
-	lla	t2, _fw_start	  /* load start */
 	beq	t0, t2, _relocate_done
-	sub	t6, t2, t0	  /* runtime offset */
 	lla	t3, _fw_reloc_end /* load end */
 	lla	t4, _relocate_done
 	sub	t1, t3, t6	  /* link end */
@@ -143,14 +135,10 @@ _relocate_copy_to_upper_loop:
 	blt	t0, t1, _relocate_copy_to_upper_loop
 	jr	t4
 _wait_relocate_copy_done:
-	lla	t0, _fw_start
-	lla	t1, _link_start
-	REG_L	t1, 0(t1)
-	beq	t0, t1, _wait_for_boot_hart
+	beq	t0, t2, _wait_for_boot_hart
 	lla	t2, _boot_status
 	lla	t3, _wait_for_boot_hart
-	sub	t3, t3, t0
-	add	t3, t3, t1
+	sub	t3, t3, t6
 1:
 	/* waitting for relocate copy done (_boot_status == 1) */
 	li	t4, BOOT_STATUS_RELOCATE_DONE
@@ -170,12 +158,7 @@ _relocate_done:
 	 */
 	lla	t0, _boot_status
 #ifndef FW_PIC
-	lla	t1, _link_start
-	REG_L	t1, 0(t1)
-	lla	t2, _load_start
-	REG_L	t2, 0(t2)
-	sub	t0, t0, t1
-	add	t0, t0, t2
+	add	t0, t0, t6
 #endif
 	li	t1, BOOT_STATUS_RELOCATE_DONE
 	REG_S	t1, 0(t0)
@@ -499,8 +482,6 @@ _relocate_lottery:
 	RISCV_PTR	0
 _boot_status:
 	RISCV_PTR	0
-_load_start:
-	RISCV_PTR	_fw_start
 _link_start:
 	RISCV_PTR	FW_TEXT_START
 
-- 
2.43.0




More information about the opensbi mailing list