Message ID | 20240302074235.12643-8-wxjstz@126.com |
---|---|
State | Changes Requested |
Headers | show |
Series | Improvements to fw_base.S | expand |
On Sat, Mar 2, 2024 at 1:13 PM Xiang W <wxjstz@126.com> wrote: > > Improve fw_boot_hart to reduce parameter saving and restoration. > > Signed-off-by: Xiang W <wxjstz@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
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 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
Improve fw_boot_hart to reduce parameter saving and restoration. Signed-off-by: Xiang W <wxjstz@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(-)