This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit f59510ec62802cfdd4409ca2a8d9bebce7fe6cfa Author: hujun5 <huj...@xiaomi.com> AuthorDate: Wed Apr 16 10:30:27 2025 +0800 armv[7/8]-r: add ARM_BUSY_WAIT On a system with multiple CPU cores, when the system is powered on, multiple cores may start running simultaneously. In this case, software is required to handle the startup logic for multi-core synchronization. One approach is to use global variables. however, the global variable region may not have been initialized yet. In such scenarios, we can use a busywait flag to implement the synchronization strategy. Signed-off-by: hujun5 <huj...@xiaomi.com> --- arch/arm/src/armv7-r/arm_head.S | 19 +++++++++++++++++++ arch/arm/src/armv8-r/arm_head.S | 17 +++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/arch/arm/src/armv7-r/arm_head.S b/arch/arm/src/armv7-r/arm_head.S index 0ec9a7d306..95ea23456f 100644 --- a/arch/arm/src/armv7-r/arm_head.S +++ b/arch/arm/src/armv7-r/arm_head.S @@ -134,7 +134,17 @@ __start: and r0, r0, #0x3 cmp r0, #0 beq __cpu0_start + +#ifdef CONFIG_ARM_BUSY_WAIT + ldr r2, =CONFIG_ARM_BUSY_WAIT_FLAG_ADDR +1: + ldr r1, [r2, #0] + cmp r1, #0 + beq 1b +#else wfe +#endif + cmp r0, #1 beq __cpu1_start # if CONFIG_SMP_NCPUS > 2 @@ -395,6 +405,15 @@ __cpu0_start: b arm_boot + /* finish busy wait */ + +#if defined(CONFIG_ARM_BUSY_WAIT) && defined(CONFIG_SMP) + ldr r0, =CONFIG_ARM_BUSY_WAIT_FLAG_ADDR + mov r1, #1 + str r1, [r0] + dsb sy +#endif + /* .text Data */ .Lstackpointer: diff --git a/arch/arm/src/armv8-r/arm_head.S b/arch/arm/src/armv8-r/arm_head.S index 2caded5446..6d3eec5ff4 100644 --- a/arch/arm/src/armv8-r/arm_head.S +++ b/arch/arm/src/armv8-r/arm_head.S @@ -142,7 +142,17 @@ __start: cmp r0, #0 #if defined(CONFIG_SMP) && CONFIG_SMP_NCPUS > 1 beq __cpu0_start + +#ifdef CONFIG_ARM_BUSY_WAIT + ldr r2, =CONFIG_ARM_BUSY_WAIT_FLAG_ADDR +1: + ldr r1, [r2, #0] + cmp r1, #0 + beq 1b +#else wfe +#endif + cmp r0, #1 beq __cpu1_start # if CONFIG_SMP_NCPUS > 2 @@ -247,6 +257,13 @@ __cpu0_start: mov lr, #0 /* LR = return address (none) */ b nx_start /* Branch to nx_start */ +#if defined(CONFIG_ARM_BUSY_WAIT) && defined(CONFIG_SMP) + ldr r0, =CONFIG_ARM_BUSY_WAIT_FLAG_ADDR + mov r1, #1 + str r1, [r0] + dsb sy +#endif + /* .text Data */ .Lstackpointer: