summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordong.yang <[email protected]>2024-09-13 12:36:39 +0800
committerAnup Patel <[email protected]>2024-09-27 11:05:37 +0530
commit3e141a6950a276632439b202b220e49f3ae6969b (patch)
treef471b4adf19a78ce2ab70453465a5ca9c0559f7f
parent7b3de48cd583dbd8c0b9efa65f417c4e5d5a6b79 (diff)
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 <[email protected]> Reviewed-by: Xing Xiaoguang <[email protected]> Reviewed-by: Xiang W <[email protected]> Reviewed-by: Anup Patel <[email protected]>
-rw-r--r--firmware/fw_base.S10
1 files 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 <sbi/sbi_scratch.h>
#include <sbi/sbi_trap.h>
-#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