[PATCH] fw_base.S: Fix boot hart status synchronization
Anup Patel
anup at brainfault.org
Thu Nov 16 02:52:12 PST 2023
On Thu, Oct 19, 2023 at 2:57 PM <guoren at kernel.org> wrote:
>
> From: Guo Ren <guoren at linux.alibaba.com>
>
> It's wrong to put the fence after setting the boot status flag because
> all relocation operations must be finished before setting the status
> flag. So, this fence must be put before the setting status flag, and
> there is no use in putting a fence between _start_warm and setting
> status flag.
>
> Also, nop can't delay other harts too much, so use div instead, just
> like Linux cpu_relax. Current opensbi force enables “M” Standard
> Extension, and mul instructions have been used in the fw_base.S.
>
> After the above two fixes, the boot hart index param of the
> fw_dynamic_info could be guaranteed properly for all platforms.
>
> Signed-off-by: Guo Ren <guoren at linux.alibaba.com>
> Signed-off-by: Guo Ren <guoren at kernel.org>
Looks good to me.
Reviewed-by: Anup Patel <anup at brainfault.org>
Applied this patch to the riscv/opensbi repo.
Thanks,
Anup
> ---
> firmware/fw_base.S | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/firmware/fw_base.S b/firmware/fw_base.S
> index 42b03fe890f0..f7763f4d9e56 100644
> --- a/firmware/fw_base.S
> +++ b/firmware/fw_base.S
> @@ -399,8 +399,8 @@ _fdt_reloc_done:
> /* mark boot hart done */
> li t0, BOOT_STATUS_BOOT_HART_DONE
> lla t1, _boot_status
> - REG_S t0, 0(t1)
> fence rw, rw
> + REG_S t0, 0(t1)
> j _start_warm
>
> /* waiting for boot hart to be done (_boot_status == 2) */
> @@ -409,9 +409,9 @@ _wait_for_boot_hart:
> lla t1, _boot_status
> REG_L t1, 0(t1)
> /* Reduce the bus traffic so that boot hart may proceed faster */
> - nop
> - nop
> - nop
> + div t2, t2, zero
> + div t2, t2, zero
> + div t2, t2, zero
> bne t0, t1, _wait_for_boot_hart
>
> _start_warm:
> --
> 2.36.1
>
More information about the opensbi
mailing list