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:

Reply via email to