[PATCH 05/11] smp: Simplify main CPU initialization

Sebastian Huber sebastian.huber at embedded-brains.de
Mon May 27 10:58:10 UTC 2013


Call _SMP_Handler_initialize() later and move bsp_smp_initialize() into
_SMP_Handler_initialize().  Change bsp_smp_initialize() prototype to
match integer types of calling context.
---
 c/src/lib/libbsp/i386/shared/smp/smp-imps.c  |    4 +---
 c/src/lib/libbsp/shared/smp/smp_stub.c       |    4 +---
 c/src/lib/libbsp/sparc/leon3/smp/smp_leon3.c |   14 ++++++--------
 cpukit/sapi/src/exinit.c                     |   10 +---------
 cpukit/score/include/rtems/bspsmp.h          |   23 +++++++++++++----------
 cpukit/score/src/percpu.c                    |   12 ++++++++++--
 6 files changed, 32 insertions(+), 35 deletions(-)

diff --git a/c/src/lib/libbsp/i386/shared/smp/smp-imps.c b/c/src/lib/libbsp/i386/shared/smp/smp-imps.c
index 60bb0e6..7ea17e5 100644
--- a/c/src/lib/libbsp/i386/shared/smp/smp-imps.c
+++ b/c/src/lib/libbsp/i386/shared/smp/smp-imps.c
@@ -807,9 +807,7 @@ void bsp_smp_secondary_cpu_initialize(int cpu)
 }
 
 #include <rtems/bspsmp.h>
