[PATCH 2/4] score: Remove idle field of Per_CPU_Control

Sebastian Huber sebastian.huber at embedded-brains.de
Wed May 29 15:31:07 UTC 2013


This field is unused except for special case simulator clock drivers.
In these places use an alternative.  Add and use
_Thread_Set_exit_status() and _Thread_Get_exit_status().
---
 c/src/lib/libbsp/shared/clockdrv_shell.h        |    7 +++++--
 c/src/lib/libcpu/bfin/clock/clock.c             |    7 +++++--
 c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c |    7 +++++--
 cpukit/sapi/src/exinit.c                        |    4 ++--
 cpukit/sapi/src/exshutdown.c                    |    3 +--
 cpukit/score/include/rtems/score/percpu.h       |    5 -----
 cpukit/score/inline/rtems/score/thread.inl      |   16 ++++++++++++++++
 cpukit/score/src/threadcreateidle.c             |   11 ++++++-----
 testsuites/sptests/spsimplesched02/init.c       |   13 +++++++++++--
 9 files changed, 51 insertions(+), 22 deletions(-)

diff --git a/c/src/lib/libbsp/shared/clockdrv_shell.h b/c/src/lib/libbsp/shared/clockdrv_shell.h
index 3e8d08c..7919261 100644
--- a/c/src/lib/libbsp/shared/clockdrv_shell.h
+++ b/c/src/lib/libbsp/shared/clockdrv_shell.h
@@ -73,8 +73,11 @@ rtems_isr Clock_isr(
   #ifdef CLOCK_DRIVER_USE_FAST_IDLE
     do {
       rtems_clock_tick();
-    } while ( _Thread_Executing == _Thread_Idle &&
-            _Thread_Heir == _Thread_Executing);
+    } while (
+      _Thread_Heir == _Thread_Executing
+        && _Thread_Executing->Start.entry_point
+          == rtems_configuration_get_idle_task()
+    );
 
     Clock_driver_support_at_tick();
     return;
diff --git a/c/src/lib/libcpu/bfin/clock/clock.c b/c/src/lib/libcpu/bfin/clock/clock.c
index 530e5ba..4652586 100644
--- a/c/src/lib/libcpu/bfin/clock/clock.c
+++ b/c/src/lib/libcpu/bfin/clock/clock.c
@@ -39,8 +39,11 @@ static rtems_isr clockISR(rtems_vector_number vector) {
 #ifdef CLOCK_DRIVER_USE_FAST_IDLE
   do {
     rtems_clock_tick();
-  } while (_Thread_Executing == _Thread_Idle &&
-           _Thread_Heir == _Thread_Executing);
+  } while (
+    _Thread_Heir == _Thread_Executing
+      && _Thread_Executing->Start.entry_point
+        == rtems_configuration_get_idle_task()
+  );
 #else
   rtems_clock_tick();
 #endif
diff --git a/c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c b/c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c
index 01b72aa..3033b70 100644
--- a/c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c
+++ b/c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c
@@ -98,8 +98,11 @@ static void clockHandler(void)
   #if (CLOCK_DRIVER_USE_FAST_IDLE == 1)
     do {
       rtems_clock_tick();
-    } while ( _Thread_Executing == _Thread_Idle &&
-              _Thread_Heir == _Thread_Executing);
+    } while (
+      _Thread_Heir == _Thread_Executing
+        && _Thread_Executing->Start.entry_point
+          == rtems_configuration_get_idle_task()
+    );
 
   #else
     rtems_clock_tick();
diff --git a/cpukit/sapi/src/exinit.c b/cpukit/sapi/src/exinit.c
index 4ee2471..a0203eb 100644
--- a/cpukit/sapi/src/exinit.c
+++ b/cpukit/sapi/src/exinit.c
@@ -237,7 +237,7 @@ void rtems_initialize_start_multitasking(void)
    *******************************************************************
    *******************************************************************
    *******************************************************************/
-  
-  status = _Per_CPU_Information[0].idle->Wait.return_code;
+
+  status = _Thread_Get_exit_status();
   rtems_fatal( RTEMS_FATAL_SOURCE_EXIT, status );
 }
