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
* and SMP_FATAL_MULTITASKING_START_ON_UNASSIGNED_PROCESSOR this way.
*/
if (
cpu_index_self >= rtems_configuration_get_maximum_processors()
|| !_SMP_Should_start_processor( cpu_index_self )
) {
if ( !_SMP_Should_start_processor( cpu_index_self ) ) {
while ( true ) {
_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
* SMP_FATAL_MULTITASKING_START_ON_UNASSIGNED_PROCESSOR this way.
*/
if (
cpu_index_self != 0 &&
(cpu_index_self >= rtems_configuration_get_maximum_processors() ||
!_SMP_Should_start_processor(cpu_index_self))
) {
if (cpu_index_self != 0 && !_SMP_Should_start_processor(cpu_index_self)) {
while (true) {
_ARM_Wait_for_event();
}

View File

@@ -197,9 +197,21 @@ _start:
/* Read MPIDR and get current processor index */
mrc p15, 0, r7, c0, c0, 5
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
* Register (TPIDRPRW).