From b3a4c48ebd1d4cd04dd4390844df840a1c0b9dea Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 17 Feb 2016 14:27:09 +0100 Subject: [PATCH] score: Add _SMP_Online_processors --- cpukit/score/include/rtems/score/smpimpl.h | 11 +++++++++++ cpukit/score/src/smp.c | 5 ++++- testsuites/smptests/smpipi01/init.c | 10 ++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) 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 #include +#include #include #include @@ -90,6 +91,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)