On Mon, Feb 17, 2014 at 10:51 AM, Sebastian Huber <sebastian.hu...@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@rtems.org > http://www.rtems.org/mailman/listinfo/rtems-devel _______________________________________________ rtems-devel mailing list rtems-devel@rtems.org http://www.rtems.org/mailman/listinfo/rtems-devel