[PATCH 01/17] score: Move SMP interrupt stack initialization

Gedare Bloom gedare at rtems.org
Tue Feb 18 13:40:06 UTC 2014


On Mon, Feb 17, 2014 at 10:51 AM, Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
> Move SMP interrupt stack initialization for secondary processors from
> _SMP_Handler_initialize() to _ISR_Handler_initialization() to avoid code
> duplication.  Apply _CPU_Interrupt_stack_setup() to all interrupt
> stacks.
> ---
>  cpukit/score/src/isr.c    |   40 ++++++++++++++++++++++------------------
>  cpukit/score/src/percpu.c |   21 ---------------------
>  2 files changed, 22 insertions(+), 39 deletions(-)
>
> diff --git a/cpukit/score/src/isr.c b/cpukit/score/src/isr.c
> index 3adea71..b9735e3 100644
> --- a/cpukit/score/src/isr.c
> +++ b/cpukit/score/src/isr.c
> @@ -18,11 +18,11 @@
>  #include "config.h"
>  #endif
>
> -#include <rtems/system.h>
> -#include <rtems/score/address.h>
>  #include <rtems/score/isr.h>
> -#include <rtems/score/stackimpl.h>
> +#include <rtems/score/address.h>
>  #include <rtems/score/interr.h>
> +#include <rtems/score/percpu.h>
> +#include <rtems/score/stackimpl.h>
>  #include <rtems/score/wkspace.h>
>  #include <rtems/config.h>
>
> @@ -41,6 +41,8 @@ void _ISR_Handler_initialization( void )
>  #if ( CPU_ALLOCATE_INTERRUPT_STACK == TRUE )
>    {
>      size_t stack_size = rtems_configuration_get_interrupt_stack_size();
> +    uint32_t max_cpus = rtems_configuration_get_maximum_processors();
> +    uint32_t cpu;
>
>      if ( !_Stack_Is_enough( stack_size ) )
>        _Internal_error_Occurred(
> @@ -49,27 +51,29 @@ void _ISR_Handler_initialization( void )
>          INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL
>        );
>
> -    _CPU_Interrupt_stack_low = _Workspace_Allocate_or_fatal_error(
> -      stack_size
> -    );
> -
> -    _CPU_Interrupt_stack_high = _Addresses_Add_offset(
> -      _CPU_Interrupt_stack_low,
> -      stack_size
> -    );
> -  }
> +    for ( cpu = 0 ; cpu < max_cpus; ++cpu ) {
> +      Per_CPU_Control *per_cpu = _Per_CPU_Get_by_index( cpu );
> +      void *low = _Workspace_Allocate_or_fatal_error( stack_size );
> +      void *high = _Addresses_Add_offset( low, stack_size );
>
>  #if (CPU_STACK_ALIGNMENT != 0)
> -  _CPU_Interrupt_stack_high = (void *)
> -    ((uintptr_t) _CPU_Interrupt_stack_high & ~(CPU_STACK_ALIGNMENT - 1));
> +      high = _Addresses_Align_down( high, CPU_STACK_ALIGNMENT );
>  #endif
>
> -  /* Interrupt stack might have to be aligned and/or setup
> -   * in a specific way.
> -   */
> +      per_cpu->interrupt_stack_low = low;
> +      per_cpu->interrupt_stack_high = high;
> +
> +      /* Interrupt stack might have to be aligned and/or setup
> +       * in a specific way.
> +       */
>  #if defined(_CPU_Interrupt_stack_setup)
> -  _CPU_Interrupt_stack_setup(_CPU_Interrupt_stack_low, _CPU_Interrupt_stack_high);
> +      _CPU_Interrupt_stack_setup(
> +        per_cpu->interrupt_stack_low,
> +        per_cpu->interrupt_stack_high
> +      );
This could use the local variables 'low' and 'high' to be on one line?

Rest looks good.
-Gedare
>  #endif
> +    }
> +  }
>
>  #endif
>
> diff --git a/cpukit/score/src/percpu.c b/cpukit/score/src/percpu.c
> index b041b45..201c53b 100644
> --- a/cpukit/score/src/percpu.c
> +++ b/cpukit/score/src/percpu.c
> @@ -37,27 +37,6 @@
>      uint32_t cpu;
>
>      /*
> -     *  Initialize per cpu pointer table
> -     */
> -    for ( cpu = 1 ; cpu < max_cpus; ++cpu ) {
> -
> -      Per_CPU_Control *p = _Per_CPU_Get_by_index( cpu );
> -
> -#if CPU_ALLOCATE_INTERRUPT_STACK == TRUE
> -      {
> -        size_t size = rtems_configuration_get_interrupt_stack_size();
> -        uintptr_t ptr;
> -
> -        p->interrupt_stack_low = _Workspace_Allocate_or_fatal_error( size );
> -
> -        ptr = (uintptr_t) _Addresses_Add_offset( p->interrupt_stack_low, size );
> -        ptr &= ~(CPU_STACK_ALIGNMENT - 1);
> -        p->interrupt_stack_high = (void *)ptr;
> -      }
> -#endif
> -    }
> -
> -    /*
>       * Discover and initialize the secondary cores in an SMP system.
>       */
>      max_cpus = bsp_smp_initialize( max_cpus );
> --
> 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