[PATCH] score: Delete _Thread_BSP_context

Gedare Bloom gedare at rtems.org
Thu Feb 13 15:30:52 UTC 2014


I like the simplification. We should also clean up any BSPs that have
dead code beyond calling boot_card().

Does it make sense to add noreturn attributes to the initialization
call path starting with boot_card through
rtems_initialize_start_multitasking()?

-Gedare

On Thu, Feb 13, 2014 at 4:09 AM, Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
> Do not return to BSP context in the exit() shutdown path.  This makes it
> possible to re-use the initialization stack.  It can be used for the
> interrupt stack for example.  On targets with a small RAM this is a
> considerable benefit.
>
> This change eliminates also some special cases and simplifies the code.
>
> Disable thread dispatching in rtems_shutdown_executive().
>
> Delete _Thread_Set_global_exit_status(),
> _Thread_Get_global_exit_status() and _Thread_Stop_multitasking().
> ---
>  cpukit/sapi/src/exinit.c                           |   10 +---
>  cpukit/sapi/src/exshutdown.c                       |   18 +++---
>  .../score/cpu/arm/armv7m-multitasking-start-stop.c |   36 ++---------
>  cpukit/score/cpu/arm/rtems/score/cpu.h             |    5 +-
>  cpukit/score/include/rtems/score/threadimpl.h      |   65 +-------------------
>  cpukit/score/src/smp.c                             |    2 +-
>  cpukit/score/src/threadstartmultitasking.c         |   27 +++------
>  testsuites/sptests/spsize/size.c                   |    3 +-
>  8 files changed, 29 insertions(+), 137 deletions(-)
>
> diff --git a/cpukit/sapi/src/exinit.c b/cpukit/sapi/src/exinit.c
> index 10c1559..e8b009b 100644
> --- a/cpukit/sapi/src/exinit.c
> +++ b/cpukit/sapi/src/exinit.c
> @@ -33,7 +33,6 @@
>  #include <rtems/config.h>
>  #include <rtems/debug.h>
>  #include <rtems/extensionimpl.h>
> -#include <rtems/fatal.h>
>  #include <rtems/init.h>
>  #include <rtems/io.h>
>  #include <rtems/score/sysstate.h>
> @@ -215,25 +214,20 @@ void rtems_initialize_device_drivers(void)
>
>  void rtems_initialize_start_multitasking(void)
>  {
> -  uint32_t status;
> -
>    _System_state_Set( SYSTEM_STATE_UP );
>
>  #if defined(RTEMS_SMP)
>    _SMP_Request_other_cores_to_perform_first_context_switch();
>  #endif
>
> -  _Thread_Start_multitasking( &_Thread_BSP_context );
> +  _Thread_Start_multitasking();
>
>    /*******************************************************************
>     *******************************************************************
>     *******************************************************************
>     ******                 APPLICATION RUNS HERE                 ******
> -   ******            RETURNS WHEN SYSTEM IS SHUT DOWN           ******
> +   ******              THE FUNCTION NEVER RETURNS               ******
>     *******************************************************************
>     *******************************************************************
>     *******************************************************************/
> -
> -  status = _Thread_Get_global_exit_status();
> -  rtems_fatal( RTEMS_FATAL_SOURCE_EXIT, status );
>  }
> diff --git a/cpukit/sapi/src/exshutdown.c b/cpukit/sapi/src/exshutdown.c
> index 7a96869..7cf7d35 100644
> --- a/cpukit/sapi/src/exshutdown.c
> +++ b/cpukit/sapi/src/exshutdown.c
> @@ -38,25 +38,25 @@ void rtems_shutdown_executive(
>     uint32_t   result
>  )
>  {
> +  _Thread_Disable_dispatch();
> +
>    if ( _System_state_Is_up( _System_state_Get() ) ) {
>      #if defined(RTEMS_SMP)
>        _SMP_Request_other_cores_to_shutdown();
>      #endif
>
> -    _Thread_Set_global_exit_status( result );
>      _System_state_Set( SYSTEM_STATE_SHUTDOWN );
> -    _Thread_Stop_multitasking();
> -
> -    /*******************************************************************
> -     *******************************************************************
> -     ******     RETURN TO RTEMS_INITIALIZE_START_MULTITASKING()   ******
> -     ******                 AND THEN TO BOOT_CARD()               ******
> -     *******************************************************************
> -     *******************************************************************/
> +    _Internal_error_Occurred( RTEMS_FATAL_SOURCE_EXIT, false, result );
>    }
>    _Internal_error_Occurred(
>      INTERNAL_ERROR_CORE,
>      true,
>      INTERNAL_ERROR_SHUTDOWN_WHEN_NOT_UP
>    );
> +
> +  /***************************************************************
> +   ***************************************************************
> +   *   SYSTEM SHUTS DOWN!!!  WE DO NOT RETURN TO THIS POINT!!!   *
> +   ***************************************************************
> +   ***************************************************************/
>  }
> diff --git a/cpukit/score/cpu/arm/armv7m-multitasking-start-stop.c b/cpukit/score/cpu/arm/armv7m-multitasking-start-stop.c
> index f3e96e3..864bb53 100644
> --- a/cpukit/score/cpu/arm/armv7m-multitasking-start-stop.c
> +++ b/cpukit/score/cpu/arm/armv7m-multitasking-start-stop.c
> @@ -1,14 +1,14 @@
>  /**
>   * @file
>   *
> - * @brief ARMV7M Start and Stop Multitasking
> + * @brief ARMV7M Start Multitasking
>   */
>
>  /*
> - * Copyright (c) 2011 Sebastian Huber.  All rights reserved.
> + * Copyright (c) 2011-2014 Sebastian Huber.  All rights reserved.
>   *
>   *  embedded brains GmbH
> - *  Obere Lagerstr. 30
> + *  Dornierstr. 4
>   *  82178 Puchheim
>   *  Germany
>   *  <rtems at embedded-brains.de>
> @@ -27,18 +27,14 @@
>  #ifdef ARM_MULTILIB_ARCH_V7M
>
>  void __attribute__((naked)) _ARMV7M_Start_multitasking(
> -  Context_Control *bsp,
>    Context_Control *heir
>  )
>  {
>    __asm__ volatile (
> -    /* Store BSP context */
> -    "stm r0, {r4-r11, lr}\n"
> -    "str sp, [r0, %[spctxoff]]\n"
>      /* Restore heir context */
> -    "ldr r2, [r1, %[spctxoff]]\n"
> +    "ldr r2, [r0, %[spctxoff]]\n"
>      "msr psp, r2\n"
> -    "ldm r1, {r4-r11, lr}\n"
> +    "ldm r0, {r4-r11, lr}\n"
>      /* Enable process stack pointer (PSP) */
>      "mrs r2, control\n"
>      "orr r2, #0x2\n"
> @@ -50,26 +46,4 @@ void __attribute__((naked)) _ARMV7M_Start_multitasking(
>    );
>  }
>
> -void __attribute__((naked)) _ARMV7M_Stop_multitasking( Context_Control *bsp )
> -{
> -  __asm__ volatile (
> -    /* Disable interrupts */
> -    "mov r2, #0x80\n"
> -    "msr basepri_max, r2\n"
> -    /* Restore BSP context */
> -    "ldr r2, [r0, %[spctxoff]]\n"
> -    "msr msp, r2\n"
> -    "ldm r0, {r4-r11, lr}\n"
> -    /* Disable process stack pointer (PSP) */
> -    "mrs r2, control\n"
> -    "bic r2, #0x2\n"
> -    "msr control, r2\n"
> -    /* Return to BSP */
> -    "bx lr\n"
> -    :
> -    : [spctxoff] "J" (offsetof(Context_Control, register_sp))
> -  );
> -  __builtin_unreachable();
> -}
> -
>  #endif /* ARM_MULTILIB_ARCH_V7M */
> diff --git a/cpukit/score/cpu/arm/rtems/score/cpu.h b/cpukit/score/cpu/arm/rtems/score/cpu.h
> index b423dba..f56f9a6 100644
> --- a/cpukit/score/cpu/arm/rtems/score/cpu.h
> +++ b/cpukit/score/cpu/arm/rtems/score/cpu.h
> @@ -458,11 +458,8 @@ void _CPU_Context_restore( Context_Control *new_context )
>    RTEMS_COMPILER_NO_RETURN_ATTRIBUTE;
>
>  #if defined(ARM_MULTILIB_ARCH_V7M)
> -  void _ARMV7M_Start_multitasking( Context_Control *bsp, Context_Control *heir );
> -  void _ARMV7M_Stop_multitasking( Context_Control *bsp )
> -    RTEMS_COMPILER_NO_RETURN_ATTRIBUTE;
> +  void _ARMV7M_Start_multitasking( Context_Control *heir );
>    #define _CPU_Start_multitasking _ARMV7M_Start_multitasking
> -  #define _CPU_Stop_multitasking _ARMV7M_Stop_multitasking
>  #endif
>
>  void _CPU_Context_volatile_clobber( uintptr_t pattern );
> diff --git a/cpukit/score/include/rtems/score/threadimpl.h b/cpukit/score/include/rtems/score/threadimpl.h
> index 4f4fbc7..7c1d2a7 100644
> --- a/cpukit/score/include/rtems/score/threadimpl.h
> +++ b/cpukit/score/include/rtems/score/threadimpl.h
> @@ -20,6 +20,7 @@
>  #define _RTEMS_SCORE_THREADIMPL_H
>
>  #include <rtems/score/thread.h>
> +#include <rtems/score/interr.h>
>  #include <rtems/score/isr.h>
>  #include <rtems/score/objectimpl.h>
>  #include <rtems/score/statesimpl.h>
> @@ -54,15 +55,6 @@ SCORE_EXTERN void *rtems_ada_self;
>  SCORE_EXTERN Objects_Information _Thread_Internal_information;
>
>  /**
> - *  The following context area contains the context of the "thread"
> - *  which invoked the start multitasking routine.  This context is
> - *  restored as the last action of the stop multitasking routine.  Thus
> - *  control of the processor can be returned to the environment
> - *  which initiated the system.
> - */
> -SCORE_EXTERN Context_Control _Thread_BSP_context;
> -
> -/**
>   *  The following holds how many user extensions are in the system.  This
>   *  is used to determine how many user extension data areas to allocate
>   *  per thread.
> @@ -114,13 +106,8 @@ void _Thread_Create_idle(void);
>   *  This routine initiates multitasking.  It is invoked only as
>   *  part of initialization and its invocation is the last act of
>   *  the non-multitasking part of the system initialization.
> - *
> - *
> - *  - INTERRUPT LATENCY:
> - *    + ready chain
> - *    + select heir
>   */
> -void _Thread_Start_multitasking( Context_Control *context );
> +void _Thread_Start_multitasking( void ) RTEMS_COMPILER_NO_RETURN_ATTRIBUTE;
>
>  /**
>   *  @brief Allocate the requested stack space for the thread.
> @@ -446,36 +433,6 @@ void _Thread_blocking_operation_Cancel(
>  );
>
>  /**
> - * This routine halts multitasking and returns control to
> - * the "thread" (i.e. the BSP) which initially invoked the
> - * routine which initialized the system.
> - */
> -
> -RTEMS_INLINE_ROUTINE void _Thread_Stop_multitasking( void )
> -{
> -#if defined(_CPU_Stop_multitasking)
> -  _CPU_Stop_multitasking( &_Thread_BSP_context );
> -#else
> -  /*
> -   *  This may look a bit of an odd but _Context_Restart_self is just
> -   *  a very careful restore of a specific context which ensures that
> -   *  if we were running within the same context, it would work.
> -   *
> -   *  And we will not return to this thread, so there is no point of
> -   *  saving the context.
> -   */
> -  _Context_Restart_self( &_Thread_BSP_context );
> -#endif
> -
> -  /***************************************************************
> -   ***************************************************************
> -   *   SYSTEM SHUTS DOWN!!!  WE DO NOT RETURN TO THIS POINT!!!   *
> -   ***************************************************************
> -   ***************************************************************
> -   */
> -}
> -
> -/**
>   * This function returns true if the_thread is the currently executing
>   * thread, and false otherwise.
>   */
> @@ -630,24 +587,6 @@ RTEMS_INLINE_ROUTINE void _Thread_Internal_free (
>    _Objects_Free( &_Thread_Internal_information, &the_task->Object );
>  }
>
> -RTEMS_INLINE_ROUTINE void _Thread_Set_global_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_global_exit_status( void )
> -{
> -  const Thread_Control *idle = (const Thread_Control *)
> -    _Thread_Internal_information.local_table[ 1 ];
> -
> -  return idle->Wait.return_code;
> -}
> -
>  RTEMS_INLINE_ROUTINE void _Thread_Signal_notification( Thread_Control *thread )
>  {
>    if ( _ISR_Is_in_progress() && _Thread_Is_executing( thread ) ) {
> diff --git a/cpukit/score/src/smp.c b/cpukit/score/src/smp.c
> index 2f8a488..df1c6d3 100644
> --- a/cpukit/score/src/smp.c
> +++ b/cpukit/score/src/smp.c
> @@ -40,7 +40,7 @@ void rtems_smp_secondary_cpu_initialize( void )
>
>    _Per_CPU_Wait_for_state( self_cpu, PER_CPU_STATE_BEGIN_MULTITASKING );
>
> -  _Thread_Start_multitasking( NULL );
> +  _Thread_Start_multitasking();
>  }
>
>  void rtems_smp_process_interrupt( void )
> diff --git a/cpukit/score/src/threadstartmultitasking.c b/cpukit/score/src/threadstartmultitasking.c
> index 52337ab..a676364 100644
> --- a/cpukit/score/src/threadstartmultitasking.c
> +++ b/cpukit/score/src/threadstartmultitasking.c
> @@ -20,7 +20,7 @@
>
>  #include <rtems/score/threadimpl.h>
>
> -void _Thread_Start_multitasking( Context_Control *context )
> +void _Thread_Start_multitasking( void )
>  {
>    Per_CPU_Control *self_cpu = _Per_CPU_Get();
>    Thread_Control  *heir = self_cpu->heir;
> @@ -28,7 +28,13 @@ void _Thread_Start_multitasking( Context_Control *context )
>  #if defined(RTEMS_SMP)
>    _Per_CPU_Change_state( self_cpu, PER_CPU_STATE_UP );
>
> +  /*
> +   * Threads begin execution in the _Thread_Handler() function.   This
> +   * function will set the thread dispatch disable level to zero and calls
> +   * _Per_CPU_Release().
> +   */
>    _Per_CPU_Acquire( self_cpu );
> +  self_cpu->thread_dispatch_disable_level = 1;
>
>    self_cpu->executing->is_executing = false;
>    heir->is_executing = true;
> @@ -59,26 +65,9 @@ void _Thread_Start_multitasking( Context_Control *context )
>       _Context_Restore_fp( &heir->fp_context );
>  #endif
>
> -#if defined(RTEMS_SMP)
> -  if ( context != NULL ) {
> -#endif
> -
>  #if defined(_CPU_Start_multitasking)
> -    _CPU_Start_multitasking( context, &heir->Registers );
> +    _CPU_Start_multitasking( &heir->Registers );
>  #else
> -    _Context_Switch( context, &heir->Registers );
> -#endif
> -
> -#if defined(RTEMS_SMP)
> -  } else {
> -    /*
> -     * Threads begin execution in the _Thread_Handler() function.   This
> -     * function will set the thread dispatch disable level to zero and calls
> -     * _Per_CPU_Release().
> -     */
> -    self_cpu->thread_dispatch_disable_level = 1;
> -
>      _CPU_Context_restore( &heir->Registers );
> -  }
>  #endif
>  }
> diff --git a/testsuites/sptests/spsize/size.c b/testsuites/sptests/spsize/size.c
> index f204c05..5b3cefe 100644
> --- a/testsuites/sptests/spsize/size.c
> +++ b/testsuites/sptests/spsize/size.c
> @@ -385,8 +385,7 @@ uninitialized =
>
>  /*tasksimpl.h*/ (sizeof _RTEMS_tasks_Information)         +
>
> -/*thread.h*/    (sizeof _Thread_BSP_context)              +
> -                (sizeof _Thread_Dispatch_disable_level)   +
> +/*thread.h*/    (sizeof _Thread_Dispatch_disable_level)   +
>                  (sizeof _Thread_Maximum_extensions)       +
>                  (sizeof _Thread_Ticks_per_timeslice)      +
>                  (sizeof _Thread_Executing)                +
> --
> 1.7.7
>
> _______________________________________________
> rtems-devel mailing list
> rtems-devel at rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-devel



More information about the devel mailing list