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
|
* 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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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).
|
||||||
|
|||||||
Reference in New Issue
Block a user