bsps/arm: More robust SMP start

Do not continue execution on processors which are not configured to prevent the
use of arbitrary memory for the initialization stack.
This commit is contained in:
Sebastian Huber
2021-08-04 14:21:34 +02:00
parent 8df57649b0
commit 59472042ec
3 changed files with 16 additions and 11 deletions

View File

@@ -66,10 +66,7 @@ void bsp_start_hook_0( void )
* Prevent the fatal errors SMP_FATAL_MULTITASKING_START_ON_INVALID_PROCESSOR * Prevent the fatal errors SMP_FATAL_MULTITASKING_START_ON_INVALID_PROCESSOR
* and SMP_FATAL_MULTITASKING_START_ON_UNASSIGNED_PROCESSOR this way. * and SMP_FATAL_MULTITASKING_START_ON_UNASSIGNED_PROCESSOR this way.
*/ */
if ( if ( !_SMP_Should_start_processor( cpu_index_self ) ) {
cpu_index_self >= rtems_configuration_get_maximum_processors()
|| !_SMP_Should_start_processor( cpu_index_self )
) {
while ( true ) { while ( true ) {
_ARM_Wait_for_event(); _ARM_Wait_for_event();
} }

View File

@@ -67,11 +67,7 @@ BSP_START_TEXT_SECTION void bsp_start_hook_0(void)
* the fatal errors SMP_FATAL_MULTITASKING_START_ON_INVALID_PROCESSOR and * the fatal errors SMP_FATAL_MULTITASKING_START_ON_INVALID_PROCESSOR and
* SMP_FATAL_MULTITASKING_START_ON_UNASSIGNED_PROCESSOR this way. * SMP_FATAL_MULTITASKING_START_ON_UNASSIGNED_PROCESSOR this way.
*/ */
if ( if (cpu_index_self != 0 && !_SMP_Should_start_processor(cpu_index_self)) {
cpu_index_self != 0 &&
(cpu_index_self >= rtems_configuration_get_maximum_processors() ||
!_SMP_Should_start_processor(cpu_index_self))
) {
while (true) { while (true) {
_ARM_Wait_for_event(); _ARM_Wait_for_event();
} }

View File

@@ -197,9 +197,21 @@ _start:
/* Read MPIDR and get current processor index */ /* Read MPIDR and get current processor index */
mrc p15, 0, r7, c0, c0, 5 mrc p15, 0, r7, c0, c0, 5
and r7, #0xff and r7, #0xff
#endif
#ifdef RTEMS_SMP /*
* Check that this is a configured processor. If not, then there is
* not much what can be done since we do not have a stack available for
* this processor. Just loop forever in this case.
*/
ldr r1, =_SMP_Processor_configured_maximum
ldr r1, [r1]
cmp r1, r7
bgt .Lconfigured_processor
.Linvalid_processor_wait_for_ever:
wfe
b .Linvalid_processor_wait_for_ever
.Lconfigured_processor:
/* /*
* Get current per-CPU control and store it in PL1 only Thread ID * Get current per-CPU control and store it in PL1 only Thread ID
* Register (TPIDRPRW). * Register (TPIDRPRW).