diff options
Diffstat (limited to 'cpukit/sapi')
-rw-r--r-- | cpukit/sapi/include/confdefs.h | 47 | ||||
-rw-r--r-- | cpukit/sapi/include/rtems/config.h | 44 |
2 files changed, 72 insertions, 19 deletions
diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h index 169cb90761..9cd2954841 100644 --- a/cpukit/sapi/include/confdefs.h +++ b/cpukit/sapi/include/confdefs.h @@ -44,6 +44,7 @@ */ #include <rtems.h> #include <rtems/score/apimutex.h> +#include <rtems/score/wkspace.h> #ifdef __cplusplus extern "C" { @@ -823,17 +824,24 @@ rtems_fs_init_functions_t rtems_fs_init_helper = #endif /** - * Configure the very much optional task stack allocator + * Configure the very much optional task stack allocator initialization */ -#ifndef CONFIGURE_TASK_STACK_ALLOCATOR - #define CONFIGURE_TASK_STACK_ALLOCATOR NULL +#ifndef CONFIGURE_TASK_STACK_ALLOCATOR_INIT + #define CONFIGURE_TASK_STACK_ALLOCATOR_INIT NULL #endif -/** - * Configure the very much optional task stack deallocator +/* + * Configure the very much optional task stack allocator and deallocator. */ -#ifndef CONFIGURE_TASK_STACK_DEALLOCATOR - #define CONFIGURE_TASK_STACK_DEALLOCATOR NULL +#if !defined(CONFIGURE_TASK_STACK_ALLOCATOR) \ + && !defined(CONFIGURE_TASK_STACK_DEALLOCATOR) + #define CONFIGURE_TASK_STACK_ALLOCATOR _Workspace_Allocate + #define CONFIGURE_TASK_STACK_DEALLOCATOR _Workspace_Free +#elif (defined(CONFIGURE_TASK_STACK_ALLOCATOR) \ + && !defined(CONFIGURE_TASK_STACK_DEALLOCATOR)) \ + || (!defined(CONFIGURE_TASK_STACK_ALLOCATOR) \ + && defined(CONFIGURE_TASK_STACK_DEALLOCATOR)) + #error "CONFIGURE_TASK_STACK_ALLOCATOR and CONFIGURE_TASK_STACK_DEALLOCATOR must be both defined or both undefined" #endif /** @@ -869,7 +877,6 @@ rtems_fs_init_functions_t rtems_fs_init_helper = #endif #ifdef CONFIGURE_UNIFIED_WORK_AREAS - #include <rtems/score/wkspace.h> Heap_Control *RTEMS_Malloc_Heap = &_Workspace_Area; #else Heap_Control RTEMS_Malloc_Area; @@ -929,6 +936,19 @@ rtems_fs_init_functions_t rtems_fs_init_helper = (ssize_t)((_size) + HEAP_BLOCK_HEADER_SIZE + CPU_HEAP_ALIGNMENT - 1) /** + * This is a helper macro used in stack space calculations in this file. It + * may be provided by the application in case a special task stack allocator + * is used. The default is allocation from the RTEMS Workspace. + */ +#ifdef CONFIGURE_TASK_STACK_FROM_ALLOCATOR + #define _Configure_From_stackspace(_stack_size) \ + CONFIGURE_TASK_STACK_FROM_ALLOCATOR(_stack_size) +#else + #define _Configure_From_stackspace(_stack_size) \ + _Configure_From_workspace(_stack_size) +#endif + +/** * Do not use the unlimited bit as part of the multiplication * for memory usage. */ @@ -2051,23 +2071,23 @@ rtems_fs_init_functions_t rtems_fs_init_helper = #define CONFIGURE_IDLE_TASKS_STACK \ (CONFIGURE_IDLE_TASKS_COUNT * \ - _Configure_From_workspace( CONFIGURE_IDLE_TASK_STACK_SIZE ) ) + _Configure_From_stackspace( CONFIGURE_IDLE_TASK_STACK_SIZE ) ) #define CONFIGURE_TASKS_STACK \ (_Configure_Max_Objects( CONFIGURE_MAXIMUM_TASKS ) * \ - _Configure_From_workspace( CONFIGURE_MINIMUM_TASK_STACK_SIZE ) ) + _Configure_From_stackspace( CONFIGURE_MINIMUM_TASK_STACK_SIZE ) ) #define CONFIGURE_POSIX_THREADS_STACK \ (_Configure_Max_Objects( CONFIGURE_MAXIMUM_POSIX_THREADS ) * \ - _Configure_From_workspace( CONFIGURE_MINIMUM_POSIX_THREAD_STACK_SIZE ) ) + _Configure_From_stackspace( CONFIGURE_MINIMUM_POSIX_THREAD_STACK_SIZE ) ) #define CONFIGURE_GOROUTINES_STACK \ (_Configure_Max_Objects( CONFIGURE_MAXIMUM_GOROUTINES ) * \ - _Configure_From_workspace( CONFIGURE_MINIMUM_POSIX_THREAD_STACK_SIZE ) ) + _Configure_From_stackspace( CONFIGURE_MINIMUM_POSIX_THREAD_STACK_SIZE ) ) #define CONFIGURE_ADA_TASKS_STACK \ (_Configure_Max_Objects( CONFIGURE_MAXIMUM_ADA_TASKS ) * \ - _Configure_From_workspace( CONFIGURE_MINIMUM_POSIX_THREAD_STACK_SIZE ) ) + _Configure_From_stackspace( CONFIGURE_MINIMUM_POSIX_THREAD_STACK_SIZE ) ) #else /* CONFIGURE_EXECUTIVE_RAM_SIZE */ @@ -2180,6 +2200,7 @@ rtems_fs_init_functions_t rtems_fs_init_helper = 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 */ CONFIGURE_ZERO_WORKSPACE_AUTOMATICALLY, /* true to clear memory */ diff --git a/cpukit/sapi/include/rtems/config.h b/cpukit/sapi/include/rtems/config.h index 590999c029..25ddfda421 100644 --- a/cpukit/sapi/include/rtems/config.h +++ b/cpukit/sapi/include/rtems/config.h @@ -84,6 +84,30 @@ typedef struct { } rtems_multiprocessing_table; #endif +/** + * @brief Task stack allocator initialization hook. + * + * @param[in] stack_space_size Size of the stack space in bytes. + */ +typedef void (*rtems_stack_allocate_init_hook)( size_t stack_space_size ); + +/** + * @brief Task stack allocator hook. + * + * @param[in] stack_size Size of the task stack in bytes. + * + * @retval NULL Not enough memory. + * @retval other Pointer to task stack. + */ +typedef void *(*rtems_stack_allocate_hook)( size_t stack_size ); + +/** + * @brief Task stack deallocator hook. + * + * @param[in] addr Pointer to previously allocated task stack. + */ +typedef void (*rtems_stack_free_hook)( void *addr ); + /* * The following records define the Configuration Table. The * information contained in this table is required in all @@ -139,15 +163,20 @@ typedef struct { */ uint32_t interrupt_stack_size; - /** The BSP may want to provide it's own stack allocation routines. - * In this case, the BSP will provide this stack allocation hook. + /** + * @brief Optional task stack allocator initialization hook. */ - void * (*stack_allocate_hook)( size_t ); + rtems_stack_allocate_init_hook stack_allocate_init_hook; - /** The BSP may want to provide it's own stack free routines. - * In this case, the BSP will provide this stack free hook. + /** + * @brief Optional task stack allocator hook. */ - void (*stack_free_hook)( void *); + rtems_stack_allocate_hook stack_allocate_hook; + + /** + * @brief Optional task stack free hook. + */ + rtems_stack_free_hook stack_free_hook; /** If this element is TRUE, then RTEMS will zero the Executive Workspace. * When this element is FALSE, it is assumed that the BSP or invoking @@ -268,6 +297,9 @@ extern rtems_configuration_table Configuration; #define rtems_configuration_get_interrupt_stack_size() \ (Configuration.interrupt_stack_size) +#define rtems_configuration_get_stack_allocate_init_hook() \ + (Configuration.stack_allocate_init_hook) + #define rtems_configuration_get_stack_allocate_hook() \ (Configuration.stack_allocate_hook) |