-int bsp_smp_initialize(
-  int maximum
-)
+uint32_t bsp_smp_initialize( uint32_t configured_cpu_count )
 {
   int cores;
   /* XXX need to deal with finding too many cores */
diff --git a/c/src/lib/libbsp/shared/smp/smp_stub.c b/c/src/lib/libbsp/shared/smp/smp_stub.c
index c5d57f4..f95cad4 100644
--- a/c/src/lib/libbsp/shared/smp/smp_stub.c
+++ b/c/src/lib/libbsp/shared/smp/smp_stub.c
@@ -19,9 +19,7 @@ void bsp_smp_secondary_cpu_initialize(int cpu)
 {
 }
 
-int bsp_smp_initialize(
-  int maximum
-)
+uint32_t bsp_smp_initialize( uint32_t configured_cpu_count )
 {
   /* return the number of CPUs */
   return 1;
diff --git a/c/src/lib/libbsp/sparc/leon3/smp/smp_leon3.c b/c/src/lib/libbsp/sparc/leon3/smp/smp_leon3.c
index a9f4a0e..b479ffc 100644
--- a/c/src/lib/libbsp/sparc/leon3/smp/smp_leon3.c
+++ b/c/src/lib/libbsp/sparc/leon3/smp/smp_leon3.c
@@ -57,12 +57,10 @@ void *bsp_ap_entry;
 
 static void bsp_smp_delay( int );
 
-int bsp_smp_initialize(
-  int maximum
-)
+uint32_t bsp_smp_initialize( uint32_t configured_cpu_count )
 {
-  int cpu;
-  int found_cpus = 0;
+  uint32_t cpu;
+  uint32_t found_cpus = 0;
 
   sparc_leon3_set_cctrl( 0x80000F );
   found_cpus =
@@ -71,13 +69,13 @@ int bsp_smp_initialize(
     printk( "Found %d CPUs\n", found_cpus );
   #endif
 
-  if ( found_cpus > rtems_configuration_get_maximum_processors() ) {
+  if ( found_cpus > configured_cpu_count ) {
     printk(
       "%d CPUs IS MORE THAN CONFIGURED -- ONLY USING %d\n",
       found_cpus,
-      rtems_configuration_get_maximum_processors()
+      configured_cpu_count
     );
-    found_cpus = rtems_configuration_get_maximum_processors();
+    found_cpus = configured_cpu_count;
   }
 
   if ( found_cpus == 1 )
diff --git a/cpukit/sapi/src/exinit.c b/cpukit/sapi/src/exinit.c
index a0abe11..3fb27fd 100644
--- a/cpukit/sapi/src/exinit.c
+++ b/cpukit/sapi/src/exinit.c
@@ -119,10 +119,6 @@ void rtems_initialize_data_structures(void)
 
   _Thread_Dispatch_initialization();
 
-  #if defined(RTEMS_SMP)
-    _SMP_Handler_initialize();
-  #endif
-
   _User_extensions_Handler_initialization();
   _ISR_Handler_initialization();
 
@@ -159,12 +155,8 @@ void rtems_initialize_data_structures(void)
     _POSIX_API_Initialize();
   #endif
 
-  /*
-   * Discover and initialize the secondary cores in an SMP system.
-   */
   #if defined(RTEMS_SMP)
-    _SMP_Processor_count =
-        bsp_smp_initialize( rtems_configuration_get_maximum_processors() );
+    _SMP_Handler_initialize();
   #endif
 
   _System_state_Set( SYSTEM_STATE_BEFORE_MULTITASKING );
diff --git a/cpukit/score/include/rtems/bspsmp.h b/cpukit/score/include/rtems/bspsmp.h
index e318cca..e1ef488 100644
--- a/cpukit/score/include/rtems/bspsmp.h
+++ b/cpukit/score/include/rtems/bspsmp.h
@@ -50,21 +50,24 @@ extern "C" {
 
 
 #ifndef ASM
+
 /**
- *  @brief Initialize secondary CPUs.
+ * @brief Performs BSP specific SMP initialization in the context of the main
+ * processor.
+ *
+ * This function is invoked on the main processor by RTEMS during
+ * initialization.  All interrupt stacks are allocated at this point in case
+ * the CPU port allocates the interrupt stacks.
  *
- *  This method is invoked by RTEMS during initialization to bring the
- *  secondary CPUs out of reset.
+ * The BSP may start secondary processors now.
  *
- *  @param [in] maximum is the maximum number of CPU cores that RTEMS
- *              can handle
+ * @param[in] configured_cpu_count The count of processors requested by the
+ * application configuration.
  *
- *  @retval This method returns the number of cores available in the
- *          system.
+ * @return The count of processors available for the application in the system.
+ * This value is less than or equal to the configured count of processors.
  */
-int bsp_smp_initialize(
-  int maximum
-);
+uint32_t bsp_smp_initialize( uint32_t configured_cpu_count );
 
 /**
  *  @brief Obtain current CPU index.
diff --git a/cpukit/score/src/percpu.c b/cpukit/score/src/percpu.c
index d40b2a6..f01d933 100644
--- a/cpukit/score/src/percpu.c
+++ b/cpukit/score/src/percpu.c
@@ -31,13 +31,14 @@
 
   void _SMP_Handler_initialize(void)
   {
-    int cpu;
+    uint32_t max_cpus = rtems_configuration_get_maximum_processors();
+    uint32_t cpu;
 
     /*
      *  Initialize per cpu pointer table
      */
     _Per_CPU_Information_p[0] = &_Per_CPU_Information[0];
-    for (cpu=1 ; cpu < rtems_configuration_get_maximum_processors(); cpu++ ) {
+    for ( cpu = 1 ; cpu < max_cpus; ++cpu ) {
 
       Per_CPU_Control *p = &_Per_CPU_Information[cpu];
 
@@ -59,6 +60,13 @@
       p->state = RTEMS_BSP_SMP_CPU_INITIAL_STATE;
       RTEMS_COMPILER_MEMORY_BARRIER();
     }
+
+    /*
+     * Discover and initialize the secondary cores in an SMP system.
+     */
+    max_cpus = bsp_smp_initialize( max_cpus );
+
+    _SMP_Processor_count = max_cpus;
   }
 #else
   /*
-- 
1.7.7




More information about the devel mailing list