diff options
Diffstat (limited to 'src/usr/initservice')
-rw-r--r-- | src/usr/initservice/baseinitsvc/initservice.C | 104 | ||||
-rw-r--r-- | src/usr/initservice/baseinitsvc/initsvctasks.H | 21 | ||||
-rw-r--r-- | src/usr/initservice/common/initsvcstructs.H | 12 | ||||
-rw-r--r-- | src/usr/initservice/extinitsvc/extinitsvc.C | 21 | ||||
-rw-r--r-- | src/usr/initservice/extinitsvc/extinitsvctasks.H | 7 |
5 files changed, 111 insertions, 54 deletions
diff --git a/src/usr/initservice/baseinitsvc/initservice.C b/src/usr/initservice/baseinitsvc/initservice.C index dc8380f19..55e395c49 100644 --- a/src/usr/initservice/baseinitsvc/initservice.C +++ b/src/usr/initservice/baseinitsvc/initservice.C @@ -25,6 +25,7 @@ #include <kernel/console.H> #include <sys/vfs.h> +#include <vfs/vfs.H> #include <sys/task.h> #include <trace/interface.H> #include <errl/errlentry.H> @@ -77,54 +78,66 @@ errlHndl_t InitService::startTask( const TaskInfo *i_ptask, assert(i_ptask->taskflags.task_type == START_TASK); - tidrc = task_exec( i_ptask->taskname, io_pargs ); // launch the child - if ( static_cast<int16_t>(tidrc) < 0 ) + // Base modules have already been loaded and initialized, + // extended modules have not. + if(i_ptask->taskflags.module_type == EXT_IMAGE) { - // task failed to launch, post an errorlog and dump some trace - /*@ errorlog tag - * @errortype ERRL_SEV_CRITICAL_SYS_TERM - * @moduleid see task list - * @reasoncode START_TASK_FAILED - * @userdata1 task id or task return code - * @userdata2 0 - * - * @devdesc Initialization Service failed to start a task. - * The module id will identify the task. - * - */ - lo_errl = new ERRORLOG::ErrlEntry( - ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM, // severity - i_ptask->taskflags.module_id, // moduleid - INITSERVICE::START_TASK_FAILED, // reason Code - tidrc, // user1 = tidrc - 0 - ); - TRACDBIN( g_trac_initsvc, - "ERROR starting task:", - i_ptask->taskname, - strlen(i_ptask->taskname) ); - TRACDCOMP( g_trac_initsvc, - "tidrc=%d, errlog p = %p" , - (int16_t)tidrc, lo_errl ); + // load module and call _init() + lo_errl = VFS::module_load( i_ptask->taskname ); + } - } // endif tidrc - else + if( !lo_errl) { - // task launched OK. - TRACDBIN( g_trac_initsvc, - "Task finished OK :", - i_ptask->taskname, - strlen(i_ptask->taskname) ); - TRACDCOMP( g_trac_initsvc, - "task number %d, errlog p = %p", - tidrc, lo_errl ); + tidrc = task_exec( i_ptask->taskname, io_pargs ); // launch the child - if ( io_pargs ) + if ( static_cast<int16_t>(tidrc) < 0 ) { - io_pargs->waitParentSync(); // sync up childtask - } + // task failed to launch, post an errorlog and dump some trace + /*@ errorlog tag + * @errortype ERRL_SEV_CRITICAL_SYS_TERM + * @moduleid see task list + * @reasoncode START_TASK_FAILED + * @userdata1 task id or task return code + * @userdata2 0 + * + * @devdesc Initialization Service failed to start a task. + * The module id will identify the task. + * + */ + lo_errl = new ERRORLOG::ErrlEntry( + ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM, // severity + i_ptask->taskflags.module_id, // moduleid + INITSERVICE::START_TASK_FAILED, // reason Code + tidrc, // user1 = tidrc + 0 + ); + TRACDBIN( g_trac_initsvc, + "ERROR starting task:", + i_ptask->taskname, + strlen(i_ptask->taskname) ); + TRACDCOMP( g_trac_initsvc, + "tidrc=%d, errlog p = %p" , + (int16_t)tidrc, lo_errl ); + + } // endif tidrc + else + { + // task launched OK. + TRACDBIN( g_trac_initsvc, + "Task finished OK :", + i_ptask->taskname, + strlen(i_ptask->taskname) ); + TRACDCOMP( g_trac_initsvc, + "task number %d, errlog p = %p", + tidrc, lo_errl ); + if ( io_pargs ) + { + io_pargs->waitParentSync(); // sync up childtask + } + } } + // else module load failed. have error log return lo_errl; } @@ -315,6 +328,15 @@ void InitService::init( void *i_ptr ) "task_type==BARRIER" ); // $$TODO break; + + case UNINIT_TASK: + TRACDBIN( g_trac_initsvc, + "task_type=UNINIT_TASK : ", + ptask->taskname, + strlen(ptask->taskname) ); + errl = VFS::module_unload( ptask->taskname ); + break; + default: TRACDCOMP( g_trac_initsvc, "Invalid task_type %d: ", diff --git a/src/usr/initservice/baseinitsvc/initsvctasks.H b/src/usr/initservice/baseinitsvc/initsvctasks.H index bf9c925f4..297386ab7 100644 --- a/src/usr/initservice/baseinitsvc/initsvctasks.H +++ b/src/usr/initservice/baseinitsvc/initsvctasks.H @@ -61,18 +61,31 @@ const TaskInfo g_taskinfolist[] = { } }, + /** + * @brief Extended VFS module + */ + { + "libvfs.so", // taskname + NULL, + { + START_TASK, // start task + BASE_IMAGE, // Base Module + START_VFS_ERRL_ID, // module id for error log + } + }, + // ----- Extended Image ----------------------------------------------------- /** * @brief extinitsvc, initializes extended module area */ { - "libextinitsvc.so" , // taskname + "libextinitsvc.so" , // taskname NULL, // no pointer to fn { - START_TASK, // don't start - EXT_IMAGE, // Ext Module - START_EXTINITSVC_ERRL_ID, // module id for errorlog + START_TASK, // call start() + BASE_IMAGE, // TODO EXT_IMAGE + START_EXTINITSVC_ERRL_ID, // module id for errorlog } }, diff --git a/src/usr/initservice/common/initsvcstructs.H b/src/usr/initservice/common/initsvcstructs.H index f78c093b8..9d169c676 100644 --- a/src/usr/initservice/common/initsvcstructs.H +++ b/src/usr/initservice/common/initsvcstructs.H @@ -43,21 +43,25 @@ namespace INITSERVICE /** * @enum TaskType * - NONE == placeholder, no task - * - START_TASK == task with _start() function entry point + * - INIT_TASK == load and initialize task, but task has no _start() + * (extended image only) + * - START_TASK == BASE_IMAGE: call _start() function entry point + * EXT_IMAGE: call _init(), then _start() * - START_FN == task with function pointer entry point * - BARRIER == set barrier for next N tasks. - * - STOP_TASK == Execute the destructor on the task in extended image. - * ( not implemented yet) + * - UNINIT_TASK == call _fini() to call static destructor(s) on the task. + * (extended image only) * - END_TASK_LIST == last entry in the task list. */ enum TaskType { UNDEFINED_TT = 0, NONE, + INIT_TASK, START_TASK, START_FN, BARRIER, - STOP_TASK, + UNINIT_TASK, END_TASK_LIST, }; diff --git a/src/usr/initservice/extinitsvc/extinitsvc.C b/src/usr/initservice/extinitsvc/extinitsvc.C index db1baef50..1b5612645 100644 --- a/src/usr/initservice/extinitsvc/extinitsvc.C +++ b/src/usr/initservice/extinitsvc/extinitsvc.C @@ -24,7 +24,7 @@ */ #include <kernel/console.H> -#include <sys/vfs.h> +#include <vfs/vfs.H> #include <sys/task.h> #include <sys/sync.h> #include <sys/misc.h> @@ -132,7 +132,15 @@ void ExtInitSvc::init( void *i_ptr ) ptask->taskname, strlen(ptask->taskname) ); break; - case START_TASK: + case INIT_TASK: + TRACDBIN( g_trac_initsvc, + "task_type==INIT_TASK : ", + ptask->taskname, + strlen(ptask->taskname) ); + errl = VFS::module_load( ptask->taskname ); + break; + + case START_TASK: // call _init(), _start(), stay resident TRACDBIN( g_trac_initsvc, "task_type=START_TASK : ", ptask->taskname, @@ -140,6 +148,7 @@ void ExtInitSvc::init( void *i_ptr ) errl = InitService::getTheInstance().startTask( ptask, &args ); break; + case START_FN: TRACDCOMP( g_trac_initsvc, "task_type==START_FN : %p", @@ -154,6 +163,14 @@ void ExtInitSvc::init( void *i_ptr ) // $$TODO break; + case UNINIT_TASK: + TRACDBIN( g_trac_initsvc, + "task_type=UNINIT_TASK : ", + ptask->taskname, + strlen(ptask->taskname) ); + errl = VFS::module_unload( ptask->taskname ); + break; + default: TRACDCOMP( g_trac_initsvc, "Invalid task_type: %d", diff --git a/src/usr/initservice/extinitsvc/extinitsvctasks.H b/src/usr/initservice/extinitsvc/extinitsvctasks.H index 9c31bc81d..d65abb914 100644 --- a/src/usr/initservice/extinitsvc/extinitsvctasks.H +++ b/src/usr/initservice/extinitsvc/extinitsvctasks.H @@ -30,6 +30,7 @@ namespace INITSERVICE { + // TODO all these will eventuall be in BASE_IMAGE instead of BASE_IMAGE const uint64_t MAX_EXT_TASKS = 25; @@ -45,7 +46,7 @@ const TaskInfo g_exttaskinfolist[] = { NULL, // no pointer to fn { START_TASK, // task type - EXT_IMAGE, // Extended Module + BASE_IMAGE, // Extended Module START_TARGETING_ERRL_ID, // module id } }, @@ -58,7 +59,7 @@ const TaskInfo g_exttaskinfolist[] = { NULL, // no pointer to fn { START_TASK, // task type - EXT_IMAGE, // Extended Module + BASE_IMAGE, // Extended Module EXECUTE_ISTEPS_ERRL_ID, // module id } }, @@ -89,7 +90,7 @@ const TaskInfo CXXTEST_TASK = { NULL, // no pointer to fn { START_TASK, // task type - EXT_IMAGE, // Extended Module + BASE_IMAGE, // Extended Module START_CXXTEST_ERRL_ID, // module id } }; |