firmware: Add relocatable FW_JUMP_ADDR and FW_JUMP_FDT_ADDR
authorInochi Amaoto <inochiama@outlook.com>
Fri, 23 Feb 2024 08:18:12 +0000 (16:18 +0800)
committerAnup Patel <anup@brainfault.org>
Sat, 24 Feb 2024 10:26:55 +0000 (15:56 +0530)
If FW_PIC=y is defined, the fw_jump.bin will be broken if
FW_TEXT_START is wrong. This is not the desired behavior.

Add two new variables to identify relocatable jump address:
FW_JUMP_OFFSET and FW_JUMP_FDT_ADDR. To keep the existing
ABI, FW_JUMP_ADDR and FW_JUMP_FDT_ADDR is prefered if they
are defined.

Signed-off-by: Inochi Amaoto <inochiama@outlook.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
firmware/fw_jump.S
firmware/objects.mk

index ac74dc64389e6492ad8a0c93c33c60b4a0f7754f..ebf297f46321600015c478a4520cfb0d0c8d7268 100644 (file)
@@ -46,6 +46,10 @@ fw_save_info:
 fw_next_arg1:
 #ifdef FW_JUMP_FDT_ADDR
        li      a0, FW_JUMP_FDT_ADDR
+#elif defined(FW_JUMP_FDT_OFFSET)
+       lla     a0, _fw_start
+       li      a1, FW_JUMP_FDT_OFFSET
+       add     a0, a0, a1
 #else
        add     a0, a1, zero
 #endif
@@ -59,8 +63,16 @@ fw_next_arg1:
         * The next address should be returned in 'a0'.
         */
 fw_next_addr:
+#ifdef FW_JUMP_ADDR
        lla     a0, _jump_addr
        REG_L   a0, (a0)
+#elif defined(FW_JUMP_OFFSET)
+       lla     a0, _fw_start
+       li      a1, FW_JUMP_OFFSET
+       add     a0, a0, a1
+#else
+#error "Must define at least FW_JUMP_ADDR or FW_JUMP_OFFSET"
+#endif
        ret
 
        .section .entry, "ax", %progbits
@@ -86,11 +98,9 @@ fw_options:
        add     a0, zero, zero
        ret
 
-#ifndef FW_JUMP_ADDR
-#error "Must define FW_JUMP_ADDR"
-#endif
-
+#ifdef FW_JUMP_ADDR
        .section .rodata
        .align 3
 _jump_addr:
        RISCV_PTR FW_JUMP_ADDR
+#endif
index a1704c48d81d09db2e9cd28c16d4414c6d3d6950..fef090a4318b7e45704218131599c8815550fda9 100644 (file)
@@ -38,9 +38,15 @@ endif
 firmware-bins-$(FW_DYNAMIC) += fw_dynamic.bin
 
 firmware-bins-$(FW_JUMP) += fw_jump.bin
+ifdef FW_JUMP_OFFSET
+firmware-genflags-$(FW_JUMP) += -DFW_JUMP_OFFSET=$(FW_JUMP_OFFSET)
+endif
 ifdef FW_JUMP_ADDR
 firmware-genflags-$(FW_JUMP) += -DFW_JUMP_ADDR=$(FW_JUMP_ADDR)
 endif
+ifdef FW_JUMP_FDT_OFFSET
+firmware-genflags-$(FW_JUMP) += -DFW_JUMP_FDT_OFFSET=$(FW_JUMP_FDT_OFFSET)
+endif
 ifdef FW_JUMP_FDT_ADDR
 firmware-genflags-$(FW_JUMP) += -DFW_JUMP_FDT_ADDR=$(FW_JUMP_FDT_ADDR)
 endif