diff options
Diffstat (limited to 'firmware/fw_reloc_payload.S')
-rw-r--r-- | firmware/fw_reloc_payload.S | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/firmware/fw_reloc_payload.S b/firmware/fw_reloc_payload.S new file mode 100644 index 0000000..38b8824 --- /dev/null +++ b/firmware/fw_reloc_payload.S @@ -0,0 +1,63 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2021 + * Authors: Tekkaman Ninja <tekkamanninja@163.com> + * + * t0 --> payload text base addr + * t1 --> payload end addr in fw_payload.bin + * t2 --> payload start addr in fw_payload.bin + * t3 --> payload text end addr (ti - t2 + t0) + * t4 --> _relocate_payload_done + * t2 t1 t0 t3 + * +-----------+-----------+----------+-------------+-------+ + * | fw_base + fw_payload| -------> |*fw_payload* | | + * +-----------+-----------+----------+-------------+-------+ + * + */ + +_relocate_payload: + li t0, (FW_TEXT_START + FW_PAYLOAD_OFFSET) + lla t1, _pl_end + REG_L t1, 0(t1) + lla t2, _pl_start + REG_L t2, 0(t2) + + sub t3, t1, t2 + add t3, t3, t0 + + beq t0, t2, _relocate_payload_done + + lla t4, _relocate_payload_done + + lla t5, _load_start + REG_L t5, 0(t5) + sub t4, t4, t5 + + lla t5, _link_start + REG_L t5, 0(t5) + add t4, t4, t5 + + blt t2, t0, _relocate_payload_copy_to_upper_loop + +_relocate_payload_copy_to_lower_loop: + REG_L t3, 0(t2) + REG_S t3, 0(t0) + add t0, t0, __SIZEOF_POINTER__ + add t2, t2, __SIZEOF_POINTER__ + blt t2, t1, _relocate_payload_copy_to_lower_loop + jr t4 + +_relocate_payload_copy_to_upper_loop: + add t3, t3, -__SIZEOF_POINTER__ + add t1, t1, -__SIZEOF_POINTER__ + REG_L t0, 0(t1) + REG_S t0, 0(t3) + blt t2, t1, _relocate_payload_copy_to_upper_loop + jr t4 + + .align 3 +_pl_end: + RISCV_PTR _payload_end +_pl_start: + RISCV_PTR _payload_start
\ No newline at end of file |