From 3e141a6950a276632439b202b220e49f3ae6969b Mon Sep 17 00:00:00 2001 From: "dong.yang" Date: Fri, 13 Sep 2024 12:36:39 +0800 Subject: [PATCH] firmware: fw_base.S: fix multi-core boot bug. In a multi-core startup scenario, if both _try_lottery and _wait_for_boot_hart use the data in the _boot_status address, when a CPU enters OpenSBI later than boot hart set the _boot_status to BOOT_STATUS_BOOT_HART_DONE, the CPU will modify _boot_status to 1 by amoswap.w and will never be awakened in _wait_for_boot_hart. So let _try_lottery and _boot_status use data from two addresses. Fixes: 8151105af5e4 ("firmware: fw_base.S: Remove _relocate_lottery") Signed-off-by: dong.yang Reviewed-by: Xing Xiaoguang Reviewed-by: Xiang W Reviewed-by: Anup Patel --- firmware/fw_base.S | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/firmware/fw_base.S b/firmware/fw_base.S index 41ae46f2..4a2652e9 100644 --- a/firmware/fw_base.S +++ b/firmware/fw_base.S @@ -14,8 +14,8 @@ #include #include -#define BOOT_STATUS_LOTTERY_DONE 1 -#define BOOT_STATUS_BOOT_HART_DONE 2 +#define BOOT_LOTTERY_ACQUIRED 1 +#define BOOT_STATUS_BOOT_HART_DONE 1 .macro MOV_3R __d0, __s0, __d1, __s1, __d2, __s2 add \__d0, \__s0, zero @@ -47,8 +47,8 @@ _start: bne a0, a6, _wait_for_boot_hart _try_lottery: /* Jump to relocation wait loop if we don't get relocation lottery */ - lla a6, _boot_status - li a7, BOOT_STATUS_LOTTERY_DONE + lla a6, _boot_lottery + li a7, BOOT_LOTTERY_ACQUIRED amoswap.w a6, a7, (a6) bnez a6, _wait_for_boot_hart @@ -357,6 +357,8 @@ _skip_trap_handler_hyp: .data .align 3 +_boot_lottery: + RISCV_PTR 0 _boot_status: RISCV_PTR 0