From ecf0f4c4c18956576aeb69372b93910af7ca37e9 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 13 Jun 2008 15:06:32 +0000 Subject: 2008-06-13 Joel Sherrill * posix/include/rtems/posix/pthread.h, posix/src/pthread.c, posix/src/pthreadcreate.c, rtems/include/rtems.h, rtems/src/attr.c, sapi/include/confdefs.h, sapi/include/rtems/config.h, score/inline/rtems/score/stack.inl, score/src/isr.c, score/src/mpci.c, score/src/threadcreateidle.c, score/src/threadinitialize.c, score/src/threadstackallocate.c: Add ability for application to configure minimum stack size. Add RTEMS_CONFIGURED_MINIMUM_STACK_SIZE constant so user can clearly indicate they want the configured as opposed to the recommended minimum stack size. --- cpukit/score/inline/rtems/score/stack.inl | 38 ++++++++++++++++++++++++++++--- cpukit/score/src/isr.c | 2 +- cpukit/score/src/mpci.c | 2 +- cpukit/score/src/threadcreateidle.c | 5 ++-- cpukit/score/src/threadinitialize.c | 6 ++--- cpukit/score/src/threadstackallocate.c | 3 +-- 6 files changed, 42 insertions(+), 14 deletions(-) (limited to 'cpukit/score') diff --git a/cpukit/score/inline/rtems/score/stack.inl b/cpukit/score/inline/rtems/score/stack.inl index cfa634df95..7726cf1a05 100644 --- a/cpukit/score/inline/rtems/score/stack.inl +++ b/cpukit/score/inline/rtems/score/stack.inl @@ -29,7 +29,6 @@ * size bytes of memory starting at starting_address have been * reserved for a stack. */ - RTEMS_INLINE_ROUTINE void _Stack_Initialize ( Stack_Control *the_stack, void *starting_address, @@ -40,16 +39,49 @@ RTEMS_INLINE_ROUTINE void _Stack_Initialize ( the_stack->size = size; } +/** + * This function returns the minimum stack size configured + * for this application. + * + * @return This method returns the minimum stack size; + */ +RTEMS_INLINE_ROUTINE uint32_t _Stack_Minimum (void) +{ + extern uint32_t rtems_minimum_stack_size; + return rtems_minimum_stack_size; +} + /** * This function returns TRUE if size bytes is enough memory for * a valid stack area on this processor, and FALSE otherwise. + * + * @param[in] size is the stack size to check + * + * @return This method returns TRUE if the stack is large enough. */ - RTEMS_INLINE_ROUTINE boolean _Stack_Is_enough ( size_t size ) { - return ( size >= STACK_MINIMUM_SIZE ); + return ( size >= _Stack_Minimum() ); +} + +/** + * This function returns the appropriate stack size given the requested + * size. If the requested size is below the minimum, then the minimum + * configured stack size is returned. + * + * @param[in] size is the stack size to check + * + * @return This method returns the appropriate stack size. + */ +RTEMS_INLINE_ROUTINE size_t _Stack_Ensure_minimum ( + size_t size +) +{ + if ( size >= _Stack_Minimum() ) + return size; + return _Stack_Minimum(); } /** diff --git a/cpukit/score/src/isr.c b/cpukit/score/src/isr.c index d282ebecd6..e6d62a9366 100644 --- a/cpukit/score/src/isr.c +++ b/cpukit/score/src/isr.c @@ -48,7 +48,7 @@ void _ISR_Handler_initialization( void ) #if ( CPU_ALLOCATE_INTERRUPT_STACK == TRUE ) - if ( _Configuration_Table->interrupt_stack_size < STACK_MINIMUM_SIZE ) + if ( !_Stack_Is_enough(_Configuration_Table->interrupt_stack_size) ) _Internal_error_Occurred( INTERNAL_ERROR_CORE, TRUE, diff --git a/cpukit/score/src/mpci.c b/cpukit/score/src/mpci.c index 058191530d..828ad766e5 100644 --- a/cpukit/score/src/mpci.c +++ b/cpukit/score/src/mpci.c @@ -114,7 +114,7 @@ void _MPCI_Create_server( void ) &_Thread_Internal_information, _MPCI_Receive_server_tcb, NULL, /* allocate the stack */ - STACK_MINIMUM_SIZE + + _Stack_Minimum() + CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK + _Configuration_MP_table->extra_mpci_receive_server_stack, CPU_ALL_TASKS_ARE_FP, diff --git a/cpukit/score/src/threadcreateidle.c b/cpukit/score/src/threadcreateidle.c index 3eaff869cf..bcbfcf3039 100644 --- a/cpukit/score/src/threadcreateidle.c +++ b/cpukit/score/src/threadcreateidle.c @@ -64,9 +64,8 @@ void _Thread_Create_idle( void ) if ( _Configuration_Table->idle_task ) idle = _Configuration_Table->idle_task; - idle_task_stack_size = _Configuration_Table->idle_task_stack_size; - if ( idle_task_stack_size < STACK_MINIMUM_SIZE ) - idle_task_stack_size = STACK_MINIMUM_SIZE; + idle_task_stack_size = + _Stack_Ensure_minimum( _Configuration_Table->idle_task_stack_size ); /* * This is only called during initialization and we better be sure diff --git a/cpukit/score/src/threadinitialize.c b/cpukit/score/src/threadinitialize.c index 2956cf42ed..eb4df83e50 100644 --- a/cpukit/score/src/threadinitialize.c +++ b/cpukit/score/src/threadinitialize.c @@ -75,10 +75,8 @@ boolean _Thread_Initialize( if ( !stack_area ) { - if ( !_Stack_Is_enough( stack_size ) ) - actual_stack_size = STACK_MINIMUM_SIZE; - else - actual_stack_size = stack_size; + + actual_stack_size = _Stack_Ensure_minimum( stack_size ); actual_stack_size = _Thread_Stack_Allocate( the_thread, actual_stack_size ); diff --git a/cpukit/score/src/threadstackallocate.c b/cpukit/score/src/threadstackallocate.c index b0b131bfc8..86ae78c4cc 100644 --- a/cpukit/score/src/threadstackallocate.c +++ b/cpukit/score/src/threadstackallocate.c @@ -49,8 +49,7 @@ size_t _Thread_Stack_Allocate( void *stack_addr = 0; size_t the_stack_size = stack_size; - if ( !_Stack_Is_enough( the_stack_size ) ) - the_stack_size = STACK_MINIMUM_SIZE; + the_stack_size = _Stack_Ensure_minimum( stack_size ); /* * Call ONLY the CPU table stack allocate hook, _or_ the -- cgit v1.2.3