[PATCH 01/17] score: Move SMP interrupt stack initialization
Sebastian Huber
sebastian.huber at embedded-brains.de
Mon Feb 17 15:51:26 UTC 2014
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
More information about the devel
mailing list