forked from Imagelibrary/rtems
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:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user