summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-02-17 14:27:09 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-03-04 13:36:09 +0100
commitb3a4c48ebd1d4cd04dd4390844df840a1c0b9dea (patch)
treef67ce0b4d71b09c8f1a806e7ae268ebc80b49406
parentscore: Rename Per_CPU_Control::started (diff)
downloadrtems-b3a4c48ebd1d4cd04dd4390844df840a1c0b9dea.tar.bz2
score: Add _SMP_Online_processors
-rw-r--r--cpukit/score/include/rtems/score/smpimpl.h11
-rw-r--r--cpukit/score/src/smp.c5
-rw-r--r--testsuites/smptests/smpipi01/init.c10
3 files changed, 25 insertions, 1 deletions
diff --git a/cpukit/score/include/rtems/score/smpimpl.h b/cpukit/score/include/rtems/score/smpimpl.h
index 09c47ecf16..386216fdfc 100644
--- a/cpukit/score/include/rtems/score/smpimpl.h
+++ b/cpukit/score/include/rtems/score/smpimpl.h
@@ -20,6 +20,7 @@
#include <rtems/score/smp.h>
#include <rtems/score/percpu.h>
+#include <rtems/score/processormask.h>
#include <rtems/fatal.h>
#include <rtems/rtems/cache.h>
@@ -91,6 +92,16 @@ static inline void _SMP_Fatal( SMP_Fatal_code code )
#if defined( RTEMS_SMP )
/**
+ * @brief Set of online processors.
+ *
+ * A processor is online if was started during system initialization. In this
+ * case its corresponding bit in the mask is set.
+ *
+ * @see _SMP_Handler_initialize().
+ */
+extern Processor_mask _SMP_Online_processors;
+
+/**
* @brief Performs high-level initialization of a secondary processor and runs
* the application threads.
*
diff --git a/cpukit/score/src/smp.c b/cpukit/score/src/smp.c
index b2713f1272..68a55ffe4d 100644
--- a/cpukit/score/src/smp.c
+++ b/cpukit/score/src/smp.c
@@ -29,6 +29,8 @@
#error "deferred FP switch not implemented for SMP"
#endif
+Processor_mask _SMP_Online_processors;
+
uint32_t _SMP_Processor_count;
static void _SMP_Start_processors( uint32_t cpu_count )
@@ -36,7 +38,6 @@ static void _SMP_Start_processors( uint32_t cpu_count )
uint32_t cpu_index_self = _SMP_Get_current_processor();
uint32_t cpu_index;
-
for ( cpu_index = 0 ; cpu_index < cpu_count; ++cpu_index ) {
const Scheduler_Assignment *assignment =
_Scheduler_Get_assignment( cpu_index );
@@ -69,6 +70,8 @@ static void _SMP_Start_processors( uint32_t cpu_count )
++context->processor_count;
cpu->scheduler_context = context;
+
+ _Processor_mask_Set( _SMP_Online_processors, cpu_index );
}
}
}
diff --git a/testsuites/smptests/smpipi01/init.c b/testsuites/smptests/smpipi01/init.c
index db0688c5ee..8c39d18bfb 100644
--- a/testsuites/smptests/smpipi01/init.c
+++ b/testsuites/smptests/smpipi01/init.c
@@ -161,6 +161,10 @@ static void test_send_message_flood(
}
for (cpu_index = 0; cpu_index < cpu_count; ++cpu_index) {
+ rtems_test_assert(
+ _Processor_mask_Is_set(_SMP_Online_processors, cpu_index)
+ );
+
printf(
"inter-processor interrupts for processor %"
PRIu32 "%s: %" PRIu32 "\n",
@@ -169,6 +173,12 @@ static void test_send_message_flood(
ctx->counters[cpu_index].value
);
}
+
+ for (; cpu_index < CPU_COUNT; ++cpu_index) {
+ rtems_test_assert(
+ !_Processor_mask_Is_set(_SMP_Online_processors, cpu_index)
+ );
+ }
}
static void test(void)