diff --git a/cpukit/sapi/src/exshutdown.c b/cpukit/sapi/src/exshutdown.c
index 2b99995..b81e8b5 100644
--- a/cpukit/sapi/src/exshutdown.c
+++ b/cpukit/sapi/src/exshutdown.c
@@ -44,8 +44,7 @@ void rtems_shutdown_executive(
       _SMP_Request_other_cores_to_shutdown();
     #endif
 
-    _Per_CPU_Information[0].idle->Wait.return_code = result;
-
+    _Thread_Set_exit_status( result );
     _System_state_Set( SYSTEM_STATE_SHUTDOWN );
     _Thread_Stop_multitasking();
 
diff --git a/cpukit/score/include/rtems/score/percpu.h b/cpukit/score/include/rtems/score/percpu.h
index 735b422..f545310 100644
--- a/cpukit/score/include/rtems/score/percpu.h
+++ b/cpukit/score/include/rtems/score/percpu.h
@@ -162,9 +162,6 @@ typedef struct {
   /** This is the heir thread for this this CPU. */
   Thread_Control *heir;
 
-  /** This is the idle thread for this CPU. */
-  Thread_Control *idle;
-
   /** This is the time of the last context switch on this CPU. */
   Timestamp_Control time_of_last_context_switch;
 
@@ -283,8 +280,6 @@ void _Per_CPU_Wait_for_state(
   _Per_CPU_Information[bsp_smp_processor_id()].heir
 #define _Thread_Executing \
   _Per_CPU_Information[bsp_smp_processor_id()].executing
-#define _Thread_Idle \
-  _Per_CPU_Information[bsp_smp_processor_id()].idle
 #define _ISR_Nest_level \
   _Per_CPU_Information[bsp_smp_processor_id()].isr_nest_level
 #define _CPU_Interrupt_stack_low \
diff --git a/cpukit/score/inline/rtems/score/thread.inl b/cpukit/score/inline/rtems/score/thread.inl
index 681cfcc..b089c9b 100644
--- a/cpukit/score/inline/rtems/score/thread.inl
+++ b/cpukit/score/inline/rtems/score/thread.inl
@@ -344,6 +344,22 @@ RTEMS_INLINE_ROUTINE void _Thread_Internal_free (
   _Objects_Free( &_Thread_Internal_information, &the_task->Object );
 }
 
+RTEMS_INLINE_ROUTINE void _Thread_Set_exit_status( uint32_t exit_status )
+{
+  Thread_Control *idle = (Thread_Control *)
+    _Thread_Internal_information.local_table[ 1 ];
+
+  idle->Wait.return_code = exit_status;
+}
+
+RTEMS_INLINE_ROUTINE uint32_t _Thread_Get_exit_status( void )
+{
+  const Thread_Control *idle = (const Thread_Control *)
+    _Thread_Internal_information.local_table[ 1 ];
+
+  return idle->Wait.return_code;
+}
+
 /**
  * This routine returns the C library re-enterant pointer.
  */
diff --git a/cpukit/score/src/threadcreateidle.c b/cpukit/score/src/threadcreateidle.c
index a0279de..cc4282e 100644
--- a/cpukit/score/src/threadcreateidle.c
+++ b/cpukit/score/src/threadcreateidle.c
@@ -40,9 +40,11 @@ static inline void _Thread_Create_idle_helper(
   int      cpu
 )
 {
-  Objects_Name    name;
-  Thread_Control *idle;
+  Per_CPU_Control *per_cpu;
+  Objects_Name     name;
+  Thread_Control  *idle;
 
+  per_cpu = &_Per_CPU_Information[ cpu ];
   name.name_u32 = name_u32;
 
   /*
@@ -79,9 +81,8 @@ static inline void _Thread_Create_idle_helper(
    *  WARNING!!! This is necessary to "kick" start the system and
    *             MUST be done before _Thread_Start is invoked.
    */
-  _Per_CPU_Information[ cpu ].idle      =
-  _Per_CPU_Information[ cpu ].heir      =
-  _Per_CPU_Information[ cpu ].executing = idle;
+  per_cpu->heir      =
+  per_cpu->executing = idle;
 
   _Thread_Start(
     idle,
diff --git a/testsuites/sptests/spsimplesched02/init.c b/testsuites/sptests/spsimplesched02/init.c
index 8b053b6..d4faa7a 100644
--- a/testsuites/sptests/spsimplesched02/init.c
+++ b/testsuites/sptests/spsimplesched02/init.c
@@ -21,6 +21,7 @@ void ObtainRelease(bool suspendIdle);
 /*
  *  Keep the names and IDs in global variables so another task can use them.
  */
+rtems_id   Idle_id;
 rtems_id   Task_id[ 3 ];         /* array of task ids */
 rtems_name Task_name[ 3 ];       /* array of task names */
 rtems_name Semaphore_name[ 2 ];
@@ -48,7 +49,7 @@ void ObtainRelease( bool suspendIdle )
 
   if (suspendIdle) {
     puts( "INIT - Suspend Idle Task");
-    status = rtems_task_suspend( _Thread_Idle->Object.id );
+    status = rtems_task_suspend( Idle_id );
     directive_failed( status, "rtems_task_suspend idle" );
   }
 
@@ -62,7 +63,7 @@ void ObtainRelease( bool suspendIdle )
 
   if (suspendIdle) {
     puts( "INIT - Resume Idle Task");
-    status = rtems_task_resume( _Thread_Idle->Object.id );
+    status = rtems_task_resume( Idle_id );
     directive_failed( status, "rtems_task_resume idle" );
   }
 }
@@ -75,6 +76,14 @@ rtems_task Init(
 
   puts( "\n\n*** SIMPLE SCHEDULER 02 TEST ***" );
 
+  status = _Objects_Name_to_id_u32(
+    &_Thread_Internal_information,
+    rtems_build_name( 'I', 'D', 'L', 'E' ),
+    RTEMS_SEARCH_LOCAL_NODE,
+    &Idle_id
+  );
+  rtems_test_assert( status == RTEMS_SUCCESSFUL );
+
   /*
    * Create the semaphore. Then obtain and release the
    * semaphore with no other tasks running.
-- 
1.7.7




More information about the devel mailing list