<div dir="ltr">There has to be a corresponding documentation patch.<div><br></div><div>--joel</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 29, 2017 at 8:23 AM, Sebastian Huber <span dir="ltr"><<a href="mailto:sebastian.huber@embedded-brains.de" target="_blank">sebastian.huber@embedded-brains.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Update #3056.<br>
---<br>
 cpukit/sapi/include/confdefs.h                     |  24 +<br>
 cpukit/sapi/include/rtems/<wbr>scheduler.h              |  20 +-<br>
 cpukit/score/Makefile.am                           |   2 +<br>
 cpukit/score/include/rtems/<wbr>score/scheduleredfsmp.h | 137 ++++++<br>
 cpukit/score/<a href="http://preinstall.am" rel="noreferrer" target="_blank">preinstall.am</a>                         |   4 +<br>
 cpukit/score/src/<wbr>scheduleredfchangepriority.c      |  16 -<br>
 cpukit/score/src/<wbr>scheduleredfreleasejob.c          |  16 +<br>
 cpukit/score/src/<wbr>scheduleredfsmp.c                 | 499 +++++++++++++++++++++<br>
 testsuites/smptests/Makefile.<wbr>am                    |   1 +<br>
 testsuites/smptests/<a href="http://configure.ac" rel="noreferrer" target="_blank">configure.<wbr>ac</a>                   |   1 +<br>
 testsuites/smptests/<wbr>smpscheduler03/test.c          |   5 +<br>
 testsuites/smptests/<wbr>smpscheduler07/Makefile.am     |  19 +<br>
 testsuites/smptests/<wbr>smpscheduler07/init.c          |  51 +++<br>
 .../smptests/smpscheduler07/<wbr>smpscheduler07.doc     |  11 +<br>
 .../smptests/smpscheduler07/<wbr>smpscheduler07.scn     |   2 +<br>
 15 files changed, 791 insertions(+), 17 deletions(-)<br>
 create mode 100644 cpukit/score/include/rtems/<wbr>score/scheduleredfsmp.h<br>
 create mode 100644 cpukit/score/src/<wbr>scheduleredfsmp.c<br>
 create mode 100644 testsuites/smptests/<wbr>smpscheduler07/Makefile.am<br>
 create mode 100644 testsuites/smptests/<wbr>smpscheduler07/init.c<br>
 create mode 100644 testsuites/smptests/<wbr>smpscheduler07/smpscheduler07.<wbr>doc<br>
 create mode 100644 testsuites/smptests/<wbr>smpscheduler07/smpscheduler07.<wbr>scn<br>
<br>
diff --git a/cpukit/sapi/include/<wbr>confdefs.h b/cpukit/sapi/include/<wbr>confdefs.h<br>
index 604539b5e8..77b80d1cce 100755<br>
--- a/cpukit/sapi/include/<wbr>confdefs.h<br>
+++ b/cpukit/sapi/include/<wbr>confdefs.h<br>
@@ -780,6 +780,7 @@ extern rtems_initialization_tasks_<wbr>table Initialization_tasks[];<br>
  *  - CONFIGURE_SCHEDULER_SIMPLE - Light-weight Priority Scheduler<br>
  *  - CONFIGURE_SCHEDULER_SIMPLE_SMP - Simple SMP Priority Scheduler<br>
  *  - CONFIGURE_SCHEDULER_EDF - EDF Scheduler<br>
+ *  - CONFIGURE_SCHEDULER_EDF_SMP - EDF SMP Scheduler<br>
  *  - CONFIGURE_SCHEDULER_CBS - CBS Scheduler<br>
  *  - CONFIGURE_SCHEDULER_USER  - user provided scheduler<br>
  *<br>
@@ -805,6 +806,7 @@ extern rtems_initialization_tasks_<wbr>table Initialization_tasks[];<br>
     !defined(CONFIGURE_SCHEDULER_<wbr>SIMPLE) && \<br>
     !defined(CONFIGURE_SCHEDULER_<wbr>SIMPLE_SMP) && \<br>
     !defined(CONFIGURE_SCHEDULER_<wbr>EDF) && \<br>
+    !defined(CONFIGURE_SCHEDULER_<wbr>EDF_SMP) && \<br>
     !defined(CONFIGURE_SCHEDULER_<wbr>CBS)<br>
   #if defined(RTEMS_SMP) && CONFIGURE_MAXIMUM_PROCESSORS > 1<br>
     /**<br>
@@ -980,6 +982,25 @@ extern rtems_initialization_tasks_<wbr>table Initialization_tasks[];<br>
 #endif<br>
<br>
 /*<br>
+ * If the EDF SMP Scheduler is selected, then configure for it.<br>
+ */<br>
+#if defined(CONFIGURE_SCHEDULER_<wbr>EDF_SMP)<br>
+  #if !defined(CONFIGURE_SCHEDULER_<wbr>NAME)<br>
+    /** Configure the name of the scheduler instance */<br>
+    #define CONFIGURE_SCHEDULER_NAME rtems_build_name('M', 'E', 'D', 'F')<br>
+  #endif<br>
+<br>
+  #if !defined(CONFIGURE_SCHEDULER_<wbr>CONTROLS)<br>
+    /** Configure the context needed by the scheduler instance */<br>
+    #define CONFIGURE_SCHEDULER_CONTEXT RTEMS_SCHEDULER_CONTEXT_EDF_<wbr>SMP(dflt)<br>
+<br>
+    /** Configure the controls for this scheduler instance */<br>
+    #define CONFIGURE_SCHEDULER_CONTROLS \<br>
+      RTEMS_SCHEDULER_CONTROL_EDF_<wbr>SMP(dflt, CONFIGURE_SCHEDULER_NAME)<br>
+  #endif<br>
+#endif<br>
+<br>
+/*<br>
  * If the CBS Scheduler is selected, then configure for it.<br>
  */<br>
 #if defined(CONFIGURE_SCHEDULER_<wbr>CBS)<br>
@@ -3151,6 +3172,9 @@ extern rtems_initialization_tasks_<wbr>table Initialization_tasks[];<br>
     #ifdef CONFIGURE_SCHEDULER_EDF<br>
       Scheduler_EDF_Node EDF;<br>
     #endif<br>
+    #ifdef CONFIGURE_SCHEDULER_EDF_SMP<br>
+      Scheduler_EDF_SMP_Node EDF_SMP;<br>
+    #endif<br>
     #ifdef CONFIGURE_SCHEDULER_PRIORITY<br>
       Scheduler_priority_Node Priority;<br>
     #endif<br>
