summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTekkaman Ninja <tekkamanninja@163.com>2021-04-01 04:16:47 +0300
committerTekkaman Ninja <tekkamanninja@163.com>2021-04-28 21:22:36 +0300
commit2524b0ecd8684b42bc7a4c69794f40f11cbbe2a5 (patch)
tree3035dccd0e94626e6baabdbfb17d248526652cee
parentfb50238d6e8665fdd637a95d95ed6f26fdc6e671 (diff)
downloadopensbi-debug.tar.xz
firmware/fw_payload: reduce the size by getting rid of paddingdebug
Signed-off-by: Tekkaman Ninja <tekkamanninja@163.com>
-rw-r--r--firmware/fw_payload.S11
-rw-r--r--firmware/fw_payload.elf.ldS2
-rw-r--r--firmware/fw_reloc_payload.S63
-rw-r--r--firmware/objects.mk4
-rw-r--r--platform/starfive/vic7100/config.mk2
5 files changed, 81 insertions, 1 deletions
diff --git a/firmware/fw_payload.S b/firmware/fw_payload.S
index c53a3bb..8c373b9 100644
--- a/firmware/fw_payload.S
+++ b/firmware/fw_payload.S
@@ -20,6 +20,13 @@
*/
fw_boot_hart:
li a0, -1
+#ifdef FW_PAYLOAD_NOPAD
+
+#include "fw_reloc_payload.S"
+
+ .globl _relocate_payload_done
+_relocate_payload_done:
+#endif
ret
.section .entry, "ax", %progbits
@@ -59,7 +66,11 @@ fw_next_arg1:
* The next address should be returned in 'a0'.
*/
fw_next_addr:
+#ifdef FW_PAYLOAD_NOPAD
+ li a0, (FW_TEXT_START + FW_PAYLOAD_OFFSET)
+#else
lla a0, payload_bin
+#endif
ret
.section .entry, "ax", %progbits
diff --git a/firmware/fw_payload.elf.ldS b/firmware/fw_payload.elf.ldS
index f1a544b..9d14acd 100644
--- a/firmware/fw_payload.elf.ldS
+++ b/firmware/fw_payload.elf.ldS
@@ -14,7 +14,7 @@ SECTIONS
{
#include "fw_base.ldS"
-#ifdef FW_PAYLOAD_OFFSET
+#if defined(FW_PAYLOAD_OFFSET) && !defined(FW_PAYLOAD_NOPAD)
. = FW_TEXT_START + FW_PAYLOAD_OFFSET;
#else
. = ALIGN(FW_PAYLOAD_ALIGN);
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
diff --git a/firmware/objects.mk b/firmware/objects.mk
index c1f632e..5ffc09c 100644
--- a/firmware/objects.mk
+++ b/firmware/objects.mk
@@ -59,6 +59,10 @@ ifdef FW_PAYLOAD_FDT_ADDR
firmware-genflags-$(FW_PAYLOAD) += -DFW_PAYLOAD_FDT_ADDR=$(FW_PAYLOAD_FDT_ADDR)
endif
+ifdef FW_PAYLOAD_NOPAD
+firmware-genflags-$(FW_PAYLOAD) += -DFW_PAYLOAD_NOPAD=$(FW_PAYLOAD_NOPAD)
+endif
+
ifdef FW_OPTIONS
firmware-genflags-y += -DFW_OPTIONS=$(FW_OPTIONS)
endif
diff --git a/platform/starfive/vic7100/config.mk b/platform/starfive/vic7100/config.mk
index 1f8614e..ea84998 100644
--- a/platform/starfive/vic7100/config.mk
+++ b/platform/starfive/vic7100/config.mk
@@ -42,3 +42,5 @@ FW_PAYLOAD=y
FW_PAYLOAD_FDT_ADDR=0x88000000
FW_PAYLOAD_ALIGN=0x1000
+
+FW_PAYLOAD_NOPAD=y