[PATCH 4/5] Adjust interrupt mode tests for some CPU ports

Sebastian Huber sebastian.huber at embedded-brains.de
Tue Jan 8 08:59:34 UTC 2019


In case the robust thread dispatch is enabled by the CPU port, then the
interrupt level must not be changed through the task mode.
---
 cpukit/rtems/src/taskmode.c         |  4 +++-
 cpukit/score/src/threaddispatch.c   |  2 +-
 cpukit/score/src/threadinitialize.c |  4 +++-
 testsuites/sptests/sp08/init.c      | 23 ++++++++++++++++++++---
 testsuites/sptests/sp37/init.c      | 10 +++++++++-
 5 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/cpukit/rtems/src/taskmode.c b/cpukit/rtems/src/taskmode.c
index 1767d7be84..906f86bdcd 100644
--- a/cpukit/rtems/src/taskmode.c
+++ b/cpukit/rtems/src/taskmode.c
@@ -53,11 +53,13 @@ rtems_status_code rtems_task_mode(
   }
 #endif
 
-#if defined(RTEMS_SMP)
+#if defined(RTEMS_SMP) || CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
   if (
     ( mask & RTEMS_INTERRUPT_MASK ) != 0
       && _Modes_Get_interrupt_level( mode_set ) != 0
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == FALSE
       && rtems_configuration_is_smp_enabled()
+#endif
   ) {
     return RTEMS_NOT_IMPLEMENTED;
   }
diff --git a/cpukit/score/src/threaddispatch.c b/cpukit/score/src/threaddispatch.c
index b82fe539c1..fc6a172080 100644
--- a/cpukit/score/src/threaddispatch.c
+++ b/cpukit/score/src/threaddispatch.c
@@ -261,7 +261,7 @@ void _Thread_Do_dispatch( Per_CPU_Control *cpu_self, ISR_Level level )
 #if defined(RTEMS_SCORE_ROBUST_THREAD_DISPATCH)
   if (
     !_ISR_Is_enabled( level )
-#if defined(RTEMS_SMP)
+#if defined(RTEMS_SMP) && CPU_ENABLE_ROBUST_THREAD_DISPATCH == FALSE
       && rtems_configuration_is_smp_enabled()
 #endif
   ) {
diff --git a/cpukit/score/src/threadinitialize.c b/cpukit/score/src/threadinitialize.c
index 2ad4ccd9ed..e2bb694f18 100644
--- a/cpukit/score/src/threadinitialize.c
+++ b/cpukit/score/src/threadinitialize.c
@@ -64,10 +64,12 @@ bool _Thread_Initialize(
   }
 #endif
 
-#if defined(RTEMS_SMP)
+#if defined(RTEMS_SMP) || CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
   if (
     isr_level != 0
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == FALSE
       && rtems_configuration_is_smp_enabled()
+#endif
   ) {
     return false;
   }
diff --git a/testsuites/sptests/sp08/init.c b/testsuites/sptests/sp08/init.c
index 98a7fccdcf..952694a115 100644
--- a/testsuites/sptests/sp08/init.c
+++ b/testsuites/sptests/sp08/init.c
@@ -175,7 +175,7 @@ rtems_task Init(
 /* END OF RTEMS_PREEMPT */
 
 /* BEGINNING OF RTEMS_INTERRUPT_LEVEL */
-#if !defined(RTEMS_SMP)
+#if !defined(RTEMS_SMP) && CPU_ENABLE_ROBUST_THREAD_DISPATCH == FALSE
   status = rtems_task_mode(
     RTEMS_INTERRUPT_LEVEL(3),
     RTEMS_INTERRUPT_MASK,
@@ -197,13 +197,25 @@ rtems_task Init(
     "TA1 - rtems_task_mode - RTEMS_INTERRUPT_LEVEL( 5 ) - previous mode: ",
     previous_mode
   );
+#else
+  status = rtems_task_mode(
+    RTEMS_INTERRUPT_LEVEL( 1 ),
+    RTEMS_INTERRUPT_MASK,
+    &previous_mode
+  );
+  fatal_directive_status( status, RTEMS_NOT_IMPLEMENTED, "rtems_task_mode" );
 #endif
 /* END OF RTEMS_INTERRUPT_LEVEL */
 
 /* BEGINNING OF COMBINATIONS */
 
   status = rtems_task_mode(
-    RTEMS_INTERRUPT_LEVEL(3) | RTEMS_NO_ASR |
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+    RTEMS_INTERRUPT_LEVEL(0) |
+#else
+    RTEMS_INTERRUPT_LEVEL(3) |
+#endif
+      RTEMS_NO_ASR |
       RTEMS_TIMESLICE | RTEMS_NO_PREEMPT,
     RTEMS_INTERRUPT_MASK | RTEMS_ASR_MASK |
       RTEMS_TIMESLICE_MASK | RTEMS_PREEMPT_MASK,
@@ -216,7 +228,12 @@ rtems_task Init(
   );
 
   status = rtems_task_mode(
-    RTEMS_INTERRUPT_LEVEL(3) | RTEMS_NO_ASR |
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+    RTEMS_INTERRUPT_LEVEL(0) |
+#else
+    RTEMS_INTERRUPT_LEVEL(3) |
+#endif
+      RTEMS_NO_ASR |
       RTEMS_TIMESLICE | RTEMS_NO_PREEMPT,
     RTEMS_INTERRUPT_MASK | RTEMS_ASR_MASK |
       RTEMS_TIMESLICE_MASK | RTEMS_PREEMPT_MASK,
diff --git a/testsuites/sptests/sp37/init.c b/testsuites/sptests/sp37/init.c
index dc4867c55c..b050d7f7d1 100644
--- a/testsuites/sptests/sp37/init.c
+++ b/testsuites/sptests/sp37/init.c
@@ -76,11 +76,19 @@ static void test_isr_level_for_new_threads( ISR_Level last_proper_level )
   };
 
   for ( current = 0 ; current <= mask ; ++current ) {
-    rtems_mode initial_modes = RTEMS_INTERRUPT_LEVEL(current);
+    rtems_mode initial_modes;
     rtems_id id;
     rtems_status_code sc;
     rtems_event_set events;
 
+    initial_modes = RTEMS_INTERRUPT_LEVEL(current);
+
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+    if ( initial_modes != 0 ) {
+      break;
+    }
+#endif
+
     ctx.actual_level = 0xffffffff;
 
     sc = rtems_task_create(
-- 
2.16.4



More information about the devel mailing list