[PATCH v5 7/8] firmware: Improve fw_boot_hart
Anup Patel
anup at brainfault.org
Sat Mar 2 05:28:22 PST 2024
On Sat, Mar 2, 2024 at 1:13 PM Xiang W <wxjstz at 126.com> wrote:
>
> Improve fw_boot_hart to reduce parameter saving and restoration.
>
> Signed-off-by: Xiang W <wxjstz at 126.com>
> ---
> firmware/fw_base.S | 7 ++-----
> firmware/fw_dynamic.S | 24 ++++++++++++------------
> firmware/fw_jump.S | 6 +++---
> firmware/fw_payload.S | 6 +++---
> 4 files changed, 20 insertions(+), 23 deletions(-)
>
> diff --git a/firmware/fw_base.S b/firmware/fw_base.S
> index a798545..df5f769 100644
> --- a/firmware/fw_base.S
> +++ b/firmware/fw_base.S
> @@ -38,14 +38,11 @@
> .globl _start_warm
> _start:
> /* Find preferred boot HART id */
> - MOV_3R s0, a0, s1, a1, s2, a2
> call fw_boot_hart
> - add a6, a0, zero
> - MOV_3R a0, s0, a1, s1, a2, s2
NACK to this patch.
In future, someone might accidentally clobber the
a0 to a2 registers in fw_boot_hart without knowing
that caller is not preserving.
This patch achieves 0 improvement.
> li a7, -1
> - beq a6, a7, _try_lottery
> + beq t0, a7, _try_lottery
> /* Jump to relocation wait loop if we are not boot hart */
> - bne a0, a6, _wait_for_boot_hart
> + bne a0, t0, _wait_for_boot_hart
> _try_lottery:
> /* Jump to relocation wait loop if we don't get relocation lottery */
> lla a6, _boot_status
> diff --git a/firmware/fw_dynamic.S b/firmware/fw_dynamic.S
> index 5ee2883..52ef320 100644
> --- a/firmware/fw_dynamic.S
> +++ b/firmware/fw_dynamic.S
> @@ -17,24 +17,24 @@
> /*
> * This function is called very early even before
> * fw_save_info() is called.
> - * We can only use a0, a1, and a2 registers here.
> - * The boot HART id should be returned in 'a0'.
> + * We can only use t0, t1, and t2 registers here.
> + * The boot HART id should be returned in 't0'.
> */
> fw_boot_hart:
> /* Sanity checks */
> - li a1, FW_DYNAMIC_INFO_MAGIC_VALUE
> - REG_L a0, FW_DYNAMIC_INFO_MAGIC_OFFSET(a2)
> - bne a0, a1, _start_hang
> - li a1, FW_DYNAMIC_INFO_VERSION_MAX
> - REG_L a0, FW_DYNAMIC_INFO_VERSION_OFFSET(a2)
> - bgt a0, a1, _start_hang
> + li t1, FW_DYNAMIC_INFO_MAGIC_VALUE
> + REG_L t0, FW_DYNAMIC_INFO_MAGIC_OFFSET(a2)
> + bne t0, t1, _start_hang
> + li t1, FW_DYNAMIC_INFO_VERSION_MAX
> + REG_L t0, FW_DYNAMIC_INFO_VERSION_OFFSET(a2)
> + bgt t0, t1, _start_hang
>
> /* Read boot HART id */
> - li a1, FW_DYNAMIC_INFO_VERSION_2
> - blt a0, a1, 2f
> - REG_L a0, FW_DYNAMIC_INFO_BOOT_HART_OFFSET(a2)
> + li t1, FW_DYNAMIC_INFO_VERSION_2
> + blt t0, t1, 2f
> + REG_L t0, FW_DYNAMIC_INFO_BOOT_HART_OFFSET(a2)
> ret
> -2: li a0, -1
> +2: li t0, -1
> ret
>
> .section .entry, "ax", %progbits
> diff --git a/firmware/fw_jump.S b/firmware/fw_jump.S
> index ebf297f..ba46697 100644
> --- a/firmware/fw_jump.S
> +++ b/firmware/fw_jump.S
> @@ -15,11 +15,11 @@
> /*
> * This function is called very early even before
> * fw_save_info() is called.
> - * We can only use a0, a1, and a2 registers here.
> - * The boot HART id should be returned in 'a0'.
> + * We can only use t0, t1, and t2 registers here.
> + * The boot HART id should be returned in 't0'.
> */
> fw_boot_hart:
> - li a0, -1
> + li t0, -1
> ret
>
> .section .entry, "ax", %progbits
> diff --git a/firmware/fw_payload.S b/firmware/fw_payload.S
> index 3c8433e..02fd172 100644
> --- a/firmware/fw_payload.S
> +++ b/firmware/fw_payload.S
> @@ -15,11 +15,11 @@
> /*
> * This function is called very early even before
> * fw_save_info() is called.
> - * We can only use a0, a1, and a2 registers here.
> - * The boot HART id should be returned in 'a0'.
> + * We can only use t0, t1, and t2 registers here.
> + * The boot HART id should be returned in 't0'.
> */
> fw_boot_hart:
> - li a0, -1
> + li t0, -1
> ret
>
> .section .entry, "ax", %progbits
> --
> 2.43.0
>
Regards,
Anup
More information about the opensbi
mailing list