summaryrefslogtreecommitdiff
path: root/firmware/fw_reloc_payload.S
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/fw_reloc_payload.S')
-rw-r--r--firmware/fw_reloc_payload.S63
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