diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-11-07 13:59:19 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-11-13 09:20:57 +0100 |
commit | 466cf31d81cf0cc5fd659aed0924a1f6ee7d18be (patch) | |
tree | d1381235011ecaced397b15ba14e4522dd8db72c /cpukit/score/src/userext.c | |
parent | score: Add and use _User_extensions_Iterate() (diff) | |
download | rtems-466cf31d81cf0cc5fd659aed0924a1f6ee7d18be.tar.bz2 |
score: Statically initialize user extensions
The initial extensions remain now in a read-only table and will not be
copied to work space memory. The extension chains are statically
initialized. This makes it possible to call _User_extensions_Iterate()
independent of the system state. It is now guaranteed that the fatal
callout of the initial extensions will be called provided the stack
pointer, the read-only data, and code memory are valid.
Diffstat (limited to 'cpukit/score/src/userext.c')
-rw-r--r-- | cpukit/score/src/userext.c | 59 |
1 files changed, 33 insertions, 26 deletions
diff --git a/cpukit/score/src/userext.c b/cpukit/score/src/userext.c index 4b81daa4ea..78162f6cdd 100644 --- a/cpukit/score/src/userext.c +++ b/cpukit/score/src/userext.c @@ -16,44 +16,51 @@ */ #if HAVE_CONFIG_H -#include "config.h" + #include "config.h" #endif -#include <rtems/system.h> #include <rtems/config.h> #include <rtems/score/userext.h> #include <rtems/score/wkspace.h> -#include <string.h> -void _User_extensions_Handler_initialization(void) +CHAIN_DEFINE_EMPTY( _User_extensions_Switches_list ); + +typedef struct { + User_extensions_Switch_control *switch_control; +} User_extensions_Switch_context; + +static void _User_extensions_Switch_visitor( + Thread_Control *executing, + void *arg, + const User_extensions_Table *callouts +) { - User_extensions_Control *extension; - uint32_t i; - uint32_t number_of_extensions; - const User_extensions_Table *initial_extensions; + User_extensions_thread_switch_extension callout = callouts->thread_switch; - number_of_extensions = rtems_configuration_get_number_of_initial_extensions(); - initial_extensions = rtems_configuration_get_user_extension_table(); + if ( callout != NULL ) { + User_extensions_Switch_context *ctx = arg; + User_extensions_Switch_control *ctrl = ctx->switch_control; - _Chain_Initialize_empty( &_User_extensions_List ); - _Chain_Initialize_empty( &_User_extensions_Switches_list ); + _Chain_Append_unprotected( &_User_extensions_Switches_list, &ctrl->Node ); + ctrl->thread_switch = callout; + + ctx->switch_control = ctrl + 1; + } +} - if ( initial_extensions ) { - extension = (User_extensions_Control *) +void _User_extensions_Handler_initialization(void) +{ + uint32_t number_of_initial_extensions = + rtems_configuration_get_number_of_initial_extensions(); + + if ( number_of_initial_extensions > 0 ) { + User_extensions_Switch_control *initial_extension_switch_controls = _Workspace_Allocate_or_fatal_error( - number_of_extensions * sizeof( User_extensions_Control ) + number_of_initial_extensions + * sizeof( *initial_extension_switch_controls ) ); + User_extensions_Switch_context ctx = { initial_extension_switch_controls }; - memset ( - extension, - 0, - number_of_extensions * sizeof( User_extensions_Control ) - ); - - for ( i = 0 ; i < number_of_extensions ; i++ ) { - _User_extensions_Add_set_with_table (extension, &initial_extensions[i]); - extension++; - } + _User_extensions_Iterate( &ctx, _User_extensions_Switch_visitor ); } } - |