summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-02-17 13:24:55 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-02-19 09:59:38 +0100
commitc2934b96e84c2e7a020761b8164ec0f8702de686 (patch)
tree79e54bff7d8b441eee0b70362c52505238788e1c
parentsmptests: Add check for affinity support in newlib. (diff)
downloadrtems-c2934b96e84c2e7a020761b8164ec0f8702de686.tar.bz2
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.
-rw-r--r--cpukit/score/src/isr.c43
-rw-r--r--cpukit/score/src/percpu.c21
2 files changed, 25 insertions, 39 deletions
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 <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,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
diff --git a/cpukit/score/src/percpu.c b/cpukit/score/src/percpu.c
index b041b45197..201c53be5a 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 );