[PATCH 28/38] Optional CPU Set Handler initialization

Sebastian Huber sebastian.huber at embedded-brains.de
Tue Jan 26 15:37:54 UTC 2016


Update #2408.
---
 cpukit/sapi/src/exinit.c                      |  3 ---
 cpukit/score/include/rtems/score/cpusetimpl.h | 12 ------------
 cpukit/score/include/rtems/sysinit.h          |  1 +
 cpukit/score/src/cpuset.c                     |  9 ++++++++-
 doc/user/init.t                               |  4 ++++
 testsuites/sptests/spsysinit01/init.c         | 13 +++++++++++++
 6 files changed, 26 insertions(+), 16 deletions(-)

diff --git a/cpukit/sapi/src/exinit.c b/cpukit/sapi/src/exinit.c
index dd5e2c9..edd8a5c 100644
--- a/cpukit/sapi/src/exinit.c
+++ b/cpukit/sapi/src/exinit.c
@@ -37,7 +37,6 @@
 #include <rtems/score/apiext.h>
 #include <rtems/score/apimutex.h>
 #include <rtems/score/copyrt.h>
-#include <rtems/score/cpusetimpl.h>
 #include <rtems/score/heap.h>
 #include <rtems/score/interr.h>
 #include <rtems/score/isr.h>
@@ -130,8 +129,6 @@ static void rtems_initialize_data_structures(void)
 
   _SMP_Handler_initialize();
 
-  _CPU_set_Handler_initialization();
-
 /* MANAGERS */
 
   _POSIX_API_Initialize();
diff --git a/cpukit/score/include/rtems/score/cpusetimpl.h b/cpukit/score/include/rtems/score/cpusetimpl.h
index 226c3a1..f9a0f0f 100644
--- a/cpukit/score/include/rtems/score/cpusetimpl.h
+++ b/cpukit/score/include/rtems/score/cpusetimpl.h
@@ -123,18 +123,6 @@ static inline void _CPU_set_Set(
 }
 #endif
 
-/**
- * @brief Initialize the CPU Set Handler
- *
- * This routine validates a cpuset sets at least one valid cpu and that
- * it does not set any invalid cpus.
- */
-#if __RTEMS_HAVE_SYS_CPUSET_H__ && defined( RTEMS_SMP )
-void _CPU_set_Handler_initialization(void);
-#else
-#define _CPU_set_Handler_initialization()  do { } while ( 0 )
-#endif
-
 /**@}*/
 
 #ifdef __cplusplus
diff --git a/cpukit/score/include/rtems/sysinit.h b/cpukit/score/include/rtems/sysinit.h
index 8f18764..39e551f 100644
--- a/cpukit/score/include/rtems/sysinit.h
+++ b/cpukit/score/include/rtems/sysinit.h
@@ -30,6 +30,7 @@ extern "C" {
 #define RTEMS_SYSINIT_BSP_START                  000200
 #define RTEMS_SYSINIT_INITIAL_EXTENSIONS         000300
 #define RTEMS_SYSINIT_DATA_STRUCTURES            000301
+#define RTEMS_SYSINIT_CPU_SET                    00030d
 #define RTEMS_SYSINIT_USER_EXTENSIONS            000320
 #define RTEMS_SYSINIT_CLASSIC_TASKS              000340
 #define RTEMS_SYSINIT_CLASSIC_TIMER              000341
diff --git a/cpukit/score/src/cpuset.c b/cpukit/score/src/cpuset.c
index ca355c9..deb9e43 100644
--- a/cpukit/score/src/cpuset.c
+++ b/cpukit/score/src/cpuset.c
@@ -21,6 +21,7 @@
 
 #ifdef __RTEMS_HAVE_SYS_CPUSET_H__
 #include <sys/cpuset.h>
+#include <rtems/sysinit.h>
 #include <rtems/score/cpusetimpl.h>
 #include <rtems/score/assert.h>
 #include <rtems/score/percpu.h>
@@ -30,7 +31,7 @@ static CPU_set_Control cpuset_default;
 /*
  * _CPU_set_Handler_initialization
  */
-void _CPU_set_Handler_initialization()
+static void _CPU_set_Handler_initialization()
 {
   uint32_t cpu_count;
   uint32_t cpu_index;
@@ -50,6 +51,12 @@ void _CPU_set_Handler_initialization()
     CPU_SET_S( (int) cpu_index, cpuset_default.setsize, cpuset_default.set );
 }
 
+RTEMS_SYSINIT_ITEM(
+  _CPU_set_Handler_initialization,
+  RTEMS_SYSINIT_CPU_SET,
+  RTEMS_SYSINIT_ORDER_MIDDLE
+);
+
 /**
  * _CPU_set_Is_valid
  *
diff --git a/doc/user/init.t b/doc/user/init.t
index a373b4a..ecbfa14 100644
--- a/doc/user/init.t
+++ b/doc/user/init.t
@@ -172,6 +172,10 @@ Multiprocessor Communications Interface (MPCI) Table.
 Initializes the @ref{User Extensions Manager} in case it is used by the
 application.
 
+ at item RTEMS_SYSINIT_CPU_SET
+Initializes the global CPU set on SMP configurations in case the application
+uses this information.
+
 @item RTEMS_SYSINIT_BSP_LIBC
 Depending on the application configuration the IO library and root filesystem
 is initialized.  This step is mandatory.
diff --git a/testsuites/sptests/spsysinit01/init.c b/testsuites/sptests/spsysinit01/init.c
index 042c600..916ae6c 100644
--- a/testsuites/sptests/spsysinit01/init.c
+++ b/testsuites/sptests/spsysinit01/init.c
@@ -65,6 +65,8 @@ typedef enum {
   INITIAL_EXTENSIONS_POST,
   DATA_STRUCTURES_PRE,
   DATA_STRUCTURES_POST,
+  CPU_SET_PRE,
+  CPU_SET_POST,
   USER_EXTENSIONS_PRE,
   USER_EXTENSIONS_POST,
   CLASSIC_TASKS_PRE,
@@ -206,6 +208,17 @@ LAST(RTEMS_SYSINIT_DATA_STRUCTURES)
   next_step(DATA_STRUCTURES_POST);
 }
 
+FIRST(RTEMS_SYSINIT_CPU_SET)
+{
+  /* There is nothing to do in case RTEMS_SMP is not defined */
+  next_step(CPU_SET_PRE);
+}
+
+LAST(RTEMS_SYSINIT_CPU_SET)
+{
+  next_step(CPU_SET_POST);
+}
+
 FIRST(RTEMS_SYSINIT_USER_EXTENSIONS)
 {
   assert(_Extension_Information.maximum == 0);
-- 
1.8.4.5




More information about the devel mailing list