From 2524b0ecd8684b42bc7a4c69794f40f11cbbe2a5 Mon Sep 17 00:00:00 2001 From: Tekkaman Ninja Date: Thu, 1 Apr 2021 09:16:47 +0800 Subject: firmware/fw_payload: reduce the size by getting rid of padding Signed-off-by: Tekkaman Ninja --- firmware/fw_payload.S | 11 +++++++ firmware/fw_payload.elf.ldS | 2 +- firmware/fw_reloc_payload.S | 63 +++++++++++++++++++++++++++++++++++++ firmware/objects.mk | 4 +++ platform/starfive/vic7100/config.mk | 2 ++ 5 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 firmware/fw_reloc_payload.S 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 + * + * 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 -- cgit v1.2.3