diff options
Diffstat (limited to 'cpukit/include')
-rw-r--r-- | cpukit/include/rtems/confdefs.h | 54 | ||||
-rw-r--r-- | cpukit/include/rtems/config.h | 35 | ||||
-rw-r--r-- | cpukit/include/rtems/score/percpu.h | 53 |
3 files changed, 66 insertions, 76 deletions
diff --git a/cpukit/include/rtems/confdefs.h b/cpukit/include/rtems/confdefs.h index 7f3ffdff0d..e56826af5a 100644 --- a/cpukit/include/rtems/confdefs.h +++ b/cpukit/include/rtems/confdefs.h @@ -1182,12 +1182,13 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; #error "CONFIGURE_IDLE_TASK_STACK_SIZE less than CONFIGURE_MINIMUM_TASK_STACK_SIZE" #endif -/** - * @brief Interrupt stack size configuration. +/* + * Interrupt stack configuration. * * By default, the interrupt stack will be of minimum size. * The BSP or application may override this value. */ + #ifndef CONFIGURE_INTERRUPT_STACK_SIZE #ifdef BSP_INTERRUPT_STACK_SIZE #define CONFIGURE_INTERRUPT_STACK_SIZE BSP_INTERRUPT_STACK_SIZE @@ -1196,18 +1197,23 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; #endif #endif -/** - * This reserves memory for the interrupt stack if it is to be allocated - * by RTEMS rather than the BSP. - * - * @todo Try to get to the point where all BSPs support allocating the - * memory from the Workspace. - */ -#if (CPU_ALLOCATE_INTERRUPT_STACK == 0) - #define _CONFIGURE_INTERRUPT_STACK_MEMORY 0 -#else - #define _CONFIGURE_INTERRUPT_STACK_MEMORY \ - _Configure_From_workspace( CONFIGURE_INTERRUPT_STACK_SIZE ) +#if CONFIGURE_INTERRUPT_STACK_SIZE % CPU_INTERRUPT_STACK_ALIGNMENT != 0 + #error "CONFIGURE_INTERRUPT_STACK_SIZE fails to meet the CPU port interrupt stack alignment" +#endif + +#ifdef CONFIGURE_INIT + RTEMS_DEFINE_GLOBAL_SYMBOL( + _Configuration_Interrupt_stack_size, + CONFIGURE_INTERRUPT_STACK_SIZE + ); + + char _Configuration_Interrupt_stack_area_begin[ + CONFIGURE_MAXIMUM_PROCESSORS * CONFIGURE_INTERRUPT_STACK_SIZE + ] RTEMS_ALIGNED( CPU_INTERRUPT_STACK_ALIGNMENT ) + RTEMS_SECTION( ".rtemsstack.interrupt.begin" ); + + const char _Configuration_Interrupt_stack_area_end[ 0 ] + RTEMS_SECTION( ".rtemsstack.interrupt.end" ) = { }; #endif /** @@ -2720,9 +2726,7 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; * This macro accounts for general RTEMS system overhead. */ #define _CONFIGURE_MEMORY_FOR_SYSTEM_OVERHEAD \ - ( _CONFIGURE_MEMORY_FOR_INTERNAL_TASKS + \ - _CONFIGURE_INTERRUPT_STACK_MEMORY \ - ) + _CONFIGURE_MEMORY_FOR_INTERNAL_TASKS /** * This macro reserves the memory required by the statically configured @@ -2752,18 +2756,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; _CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(CONFIGURE_MAXIMUM_USER_EXTENSIONS) \ ) -/* - * This macro provides a summation of the memory required by SMP as configured. - */ -#if defined(RTEMS_SMP) - #define _CONFIGURE_MEMORY_FOR_SMP \ - (CONFIGURE_MAXIMUM_PROCESSORS * \ - _Configure_From_workspace( CONFIGURE_INTERRUPT_STACK_SIZE ) \ - ) -#else - #define _CONFIGURE_MEMORY_FOR_SMP 0 -#endif - /** * This calculates the memory required for the executive workspace. * @@ -2783,7 +2775,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; _CONFIGURE_MEMORY_FOR_POSIX + \ _CONFIGURE_MEMORY_FOR_STATIC_EXTENSIONS + \ _CONFIGURE_MEMORY_FOR_MP + \ - _CONFIGURE_MEMORY_FOR_SMP + \ CONFIGURE_MESSAGE_BUFFER_MEMORY + \ (CONFIGURE_MEMORY_OVERHEAD * 1024) + \ _CONFIGURE_HEAP_HANDLER_OVERHEAD \ @@ -3082,7 +3073,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; CONFIGURE_TICKS_PER_TIMESLICE, /* ticks per timeslice quantum */ CONFIGURE_IDLE_TASK_BODY, /* user's IDLE task */ CONFIGURE_IDLE_TASK_STACK_SIZE, /* IDLE task stack size */ - CONFIGURE_INTERRUPT_STACK_SIZE, /* interrupt stack size */ CONFIGURE_TASK_STACK_ALLOCATOR_INIT, /* stack allocator init */ CONFIGURE_TASK_STACK_ALLOCATOR, /* stack allocator */ CONFIGURE_TASK_STACK_DEALLOCATOR, /* stack deallocator */ @@ -3239,7 +3229,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; uint32_t POSIX; /* System overhead pieces */ - uint32_t INTERRUPT_STACK_MEMORY; uint32_t MEMORY_FOR_IDLE_TASK; /* Classic API Pieces */ @@ -3288,7 +3277,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; _CONFIGURE_MEMORY_FOR_POSIX, /* System overhead pieces */ - _CONFIGURE_INTERRUPT_STACK_MEMORY, _CONFIGURE_MEMORY_FOR_INTERNAL_TASKS, /* Classic API Pieces */ diff --git a/cpukit/include/rtems/config.h b/cpukit/include/rtems/config.h index 6b97376511..248ace0721 100644 --- a/cpukit/include/rtems/config.h +++ b/cpukit/include/rtems/config.h @@ -184,13 +184,6 @@ typedef struct { */ uint32_t idle_task_stack_size; - /** - * This field specifies the size of the interrupt stack. If less than or - * equal to the minimum stack size, then the interrupt stack will be of - * minimum stack size. - */ - uint32_t interrupt_stack_size; - /** * @brief Optional task stack allocator initialization hook. */ @@ -313,8 +306,34 @@ extern const rtems_configuration_table Configuration; #define rtems_configuration_get_idle_task_stack_size() \ (Configuration.idle_task_stack_size) +/** + * @brief Global symbol with a value equal to the configure interrupt stack size. + * + * This global symbol is defined by the application configuration option + * CONFIGURE_INIT_TASK_STACK_SIZE via <rtems/confdefs.h>. + */ +RTEMS_DECLARE_GLOBAL_SYMBOL( _Configuration_Interrupt_stack_size ); + +/** + * @brief The interrupt stack area begin. + * + * The interrupt stack area is defined by the application configuration via + * <rtems/confdefs.h>. The size of the area depends on + * CONFIGURE_INIT_TASK_STACK_SIZE and CONFIGURE_MAXIMUM_PROCESSORS. + */ +extern char _Configuration_Interrupt_stack_area_begin[]; + +/** + * @brief The interrupt stack area end. + * + * The interrupt stack area is defined by the application configuration via + * <rtems/confdefs.h>. The size of the area depends on + * CONFIGURE_INIT_TASK_STACK_SIZE and CONFIGURE_MAXIMUM_PROCESSORS. + */ +extern const char _Configuration_Interrupt_stack_area_end[]; + #define rtems_configuration_get_interrupt_stack_size() \ - (Configuration.interrupt_stack_size) + ((size_t) _Configuration_Interrupt_stack_size) #define rtems_configuration_get_stack_allocate_init_hook() \ (Configuration.stack_allocate_init_hook) diff --git a/cpukit/include/rtems/score/percpu.h b/cpukit/include/rtems/score/percpu.h index 7d0a6c06bf..4a8353db47 100644 --- a/cpukit/include/rtems/score/percpu.h +++ b/cpukit/include/rtems/score/percpu.h @@ -293,20 +293,15 @@ typedef struct Per_CPU_Control { CPU_Per_CPU_control cpu_per_cpu; #endif - #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) || \ - (CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE) - /** - * This contains a pointer to the lower range of the interrupt stack for - * this CPU. This is the address allocated and freed. - */ - void *interrupt_stack_low; + /** + * @brief The interrupt stack low address for this processor. + */ + void *interrupt_stack_low; - /** - * This contains a pointer to the interrupt stack pointer for this CPU. - * It will be loaded at the beginning on an ISR. - */ - void *interrupt_stack_high; - #endif + /** + * @brief The interrupt stack high address for this processor. + */ + void *interrupt_stack_high; /** * This contains the current interrupt nesting level on this @@ -800,33 +795,21 @@ RTEMS_INLINE_ROUTINE struct _Thread_Control *_Thread_Get_executing( void ) #if defined( ASM ) || defined( _RTEMS_PERCPU_DEFINE_OFFSETS ) -#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) || \ - (CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE) - /* - * If this CPU target lets RTEMS allocates the interrupt stack, then - * we need to have places in the per CPU table to hold them. - */ - #define PER_CPU_INTERRUPT_STACK_LOW \ - CPU_PER_CPU_CONTROL_SIZE - #define PER_CPU_INTERRUPT_STACK_HIGH \ - PER_CPU_INTERRUPT_STACK_LOW + CPU_SIZEOF_POINTER - #define PER_CPU_END_STACK \ - PER_CPU_INTERRUPT_STACK_HIGH + CPU_SIZEOF_POINTER - - #define INTERRUPT_STACK_LOW \ - (SYM(_Per_CPU_Information) + PER_CPU_INTERRUPT_STACK_LOW) - #define INTERRUPT_STACK_HIGH \ - (SYM(_Per_CPU_Information) + PER_CPU_INTERRUPT_STACK_HIGH) -#else - #define PER_CPU_END_STACK \ - CPU_PER_CPU_CONTROL_SIZE -#endif +#define PER_CPU_INTERRUPT_STACK_LOW \ + CPU_PER_CPU_CONTROL_SIZE +#define PER_CPU_INTERRUPT_STACK_HIGH \ + PER_CPU_INTERRUPT_STACK_LOW + CPU_SIZEOF_POINTER + +#define INTERRUPT_STACK_LOW \ + (SYM(_Per_CPU_Information) + PER_CPU_INTERRUPT_STACK_LOW) +#define INTERRUPT_STACK_HIGH \ + (SYM(_Per_CPU_Information) + PER_CPU_INTERRUPT_STACK_HIGH) /* * These are the offsets of the required elements in the per CPU table. */ #define PER_CPU_ISR_NEST_LEVEL \ - PER_CPU_END_STACK + PER_CPU_INTERRUPT_STACK_HIGH + CPU_SIZEOF_POINTER #define PER_CPU_ISR_DISPATCH_DISABLE \ PER_CPU_ISR_NEST_LEVEL + 4 #define PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL \ |