diff --git a/arch/arm/src/armv7-r/arm_head.S b/arch/arm/src/armv7-r/arm_head.S index 0ec9a7d306c..95ea23456f4 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 2caded54464..6d3eec5ff4e 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: