From 59472042ec0ef4b501df675f4df75e377994c92c Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 4 Aug 2021 14:21:34 +0200 Subject: 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. --- bsps/arm/fvp/start/bspstarthooks.c | 5 +---- bsps/arm/realview-pbx-a9/start/bspstarthooks.c | 6 +----- bsps/arm/shared/start/start.S | 16 ++++++++++++++-- 3 files changed, 16 insertions(+), 11 deletions(-) (limited to 'bsps/arm') diff --git a/bsps/arm/fvp/start/bspstarthooks.c b/bsps/arm/fvp/start/bspstarthooks.c index f0087efa06..d5e56423f4 100644 --- a/bsps/arm/fvp/start/bspstarthooks.c +++ b/bsps/arm/fvp/start/bspstarthooks.c @@ -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(); } diff --git a/bsps/arm/realview-pbx-a9/start/bspstarthooks.c b/bsps/arm/realview-pbx-a9/start/bspstarthooks.c index 1e386bfd23..9549e7235c 100644 --- a/bsps/arm/realview-pbx-a9/start/bspstarthooks.c +++ b/bsps/arm/realview-pbx-a9/start/bspstarthooks.c @@ -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(); } diff --git a/bsps/arm/shared/start/start.S b/bsps/arm/shared/start/start.S index bc87e7b36d..55b5b8d78c 100644 --- a/bsps/arm/shared/start/start.S +++ b/bsps/arm/shared/start/start.S @@ -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). -- cgit v1.2.3