diff --git a/cpukit/sapi/include/rtems/<wbr>scheduler.h b/cpukit/sapi/include/rtems/<wbr>scheduler.h<br>
index 0b20aab55e..fae0db4913 100644<br>
--- a/cpukit/sapi/include/rtems/<wbr>scheduler.h<br>
+++ b/cpukit/sapi/include/rtems/<wbr>scheduler.h<br>
@@ -5,7 +5,7 @@<br>
  */<br>
<br>
 /*<br>
- * Copyright (c) 2014, 2016 embedded brains GmbH.  All rights reserved.<br>
+ * Copyright (c) 2014, 2017 embedded brains GmbH.  All rights reserved.<br>
  *<br>
  *  embedded brains GmbH<br>
  *  Dornierstr. 4<br>
@@ -93,6 +93,24 @@<br>
     }<br>
 #endif<br>
<br>
+#ifdef CONFIGURE_SCHEDULER_EDF_SMP<br>
+  #include <rtems/score/scheduleredfsmp.<wbr>h><br>
+<br>
+  #define RTEMS_SCHEDULER_CONTEXT_EDF_<wbr>SMP_NAME( name ) \<br>
+    RTEMS_SCHEDULER_CONTEXT_NAME( EDF_SMP_ ## name )<br>
+<br>
+  #define RTEMS_SCHEDULER_CONTEXT_EDF_<wbr>SMP( name ) \<br>
+    static Scheduler_EDF_SMP_Context RTEMS_SCHEDULER_CONTEXT_EDF_<wbr>SMP_NAME( name )<br>
+<br>
+  #define RTEMS_SCHEDULER_CONTROL_EDF_<wbr>SMP( name, obj_name ) \<br>
+    { \<br>
+      &RTEMS_SCHEDULER_CONTEXT_EDF_<wbr>SMP_NAME( name ).Base.Base, \<br>
+      SCHEDULER_EDF_SMP_ENTRY_<wbr>POINTS, \<br>
+      SCHEDULER_EDF_MAXIMUM_<wbr>PRIORITY, \<br>
+      ( obj_name ) \<br>
+    }<br>
+#endif<br>
+<br>
 #ifdef CONFIGURE_SCHEDULER_PRIORITY<br>
   #include <rtems/score/<wbr>schedulerpriority.h><br>
<br>
diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am<br>
index a3de792fdf..46b441737f 100644<br>
--- a/cpukit/score/Makefile.am<br>
+++ b/cpukit/score/Makefile.am<br>
@@ -126,6 +126,7 @@ include_rtems_score_HEADERS += include/rtems/score/threadmp.h<br>
 endif<br>
<br>
 if HAS_SMP<br>
+include_rtems_score_HEADERS += include/rtems/score/<wbr>scheduleredfsmp.h<br>
 include_rtems_score_HEADERS += include/rtems/score/<wbr>schedulerprioritysmpimpl.h<br>
 include_rtems_score_HEADERS += include/rtems/score/<wbr>schedulerpriorityaffinitysmp.h<br>
 include_rtems_score_HEADERS += include/rtems/score/<wbr>schedulersimplesmp.h<br>
@@ -149,6 +150,7 @@ endif<br>
 if HAS_SMP<br>
 libscore_a_SOURCES += src/percpustatewait.c<br>
 libscore_a_SOURCES += src/profilingsmplock.c<br>
+libscore_a_SOURCES += src/scheduleredfsmp.c<br>
 libscore_a_SOURCES += src/<wbr>schedulerpriorityaffinitysmp.c<br>
 libscore_a_SOURCES += src/schedulerprioritysmp.c<br>
 libscore_a_SOURCES += src/schedulersimplesmp.c<br>
diff --git a/cpukit/score/include/rtems/<wbr>score/scheduleredfsmp.h b/cpukit/score/include/rtems/<wbr>score/scheduleredfsmp.h<br>
new file mode 100644<br>
index 0000000000..8f6e85777a<br>
--- /dev/null<br>
+++ b/cpukit/score/include/rtems/<wbr>score/scheduleredfsmp.h<br>
@@ -0,0 +1,137 @@<br>
+/**<br>
+ * @file<br>
+ *<br>
+ * @brief EDF SMP Scheduler API<br>
+ *<br>
+ * @ingroup ScoreSchedulerSMPEDF<br>
+ */<br>
+<br>
+/*<br>
+ * Copyright (c) 2017 embedded brains GmbH.<br>
+ *<br>
+ * The license and distribution terms for this file may be<br>
+ * found in the file LICENSE in this distribution or at<br>
+ * <a href="http://www.rtems.org/license/LICENSE" rel="noreferrer" target="_blank">http://www.rtems.org/license/<wbr>LICENSE</a>.<br>
+ */<br>
+<br>
+#ifndef _RTEMS_SCORE_SCHEDULEREDFSMP_H<br>
+#define _RTEMS_SCORE_SCHEDULEREDFSMP_H<br>
+<br>
+#include <rtems/score/scheduler.h><br>
+#include <rtems/score/scheduleredf.h><br>
+#include <rtems/score/schedulersmp.h><br>
+<br>
+#ifdef __cplusplus<br>
+extern "C" {<br>
+#endif<br>
+<br>
+/**<br>
+ * @defgroup ScoreSchedulerSMPEDF EDF Priority SMP Scheduler<br>
+ *<br>
+ * @ingroup ScoreSchedulerSMP<br>
+ *<br>
+ * @{<br>
+ */<br>
+<br>
+typedef struct {<br>
+  Scheduler_SMP_Context Base;<br>
+  RBTree_Control        Ready;<br>
+} Scheduler_EDF_SMP_Context;<br>
+<br>
+typedef struct {<br>
+  Scheduler_SMP_Node Base;<br>
+} Scheduler_EDF_SMP_Node;<br>
+<br>
+#define SCHEDULER_EDF_SMP_ENTRY_POINTS \<br>
+  { \<br>
+    _Scheduler_EDF_SMP_Initialize, \<br>
+    _Scheduler_default_Schedule, \<br>
+    _Scheduler_EDF_SMP_Yield, \<br>
+    _Scheduler_EDF_SMP_Block, \<br>
+    _Scheduler_EDF_SMP_Unblock, \<br>
+    _Scheduler_EDF_SMP_Update_<wbr>priority, \<br>
+    _Scheduler_EDF_Map_priority, \<br>
+    _Scheduler_EDF_Unmap_priority, \<br>
+    _Scheduler_EDF_SMP_Ask_for_<wbr>help, \<br>
+    _Scheduler_EDF_SMP_Reconsider_<wbr>help_request, \<br>
+    _Scheduler_EDF_SMP_Withdraw_<wbr>node, \<br>
+    _Scheduler_EDF_SMP_Add_<wbr>processor, \<br>
+    _Scheduler_EDF_SMP_Remove_<wbr>processor, \<br>
+    _Scheduler_EDF_SMP_Node_<wbr>initialize, \<br>
+    _Scheduler_default_Node_<wbr>destroy, \<br>
+    _Scheduler_EDF_Release_job, \<br>
+    _Scheduler_EDF_Cancel_job, \<br>
+    _Scheduler_default_Tick, \<br>
+    _Scheduler_SMP_Start_idle \<br>
+    SCHEDULER_OPERATION_DEFAULT_<wbr>GET_SET_AFFINITY \<br>
+  }<br>
+<br>
+void _Scheduler_EDF_SMP_Initialize( const Scheduler_Control *scheduler );<br>
+<br>
+void _Scheduler_EDF_SMP_Node_<wbr>initialize(<br>
+  const Scheduler_Control *scheduler,<br>
+  Scheduler_Node          *node,<br>
+  Thread_Control          *the_thread,<br>
+  Priority_Control         priority<br>
+);<br>
+<br>
+void _Scheduler_EDF_SMP_Block(<br>
+  const Scheduler_Control *scheduler,<br>
+  Thread_Control          *thread,<br>
+  Scheduler_Node          *node<br>
+);<br>
+<br>
+void _Scheduler_EDF_SMP_Unblock(<br>
+  const Scheduler_Control *scheduler,<br>
+  Thread_Control          *thread,<br>
+  Scheduler_Node          *node<br>
+);<br>
+<br>
+void _Scheduler_EDF_SMP_Update_<wbr>priority(<br>
+  const Scheduler_Control *scheduler,<br>
+  Thread_Control          *the_thread,<br>
+  Scheduler_Node          *node<br>
+);<br>
+<br>
+bool _Scheduler_EDF_SMP_Ask_for_<wbr>help(<br>
+  const Scheduler_Control *scheduler,<br>
+  Thread_Control          *the_thread,<br>
+  Scheduler_Node          *node<br>
+);<br>
+<br>
+void _Scheduler_EDF_SMP_Reconsider_<wbr>help_request(<br>
+  const Scheduler_Control *scheduler,<br>
+  Thread_Control          *the_thread,<br>
+  Scheduler_Node          *node<br>
+);<br>
+<br>
+void _Scheduler_EDF_SMP_Withdraw_<wbr>node(<br>
+  const Scheduler_Control *scheduler,<br>
+  Thread_Control          *the_thread,<br>
+  Scheduler_Node          *node,<br>
+  Thread_Scheduler_state   next_state<br>
+);<br>
+<br>
+void _Scheduler_EDF_SMP_Add_<wbr>processor(<br>
+  const Scheduler_Control *scheduler,<br>
+  Thread_Control          *idle<br>
+);<br>
+<br>
+Thread_Control *_Scheduler_EDF_SMP_Remove_<wbr>processor(<br>
+  const Scheduler_Control *scheduler,<br>
+  struct Per_CPU_Control  *cpu<br>
+);<br>
+<br>
+void _Scheduler_EDF_SMP_Yield(<br>
+  const Scheduler_Control *scheduler,<br>
+  Thread_Control          *thread,<br>
+  Scheduler_Node          *node<br>
+);<br>
+<br>
+/** @} */<br>
+<br>
+#ifdef __cplusplus<br>
+}<br>
+#endif<br>
+<br>
+#endif /* _RTEMS_SCORE_SCHEDULEREDFSMP_H */<br>
diff --git a/cpukit/score/<a href="http://preinstall.am" rel="noreferrer" target="_blank">preinstall.am</a> b/cpukit/score/<a href="http://preinstall.am" rel="noreferrer" target="_blank">preinstall.am</a><br>
index 4d468e5dde..da231541b0 100644<br>
--- a/cpukit/score/<a href="http://preinstall.am" rel="noreferrer" target="_blank">preinstall.am</a><br>
+++ b/cpukit/score/<a href="http://preinstall.am" rel="noreferrer" target="_blank">preinstall.am</a><br>
@@ -439,6 +439,10 @@ $(PROJECT_INCLUDE)/rtems/<wbr>score/threadmp.h: include/rtems/score/threadmp.h $(PROJ<br>
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/<wbr>score/threadmp.h<br>
 endif<br>
 if HAS_SMP<br>
+$(PROJECT_INCLUDE)/rtems/<wbr>score/scheduleredfsmp.h: include/rtems/score/<wbr>scheduleredfsmp.h $(PROJECT_INCLUDE)/rtems/<wbr>score/$(dirstamp)<br>
+       $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/<wbr>score/scheduleredfsmp.h<br>
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/<wbr>score/scheduleredfsmp.h<br>
+<br>
 $(PROJECT_INCLUDE)/rtems/<wbr>score/<wbr>schedulerprioritysmpimpl.h: include/rtems/score/<wbr>schedulerprioritysmpimpl.h $(PROJECT_INCLUDE)/rtems/<wbr>score/$(dirstamp)<br>
        $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/<wbr>score/<wbr>schedulerprioritysmpimpl.h<br>
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/<wbr>score/<wbr>schedulerprioritysmpimpl.h<br>
diff --git a/cpukit/score/src/<wbr>scheduleredfchangepriority.c b/cpukit/score/src/<wbr>scheduleredfchangepriority.c<br>
index 0b70bce012..23382973cc 100644<br>
--- a/cpukit/score/src/<wbr>scheduleredfchangepriority.c<br>
+++ b/cpukit/score/src/<wbr>scheduleredfchangepriority.c<br>
@@ -20,22 +20,6 @@<br>
<br>
 #include <rtems/score/scheduleredfimpl.<wbr>h><br>
<br>
-Priority_Control _Scheduler_EDF_Map_priority(<br>
-  const Scheduler_Control *scheduler,<br>
-  Priority_Control         priority<br>
-)<br>
-{<br>
-  return SCHEDULER_EDF_PRIO_MSB | priority;<br>
-}<br>
-<br>
-Priority_Control _Scheduler_EDF_Unmap_priority(<br>
-  const Scheduler_Control *scheduler,<br>
-  Priority_Control         priority<br>
-)<br>
-{<br>
-  return priority & ~SCHEDULER_EDF_PRIO_MSB;<br>
-}<br>
-<br>
 void _Scheduler_EDF_Update_<wbr>priority(<br>
   const Scheduler_Control *scheduler,<br>
   Thread_Control          *the_thread,<br>
diff --git a/cpukit/score/src/<wbr>scheduleredfreleasejob.c b/cpukit/score/src/<wbr>scheduleredfreleasejob.c<br>
index c19d9b9d24..068a0db7a3 100644<br>
--- a/cpukit/score/src/<wbr>scheduleredfreleasejob.c<br>
+++ b/cpukit/score/src/<wbr>scheduleredfreleasejob.c<br>
@@ -20,6 +20,22 @@<br>
<br>
 #include <rtems/score/scheduleredfimpl.<wbr>h><br>
<br>
+Priority_Control _Scheduler_EDF_Map_priority(<br>
+  const Scheduler_Control *scheduler,<br>
+  Priority_Control         priority<br>
+)<br>
+{<br>
+  return SCHEDULER_EDF_PRIO_MSB | priority;<br>
+}<br>
+<br>
+Priority_Control _Scheduler_EDF_Unmap_priority(<br>
+  const Scheduler_Control *scheduler,<br>
+  Priority_Control         priority<br>
+)<br>
+{<br>
+  return priority & ~SCHEDULER_EDF_PRIO_MSB;<br>
+}<br>
+<br>
 void _Scheduler_EDF_Release_job(<br>
   const Scheduler_Control *scheduler,<br>
   Thread_Control          *the_thread,<br>
diff --git a/cpukit/score/src/<wbr>scheduleredfsmp.c b/cpukit/score/src/<wbr>scheduleredfsmp.c<br>
new file mode 100644<br>
index 0000000000..270f9a44e9<br>
--- /dev/null<br>
+++ b/cpukit/score/src/<wbr>scheduleredfsmp.c<br>
@@ -0,0 +1,499 @@<br>
+/**<br>
+ * @file<br>
+ *<br>
+ * @brief EDF SMP Scheduler Implementation<br>
+ *<br>
+ * @ingroup ScoreSchedulerSMPEDF<br>
+ */<br>
+<br>
+/*<br>
+ * Copyright (c) 2017 embedded brains GmbH.<br>
+ *<br>
+ * The license and distribution terms for this file may be<br>
+ * found in the file LICENSE in this distribution or at<br>
+ * <a href="http://www.rtems.org/license/LICENSE" rel="noreferrer" target="_blank">http://www.rtems.org/license/<wbr>LICENSE</a>.<br>
+ */<br>
+<br>
+#if HAVE_CONFIG_H<br>
+  #include "config.h"<br>
+#endif<br>
+<br>
+#include <rtems/score/scheduleredfsmp.<wbr>h><br>
+#include <rtems/score/schedulersmpimpl.<wbr>h><br>
+<br>
+static Scheduler_EDF_SMP_Context *<br>
+_Scheduler_EDF_SMP_Get_<wbr>context( const Scheduler_Control *scheduler )<br>
+{<br>
+  return (Scheduler_EDF_SMP_Context *) _Scheduler_Get_context( scheduler );<br>
+}<br>
+<br>
+static Scheduler_EDF_SMP_Context *<br>
+_Scheduler_EDF_SMP_Get_self( Scheduler_Context *context )<br>
+{<br>
+  return (Scheduler_EDF_SMP_Context *) context;<br>
+}<br>
+<br>
+static inline Scheduler_EDF_SMP_Node *<br>
+_Scheduler_EDF_SMP_Node_<wbr>downcast( Scheduler_Node *node )<br>
+{<br>
+  return (Scheduler_EDF_SMP_Node *) node;<br>
+}<br>
+<br>
+static inline bool _Scheduler_EDF_SMP_Less(<br>
+  const void        *left,<br>
+  const RBTree_Node *right<br>
+)<br>
+{<br>
+  const Priority_Control   *the_left;<br>
+  const Scheduler_SMP_Node *the_right;<br>
+  Priority_Control          prio_left;<br>
+  Priority_Control          prio_right;<br>
+<br>
+  the_left = left;<br>
+  the_right = RTEMS_CONTAINER_OF( right, Scheduler_SMP_Node, Base.Node.RBTree );<br>
+<br>
+  prio_left = *the_left;<br>
+  prio_right = the_right->priority;<br>
+<br>
+  return prio_left < prio_right;<br>
+}<br>
+<br>
+static inline bool _Scheduler_EDF_SMP_Less_or_<wbr>equal(<br>
+  const void        *left,<br>
+  const RBTree_Node *right<br>
+)<br>
+{<br>
+  const Priority_Control   *the_left;<br>
+  const Scheduler_SMP_Node *the_right;<br>
+  Priority_Control          prio_left;<br>
+  Priority_Control          prio_right;<br>
+<br>
+  the_left = left;<br>
+  the_right = RTEMS_CONTAINER_OF( right, Scheduler_SMP_Node, Base.Node.RBTree );<br>
+<br>
+  prio_left = *the_left;<br>
+  prio_right = the_right->priority;<br>
+<br>
+  return prio_left <= prio_right;<br>
+}<br>
+<br>
+void _Scheduler_EDF_SMP_Initialize( const Scheduler_Control *scheduler )<br>
+{<br>
+  Scheduler_EDF_SMP_Context *self =<br>
+    _Scheduler_EDF_SMP_Get_<wbr>context( scheduler );<br>
+<br>
+  _Scheduler_SMP_Initialize( &self->Base );<br>
+  _RBTree_Initialize_empty( &self->Ready );<br>
+}<br>
+<br>
+void _Scheduler_EDF_SMP_Node_<wbr>initialize(<br>
+  const Scheduler_Control *scheduler,<br>
+  Scheduler_Node          *node,<br>
+  Thread_Control          *the_thread,<br>
+  Priority_Control         priority<br>
+)<br>
+{<br>
+  Scheduler_SMP_Node *smp_node;<br>
+<br>
+  smp_node = _Scheduler_SMP_Node_downcast( node );<br>
+  _Scheduler_SMP_Node_<wbr>initialize( scheduler, smp_node, the_thread, priority );<br>
+}<br>
+<br>
+static void _Scheduler_EDF_SMP_Do_update(<br>
+  Scheduler_Context *context,<br>
+  Scheduler_Node    *node,<br>
+  Priority_Control   new_priority<br>
+)<br>
+{<br>
+  Scheduler_SMP_Node *smp_node;<br>
+<br>
+  (void) context;<br>
+<br>
+  smp_node = _Scheduler_SMP_Node_downcast( node );<br>
+  _Scheduler_SMP_Node_update_<wbr>priority( smp_node, new_priority );<br>
+}<br>
+<br>
+static bool _Scheduler_EDF_SMP_Has_ready( Scheduler_Context *context )<br>
+{<br>
+  Scheduler_EDF_SMP_Context *self =<br>
+    _Scheduler_EDF_SMP_Get_self( context );<br>
+<br>
+  return !_RBTree_Is_empty( &self->Ready );<br>
+}<br>
+<br>
+static Scheduler_Node *_Scheduler_EDF_SMP_Get_<wbr>highest_ready(<br>
+  Scheduler_Context *context,<br>
+  Scheduler_Node    *node<br>
+)<br>
+{<br>
+  Scheduler_EDF_SMP_Context *self =<br>
+    _Scheduler_EDF_SMP_Get_self( context );<br>
+  Scheduler_Node *first = (Scheduler_Node *) _RBTree_Minimum( &self->Ready );<br>
+<br>
+  (void) node;<br>
+<br>
+  _Assert( &first->Node != NULL );<br>
+<br>
+  return first;<br>
+}<br>
+<br>
+static void _Scheduler_EDF_SMP_Move_from_<wbr>scheduled_to_ready(<br>
+  Scheduler_Context *context,<br>
+  Scheduler_Node    *scheduled_to_ready<br>
+)<br>
+{<br>
+  Scheduler_EDF_SMP_Context *self =<br>
+    _Scheduler_EDF_SMP_Get_self( context );<br>
+  Scheduler_EDF_SMP_Node *node =<br>
+    _Scheduler_EDF_SMP_Node_<wbr>downcast( scheduled_to_ready );<br>
+<br>
+  _Chain_Extract_unprotected( &node->Base.Base.Node.Chain );<br>
+  _RBTree_Initialize_node( &node->Base.Base.Node.RBTree );<br>
+  _RBTree_Insert_inline(<br>
+    &self->Ready,<br>
+    &node->Base.Base.Node.RBTree,<br>
+    &node->Base.priority,<br>
+    _Scheduler_EDF_SMP_Less<br>
+  );<br>
+}<br>
+<br>
+static void _Scheduler_EDF_SMP_Move_from_<wbr>ready_to_scheduled(<br>
+  Scheduler_Context *context,<br>
+  Scheduler_Node    *ready_to_scheduled<br>
+)<br>
+{<br>
+  Scheduler_EDF_SMP_Context *self =<br>
+    _Scheduler_EDF_SMP_Get_self( context );<br>
+  Scheduler_EDF_SMP_Node *node =<br>
+    _Scheduler_EDF_SMP_Node_<wbr>downcast( ready_to_scheduled );<br>
+<br>
+  _RBTree_Extract( &self->Ready, &node->Base.Base.Node.RBTree );<br>
+  _Chain_Initialize_node( &node->Base.Base.Node.Chain );<br>
+  _Chain_Insert_ordered_<wbr>unprotected(<br>
+    &self->Base.Scheduled,<br>
+    &node->Base.Base.Node.Chain,<br>
+    _Scheduler_SMP_Insert_<wbr>priority_fifo_order<br>
+  );<br>
+}<br>
+<br>
+static void _Scheduler_EDF_SMP_Insert_<wbr>ready_lifo(<br>
+  Scheduler_Context *context,<br>
+  Scheduler_Node    *node_to_insert<br>
+)<br>
+{<br>
+  Scheduler_EDF_SMP_Context *self =<br>
+    _Scheduler_EDF_SMP_Get_self( context );<br>
+  Scheduler_EDF_SMP_Node *node =<br>
+    _Scheduler_EDF_SMP_Node_<wbr>downcast( node_to_insert );<br>
+<br>
+  _RBTree_Initialize_node( &node->Base.Base.Node.RBTree );<br>
+  _RBTree_Insert_inline(<br>
+    &self->Ready,<br>
+    &node->Base.Base.Node.RBTree,<br>
+    &node->Base.priority,<br>
+    _Scheduler_EDF_SMP_Less_or_<wbr>equal<br>
+  );<br>
+}<br>
+<br>
+static void _Scheduler_EDF_SMP_Insert_<wbr>ready_fifo(<br>
+  Scheduler_Context *context,<br>
+  Scheduler_Node    *node_to_insert<br>
+)<br>
+{<br>
+  Scheduler_EDF_SMP_Context *self =<br>
+    _Scheduler_EDF_SMP_Get_self( context );<br>
+  Scheduler_EDF_SMP_Node *node =<br>
+    _Scheduler_EDF_SMP_Node_<wbr>downcast( node_to_insert );<br>
+<br>
+  _RBTree_Initialize_node( &node->Base.Base.Node.RBTree );<br>
+  _RBTree_Insert_inline(<br>
+    &self->Ready,<br>
+    &node->Base.Base.Node.RBTree,<br>
+    &node->Base.priority,<br>
+    _Scheduler_EDF_SMP_Less<br>
+  );<br>
+}<br>
+<br>
+static void _Scheduler_EDF_SMP_Extract_<wbr>from_ready(<br>
+  Scheduler_Context *context,<br>
+  Scheduler_Node    *node_to_extract<br>
+)<br>
+{<br>
+  Scheduler_EDF_SMP_Context *self =<br>
+    _Scheduler_EDF_SMP_Get_self( context );<br>
+  Scheduler_EDF_SMP_Node *node =<br>
+    _Scheduler_EDF_SMP_Node_<wbr>downcast( node_to_extract );<br>
+<br>
+  _RBTree_Extract( &self->Ready, &node->Base.Base.Node.RBTree );<br>
+  _Chain_Initialize_node( &node->Base.Base.Node.Chain );<br>
+}<br>
+<br>
+void _Scheduler_EDF_SMP_Block(<br>
+  const Scheduler_Control *scheduler,<br>
+  Thread_Control          *thread,<br>
+  Scheduler_Node          *node<br>
+)<br>
+{<br>
+  Scheduler_Context *context = _Scheduler_Get_context( scheduler );<br>
+<br>
+  _Scheduler_SMP_Block(<br>
+    context,<br>
+    thread,<br>
+    node,<br>
+    _Scheduler_EDF_SMP_Extract_<wbr>from_ready,<br>
+    _Scheduler_EDF_SMP_Get_<wbr>highest_ready,<br>
+    _Scheduler_EDF_SMP_Move_from_<wbr>ready_to_scheduled,<br>
+    _Scheduler_SMP_Allocate_<wbr>processor_lazy<br>
+  );<br>
+}<br>
+<br>
+static bool _Scheduler_EDF_SMP_Enqueue_<wbr>ordered(<br>
+  Scheduler_Context    *context,<br>
+  Scheduler_Node       *node,<br>
+  Chain_Node_order      order,<br>
+  Scheduler_SMP_Insert  insert_ready,<br>
+  Scheduler_SMP_Insert  insert_scheduled<br>
+)<br>
+{<br>
+  return _Scheduler_SMP_Enqueue_<wbr>ordered(<br>
+    context,<br>
+    node,<br>
+    order,<br>
+    insert_ready,<br>
+    insert_scheduled,<br>
+    _Scheduler_EDF_SMP_Move_from_<wbr>scheduled_to_ready,<br>
+    _Scheduler_SMP_Get_lowest_<wbr>scheduled,<br>
+    _Scheduler_SMP_Allocate_<wbr>processor_lazy<br>
+  );<br>
+}<br>
+<br>
+static bool _Scheduler_EDF_SMP_Enqueue_<wbr>lifo(<br>
+  Scheduler_Context *context,<br>
+  Scheduler_Node    *node<br>
+)<br>
+{<br>
+  return _Scheduler_EDF_SMP_Enqueue_<wbr>ordered(<br>
+    context,<br>
+    node,<br>
+    _Scheduler_SMP_Insert_<wbr>priority_lifo_order,<br>
+    _Scheduler_EDF_SMP_Insert_<wbr>ready_lifo,<br>
+    _Scheduler_SMP_Insert_<wbr>scheduled_lifo<br>
+  );<br>
+}<br>
+<br>
+static bool _Scheduler_EDF_SMP_Enqueue_<wbr>fifo(<br>
+  Scheduler_Context *context,<br>
+  Scheduler_Node    *node<br>
+)<br>
+{<br>
+  return _Scheduler_EDF_SMP_Enqueue_<wbr>ordered(<br>
+    context,<br>
+    node,<br>
+    _Scheduler_SMP_Insert_<wbr>priority_fifo_order,<br>
+    _Scheduler_EDF_SMP_Insert_<wbr>ready_fifo,<br>
+    _Scheduler_SMP_Insert_<wbr>scheduled_fifo<br>
+  );<br>
+}<br>
+<br>
+static bool _Scheduler_EDF_SMP_Enqueue_<wbr>scheduled_ordered(<br>
+  Scheduler_Context *context,<br>
+  Scheduler_Node *node,<br>
+  Chain_Node_order order,<br>
+  Scheduler_SMP_Insert insert_ready,<br>
+  Scheduler_SMP_Insert insert_scheduled<br>
+)<br>
+{<br>
+  return _Scheduler_SMP_Enqueue_<wbr>scheduled_ordered(<br>
+    context,<br>
+    node,<br>
+    order,<br>
+    _Scheduler_EDF_SMP_Extract_<wbr>from_ready,<br>
+    _Scheduler_EDF_SMP_Get_<wbr>highest_ready,<br>
+    insert_ready,<br>
+    insert_scheduled,<br>
+    _Scheduler_EDF_SMP_Move_from_<wbr>ready_to_scheduled,<br>
+    _Scheduler_SMP_Allocate_<wbr>processor_lazy<br>
+  );<br>
+}<br>
+<br>
+static bool _Scheduler_EDF_SMP_Enqueue_<wbr>scheduled_lifo(<br>
+  Scheduler_Context *context,<br>
+  Scheduler_Node *node<br>
+)<br>
+{<br>
+  return _Scheduler_EDF_SMP_Enqueue_<wbr>scheduled_ordered(<br>
+    context,<br>
+    node,<br>
+    _Scheduler_SMP_Insert_<wbr>priority_lifo_order,<br>
+    _Scheduler_EDF_SMP_Insert_<wbr>ready_lifo,<br>
+    _Scheduler_SMP_Insert_<wbr>scheduled_lifo<br>
+  );<br>
+}<br>
+<br>
+static bool _Scheduler_EDF_SMP_Enqueue_<wbr>scheduled_fifo(<br>
+  Scheduler_Context *context,<br>
+  Scheduler_Node *node<br>
+)<br>
+{<br>
+  return _Scheduler_EDF_SMP_Enqueue_<wbr>scheduled_ordered(<br>
+    context,<br>
+    node,<br>
+    _Scheduler_SMP_Insert_<wbr>priority_fifo_order,<br>
+    _Scheduler_EDF_SMP_Insert_<wbr>ready_fifo,<br>
+    _Scheduler_SMP_Insert_<wbr>scheduled_fifo<br>
+  );<br>
+}<br>
+<br>
+void _Scheduler_EDF_SMP_Unblock(<br>
+  const Scheduler_Control *scheduler,<br>
+  Thread_Control          *thread,<br>
+  Scheduler_Node          *node<br>
+)<br>
+{<br>
+  Scheduler_Context *context = _Scheduler_Get_context( scheduler );<br>
+<br>
+  _Scheduler_SMP_Unblock(<br>
+    context,<br>
+    thread,<br>
+    node,<br>
+    _Scheduler_EDF_SMP_Do_update,<br>
+    _Scheduler_EDF_SMP_Enqueue_<wbr>fifo<br>
+  );<br>
+}<br>
+<br>
+static bool _Scheduler_EDF_SMP_Do_ask_for_<wbr>help(<br>
+  Scheduler_Context *context,<br>
+  Thread_Control    *the_thread,<br>
+  Scheduler_Node    *node<br>
+)<br>
+{<br>
+  return _Scheduler_SMP_Ask_for_help(<br>
+    context,<br>
+    the_thread,<br>
+    node,<br>
+    _Scheduler_SMP_Insert_<wbr>priority_lifo_order,<br>
+    _Scheduler_EDF_SMP_Insert_<wbr>ready_lifo,<br>
+    _Scheduler_SMP_Insert_<wbr>scheduled_lifo,<br>
+    _Scheduler_EDF_SMP_Move_from_<wbr>scheduled_to_ready,<br>
+    _Scheduler_SMP_Get_lowest_<wbr>scheduled,<br>
+    _Scheduler_SMP_Allocate_<wbr>processor_lazy<br>
+  );<br>
+}<br>
+<br>
+void _Scheduler_EDF_SMP_Update_<wbr>priority(<br>
+  const Scheduler_Control *scheduler,<br>
+  Thread_Control          *thread,<br>
+  Scheduler_Node          *node<br>
+)<br>
+{<br>
+  Scheduler_Context *context = _Scheduler_Get_context( scheduler );<br>
+<br>
+  _Scheduler_SMP_Update_<wbr>priority(<br>
+    context,<br>
+    thread,<br>
+    node,<br>
+    _Scheduler_EDF_SMP_Extract_<wbr>from_ready,<br>
+    _Scheduler_EDF_SMP_Do_update,<br>
+    _Scheduler_EDF_SMP_Enqueue_<wbr>fifo,<br>
+    _Scheduler_EDF_SMP_Enqueue_<wbr>lifo,<br>
+    _Scheduler_EDF_SMP_Enqueue_<wbr>scheduled_fifo,<br>
+    _Scheduler_EDF_SMP_Enqueue_<wbr>scheduled_lifo,<br>
+    _Scheduler_EDF_SMP_Do_ask_for_<wbr>help<br>
+  );<br>
+}<br>
+<br>
+bool _Scheduler_EDF_SMP_Ask_for_<wbr>help(<br>
+  const Scheduler_Control *scheduler,<br>
+  Thread_Control          *the_thread,<br>
+  Scheduler_Node          *node<br>
+)<br>
+{<br>
+  Scheduler_Context *context = _Scheduler_Get_context( scheduler );<br>
+<br>
+  return _Scheduler_EDF_SMP_Do_ask_for_<wbr>help( context, the_thread, node );<br>
+}<br>
+<br>
+void _Scheduler_EDF_SMP_Reconsider_<wbr>help_request(<br>
+  const Scheduler_Control *scheduler,<br>
+  Thread_Control          *the_thread,<br>
+  Scheduler_Node          *node<br>
+)<br>
+{<br>
+  Scheduler_Context *context = _Scheduler_Get_context( scheduler );<br>
+<br>
+  _Scheduler_SMP_Reconsider_<wbr>help_request(<br>
+    context,<br>
+    the_thread,<br>
+    node,<br>
+    _Scheduler_EDF_SMP_Extract_<wbr>from_ready<br>
+  );<br>
+}<br>
+<br>
+void _Scheduler_EDF_SMP_Withdraw_<wbr>node(<br>
+  const Scheduler_Control *scheduler,<br>
+  Thread_Control          *the_thread,<br>
+  Scheduler_Node          *node,<br>
+  Thread_Scheduler_state   next_state<br>
+)<br>
+{<br>
+  Scheduler_Context *context = _Scheduler_Get_context( scheduler );<br>
+<br>
+  _Scheduler_SMP_Withdraw_node(<br>
+    context,<br>
+    the_thread,<br>
+    node,<br>
+    next_state,<br>
+    _Scheduler_EDF_SMP_Extract_<wbr>from_ready,<br>
+    _Scheduler_EDF_SMP_Get_<wbr>highest_ready,<br>
+    _Scheduler_EDF_SMP_Move_from_<wbr>ready_to_scheduled,<br>
+    _Scheduler_SMP_Allocate_<wbr>processor_lazy<br>
+  );<br>
+}<br>
+<br>
+void _Scheduler_EDF_SMP_Add_<wbr>processor(<br>
+  const Scheduler_Control *scheduler,<br>
+  Thread_Control          *idle<br>
+)<br>
+{<br>
+  Scheduler_Context *context = _Scheduler_Get_context( scheduler );<br>
+<br>
+  _Scheduler_SMP_Add_processor(<br>
+    context,<br>
+    idle,<br>
+    _Scheduler_EDF_SMP_Has_ready,<br>
+    _Scheduler_EDF_SMP_Enqueue_<wbr>scheduled_fifo<br>
+  );<br>
+}<br>
+<br>
+Thread_Control *_Scheduler_EDF_SMP_Remove_<wbr>processor(<br>
+  const Scheduler_Control *scheduler,<br>
+  Per_CPU_Control         *cpu<br>
+)<br>
+{<br>
+  Scheduler_Context *context = _Scheduler_Get_context( scheduler );<br>
+<br>
+  return _Scheduler_SMP_Remove_<wbr>processor(<br>
+    context,<br>
+    cpu,<br>
+    _Scheduler_EDF_SMP_Extract_<wbr>from_ready,<br>
+    _Scheduler_EDF_SMP_Enqueue_<wbr>fifo<br>
+  );<br>
+}<br>
+<br>
+void _Scheduler_EDF_SMP_Yield(<br>
+  const Scheduler_Control *scheduler,<br>
+  Thread_Control          *thread,<br>
+  Scheduler_Node          *node<br>
+)<br>
+{<br>
+  Scheduler_Context *context = _Scheduler_Get_context( scheduler );<br>
+<br>
+  _Scheduler_SMP_Yield(<br>
+    context,<br>
+    thread,<br>
+    node,<br>
+    _Scheduler_EDF_SMP_Extract_<wbr>from_ready,<br>
+    _Scheduler_EDF_SMP_Enqueue_<wbr>fifo,<br>
+    _Scheduler_EDF_SMP_Enqueue_<wbr>scheduled_fifo<br>
+  );<br>
+}<br>
diff --git a/testsuites/smptests/<wbr>Makefile.am b/testsuites/smptests/<wbr>Makefile.am<br>
index 3df76c1d67..6c1bd1294f 100644<br>
--- a/testsuites/smptests/<wbr>Makefile.am<br>
+++ b/testsuites/smptests/<wbr>Makefile.am<br>
@@ -42,6 +42,7 @@ _SUBDIRS += smpscheduler03<br>
 _SUBDIRS += smpscheduler04<br>
 _SUBDIRS += smpscheduler05<br>
 _SUBDIRS += smpscheduler06<br>
+_SUBDIRS += smpscheduler07<br>
 _SUBDIRS += smpsignal01<br>
 _SUBDIRS += smpstrongapa01<br>
 _SUBDIRS += smpswitchextension01<br>
diff --git a/testsuites/smptests/<a href="http://configure.ac" rel="noreferrer" target="_blank">configur<wbr>e.ac</a> b/testsuites/smptests/<a href="http://configure.ac" rel="noreferrer" target="_blank">configur<wbr>e.ac</a><br>
index 54a75f777d..59b27ef397 100644<br>
--- a/testsuites/smptests/<a href="http://configure.ac" rel="noreferrer" target="_blank">configur<wbr>e.ac</a><br>
+++ b/testsuites/smptests/<a href="http://configure.ac" rel="noreferrer" target="_blank">configur<wbr>e.ac</a><br>
@@ -97,6 +97,7 @@ smpscheduler03/Makefile<br>
 smpscheduler04/Makefile<br>
 smpscheduler05/Makefile<br>
 smpscheduler06/Makefile<br>
+smpscheduler07/Makefile<br>
 smpsignal01/Makefile<br>
 smpstrongapa01/Makefile<br>
 smpswitchextension01/Makefile<br>
diff --git a/testsuites/smptests/<wbr>smpscheduler03/test.c b/testsuites/smptests/<wbr>smpscheduler03/test.c<br>
index 32bd67cdc2..3f6b9e3fd8 100644<br>
--- a/testsuites/smptests/<wbr>smpscheduler03/test.c<br>
+++ b/testsuites/smptests/<wbr>smpscheduler03/test.c<br>
@@ -37,6 +37,11 @@ static void apply_priority(<br>
   Thread_queue_Context *queue_context<br>
 )<br>
 {<br>
+  const Scheduler_Control *scheduler;<br>
+<br>
+  scheduler = _Thread_Scheduler_get_home(<wbr>thread);<br>
+  new_priority = _Scheduler_Map_priority(<wbr>scheduler, new_priority);<br>
+<br>
   _Thread_queue_Context_<wbr>initialize(queue_context);<br>
   _Thread_queue_Context_clear_<wbr>priority_updates(queue_<wbr>context);<br>
   _Thread_Wait_acquire(thread, queue_context);<br>
diff --git a/testsuites/smptests/<wbr>smpscheduler07/Makefile.am b/testsuites/smptests/<wbr>smpscheduler07/Makefile.am<br>
new file mode 100644<br>
index 0000000000..f981544628<br>
--- /dev/null<br>
+++ b/testsuites/smptests/<wbr>smpscheduler07/Makefile.am<br>
@@ -0,0 +1,19 @@<br>
+rtems_tests_PROGRAMS = smpscheduler07<br>
+smpscheduler07_SOURCES = init.c ../smpscheduler03/test.c<br>
+<br>
+dist_rtems_tests_DATA = smpscheduler07.scn smpscheduler07.doc<br>
+<br>
+include $(RTEMS_ROOT)/make/custom/@<wbr>RTEMS_BSP@.cfg<br>
+include $(top_srcdir)/../automake/<a href="http://compile.am" rel="noreferrer" target="_blank">comp<wbr>ile.am</a><br>
+include $(top_srcdir)/../automake/<a href="http://leaf.am" rel="noreferrer" target="_blank">leaf<wbr>.am</a><br>
+<br>
+AM_CPPFLAGS += -I$(top_srcdir)/../support/<wbr>include<br>
+<br>
+LINK_OBJS = $(smpscheduler07_OBJECTS)<br>
+LINK_LIBS = $(smpscheduler07_LDLIBS)<br>
+<br>
+smpscheduler07$(EXEEXT): $(smpscheduler07_OBJECTS) $(smpscheduler07_DEPENDENCIES)<br>
+       @rm -f smpscheduler07$(EXEEXT)<br>
+       $(make-exe)<br>
+<br>
+include $(top_srcdir)/../automake/<a href="http://local.am" rel="noreferrer" target="_blank">loca<wbr>l.am</a><br>
diff --git a/testsuites/smptests/<wbr>smpscheduler07/init.c b/testsuites/smptests/<wbr>smpscheduler07/init.c<br>
new file mode 100644<br>
index 0000000000..cbffe89012<br>
--- /dev/null<br>
+++ b/testsuites/smptests/<wbr>smpscheduler07/init.c<br>
@@ -0,0 +1,51 @@<br>
+/*<br>
+ * Copyright (c) 2017 embedded brains GmbH.  All rights reserved.<br>
+ *<br>
+ *  embedded brains GmbH<br>
+ *  Dornierstr. 4<br>
+ *  82178 Puchheim<br>
+ *  Germany<br>
+ *  <<a href="mailto:rtems@embedded-brains.de">rtems@embedded-brains.de</a>><br>
+ *<br>
+ * The license and distribution terms for this file may be<br>
+ * found in the file LICENSE in this distribution or at<br>
+ * <a href="http://www.rtems.org/license/LICENSE" rel="noreferrer" target="_blank">http://www.rtems.org/license/<wbr>LICENSE</a>.<br>
+ */<br>
+<br>
+#ifdef HAVE_CONFIG_H<br>
+#include "config.h"<br>
+#endif<br>
+<br>
+#include <rtems.h><br>
+#include <rtems/test.h><br>
+<br>
+void Init(rtems_task_argument arg);<br>
+<br>
+const char rtems_test_name[] = "SMPSCHEDULER 7";<br>
+<br>
+#define CONFIGURE_APPLICATION_NEEDS_<wbr>CLOCK_DRIVER<br>
+#define CONFIGURE_APPLICATION_NEEDS_<wbr>CONSOLE_DRIVER<br>
+<br>
+#define CONFIGURE_MAXIMUM_PROCESSORS 1<br>
+<br>
+#define CONFIGURE_SCHEDULER_EDF_SMP<br>
+<br>
+#include <rtems/scheduler.h><br>
+<br>
+RTEMS_SCHEDULER_CONTEXT_EDF_<wbr>SMP(a);<br>
+<br>
+#define CONFIGURE_SCHEDULER_CONTROLS \<br>
+  RTEMS_SCHEDULER_CONTROL_EDF_<wbr>SMP( a, rtems_build_name('T', 'E', 'S', 'T'))<br>
+<br>
+#define CONFIGURE_SMP_SCHEDULER_<wbr>ASSIGNMENTS \<br>
+  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_<wbr>PROCESSOR_MANDATORY)<br>
+<br>
+#define CONFIGURE_MAXIMUM_TASKS 3<br>
+<br>
+#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION<br>
+<br>
+#define CONFIGURE_RTEMS_INIT_TASKS_<wbr>TABLE<br>
+<br>
+#define CONFIGURE_INIT<br>
+<br>
+#include <rtems/confdefs.h><br>
diff --git a/testsuites/smptests/<wbr>smpscheduler07/smpscheduler07.<wbr>doc b/testsuites/smptests/<wbr>smpscheduler07/smpscheduler07.<wbr>doc<br>
new file mode 100644<br>
index 0000000000..80f7a2474d<br>
--- /dev/null<br>
+++ b/testsuites/smptests/<wbr>smpscheduler07/smpscheduler07.<wbr>doc<br>
@@ -0,0 +1,11 @@<br>
+This file describes the directives and concepts tested by this test set.<br>
+<br>
+test set name: smpscheduler07<br>
+<br>
+directives:<br>
+<br>
+  - Scheduler operations.<br>
+<br>
+concepts:<br>
+<br>
+  - Ensure that the scheduler operations basically work.<br>
diff --git a/testsuites/smptests/<wbr>smpscheduler07/smpscheduler07.<wbr>scn b/testsuites/smptests/<wbr>smpscheduler07/smpscheduler07.<wbr>scn<br>
new file mode 100644<br>
index 0000000000..73db66938b<br>
--- /dev/null<br>
+++ b/testsuites/smptests/<wbr>smpscheduler07/smpscheduler07.<wbr>scn<br>
@@ -0,0 +1,2 @@<br>
+*** BEGIN OF TEST SMPSCHEDULER 7 ***<br>
+*** END OF TEST SMPSCHEDULER 7 ***<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.12.3<br>
<br>
______________________________<wbr>_________________<br>
devel mailing list<br>
<a href="mailto:devel@rtems.org">devel@rtems.org</a><br>
<a href="http://lists.rtems.org/mailman/listinfo/devel" rel="noreferrer" target="_blank">http://lists.rtems.org/<wbr>mailman/listinfo/devel</a><br>
</font></span></blockquote></div><br></div>