diff --git a/firmware/fw_jump.S b/firmware/fw_jump.S index ac74dc64..ebf297f4 100644 --- a/firmware/fw_jump.S +++ b/firmware/fw_jump.S @@ -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 diff --git a/firmware/objects.mk b/firmware/objects.mk index a1704c48..fef090a4 100644 --- a/firmware/objects.mk +++ b/firmware/objects.mk @@ -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