[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