summaryrefslogtreecommitdiffstats
path: root/bsps/arm
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-08-04 14:21:34 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-08-12 10:04:11 +0200
commit59472042ec0ef4b501df675f4df75e377994c92c (patch)
tree166041afc39d65df712115f6c298db494d75c035 /bsps/arm
parentTest needed for timer_create with CLOCK_MONOTONC (diff)
downloadrtems-59472042ec0ef4b501df675f4df75e377994c92c.tar.bz2
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.
Diffstat (limited to 'bsps/arm')
-rw-r--r--bsps/arm/fvp/start/bspstarthooks.c5
-rw-r--r--bsps/arm/realview-pbx-a9/start/bspstarthooks.c6
-rw-r--r--bsps/arm/shared/start/start.S16
3 files changed, 16 insertions, 11 deletions
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).