From c2934b96e84c2e7a020761b8164ec0f8702de686 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 17 Feb 2014 13:24:55 +0100 Subject: score: Move SMP interrupt stack initialization 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 | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) (limited to 'cpukit/score/src/isr.c') diff --git a/cpukit/score/src/isr.c b/cpukit/score/src/isr.c index 3adea71bbb..0b0cbe9acd 100644 --- a/cpukit/score/src/isr.c +++ b/cpukit/score/src/isr.c @@ -18,11 +18,11 @@ #include "config.h" #endif -#include -#include #include -#include +#include #include +#include +#include #include #include @@ -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,32 @@ 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. Do not use the local low or high variables here since + * _CPU_Interrupt_stack_setup() is a nasty macro that might want to play + * with the real memory locations. + */ #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 -- cgit v1.2.3