diff options
Diffstat (limited to 'cpukit/sapi/src/exinit.c')
-rw-r--r-- | cpukit/sapi/src/exinit.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/cpukit/sapi/src/exinit.c b/cpukit/sapi/src/exinit.c index 6a684d320c..1f482f0ce4 100644 --- a/cpukit/sapi/src/exinit.c +++ b/cpukit/sapi/src/exinit.c @@ -31,6 +31,7 @@ #include <rtems/config.h> #include <rtems/extensionimpl.h> #include <rtems/init.h> +#include <rtems/sysinit.h> #include <rtems/score/sysstate.h> #include <rtems/score/apiext.h> @@ -62,7 +63,7 @@ Objects_Information *_Internal_Objects[ OBJECTS_INTERNAL_CLASSES_LAST + 1 ]; -void rtems_initialize_data_structures(void) +static void rtems_initialize_data_structures(void) { /* * Dispatching and interrupts are disabled until the end of the @@ -152,7 +153,7 @@ void rtems_initialize_data_structures(void) */ } -void rtems_initialize_before_drivers(void) +static void rtems_initialize_before_drivers(void) { #ifdef RTEMS_DRVMGR_STARTUP _DRV_Manager_initialization(); @@ -163,7 +164,7 @@ void rtems_initialize_before_drivers(void) #endif } -void rtems_initialize_device_drivers(void) +static void rtems_initialize_device_drivers(void) { /* * Initialize all the device drivers and initialize the MPCI layer. @@ -246,8 +247,37 @@ void rtems_initialize_device_drivers(void) _API_extensions_Run_postdriver(); } -void rtems_initialize_start_multitasking(void) +RTEMS_LINKER_ROSET( _Sysinit, rtems_sysinit_item ); + +RTEMS_SYSINIT_ITEM( + rtems_initialize_data_structures, + RTEMS_SYSINIT_DATA_STRUCTURES, + RTEMS_SYSINIT_ORDER_MIDDLE +); + +RTEMS_SYSINIT_ITEM( + rtems_initialize_before_drivers, + RTEMS_SYSINIT_BEFORE_DRIVERS, + RTEMS_SYSINIT_ORDER_MIDDLE +); + +RTEMS_SYSINIT_ITEM( + rtems_initialize_device_drivers, + RTEMS_SYSINIT_DEVICE_DRIVERS, + RTEMS_SYSINIT_ORDER_MIDDLE +); + +void rtems_initialize_executive(void) { + const volatile rtems_sysinit_item *cur = RTEMS_LINKER_SET_BEGIN(_Sysinit ); + const volatile rtems_sysinit_item *end = RTEMS_LINKER_SET_END( _Sysinit ); + + /* Invoke the registered system initialization handlers */ + while ( cur != end ) { + ( *cur->handler )(); + ++cur; + } + _System_state_Set( SYSTEM_STATE_UP ); _SMP_Request_start_multitasking(); |