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 + ); #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