summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2020-02-15 11:09:16 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2020-02-25 07:18:35 +0100
commit1ada3e55f695f77452bd4eb6ebb5d7a4054e1edf (patch)
tree2983bb496f6674cc1d6204d21fdca257580f1eeb
parentlibio: Add POSIX user environment pointer to TCB (diff)
downloadrtems-1ada3e55f695f77452bd4eb6ebb5d7a4054e1edf.tar.bz2
score: Add _SMP_Need_inter_processor_interrupts()
Test for the proper system condition instead of using the rtems_configuration_is_smp_enabled() workaround. Update #3876.
-rw-r--r--cpukit/include/rtems/score/smpimpl.h15
-rw-r--r--cpukit/rtems/src/taskmode.c3
-rw-r--r--cpukit/score/src/threaddispatch.c2
-rw-r--r--cpukit/score/src/threadinitialize.c2
4 files changed, 19 insertions, 3 deletions
diff --git a/cpukit/include/rtems/score/smpimpl.h b/cpukit/include/rtems/score/smpimpl.h
index 889ef5be58..dbca09d5cb 100644
--- a/cpukit/include/rtems/score/smpimpl.h
+++ b/cpukit/include/rtems/score/smpimpl.h
@@ -324,6 +324,21 @@ RTEMS_INLINE_ROUTINE const Processor_mask *_SMP_Get_online_processors( void )
#endif
}
+/**
+ * @brief Indicate if inter-processor interrupts are needed.
+ *
+ * @return True if inter-processor interrupts are needed for the correct system
+ * operation, otherwise false.
+ */
+RTEMS_INLINE_ROUTINE const bool _SMP_Need_inter_processor_interrupts( void )
+{
+ /*
+ * Use the configured processor maximum instead of the actual to allow
+ * testing on uni-processor systems.
+ */
+ return _SMP_Processor_configured_maximum > 1;
+}
+
/** @} */
#ifdef __cplusplus
diff --git a/cpukit/rtems/src/taskmode.c b/cpukit/rtems/src/taskmode.c
index 906f86bdcd..8830f6bb5d 100644
--- a/cpukit/rtems/src/taskmode.c
+++ b/cpukit/rtems/src/taskmode.c
@@ -23,6 +23,7 @@
#include <rtems/rtems/modesimpl.h>
#include <rtems/rtems/signalimpl.h>
#include <rtems/score/schedulerimpl.h>
+#include <rtems/score/smpimpl.h>
#include <rtems/score/threadimpl.h>
#include <rtems/config.h>
@@ -58,7 +59,7 @@ rtems_status_code rtems_task_mode(
( mask & RTEMS_INTERRUPT_MASK ) != 0
&& _Modes_Get_interrupt_level( mode_set ) != 0
#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == FALSE
- && rtems_configuration_is_smp_enabled()
+ && _SMP_Need_inter_processor_interrupts()
#endif
) {
return RTEMS_NOT_IMPLEMENTED;
diff --git a/cpukit/score/src/threaddispatch.c b/cpukit/score/src/threaddispatch.c
index 65951cccfe..cd32f5a1d2 100644
--- a/cpukit/score/src/threaddispatch.c
+++ b/cpukit/score/src/threaddispatch.c
@@ -265,7 +265,7 @@ void _Thread_Do_dispatch( Per_CPU_Control *cpu_self, ISR_Level level )
if (
!_ISR_Is_enabled( level )
#if defined(RTEMS_SMP) && CPU_ENABLE_ROBUST_THREAD_DISPATCH == FALSE
- && rtems_configuration_is_smp_enabled()
+ && _SMP_Need_inter_processor_interrupts()
#endif
) {
_Internal_error( INTERNAL_ERROR_BAD_THREAD_DISPATCH_ENVIRONMENT );
diff --git a/cpukit/score/src/threadinitialize.c b/cpukit/score/src/threadinitialize.c
index 4dc6d51d72..976c97701a 100644
--- a/cpukit/score/src/threadinitialize.c
+++ b/cpukit/score/src/threadinitialize.c
@@ -72,7 +72,7 @@ bool _Thread_Initialize(
if (
config->isr_level != 0
#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == FALSE
- && rtems_configuration_is_smp_enabled()
+ && _SMP_Need_inter_processor_interrupts()
#endif
) {
goto failed;