summaryrefslogtreecommitdiffstats
path: root/src/usr/initservice
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/initservice')
-rw-r--r--src/usr/initservice/baseinitsvc/initservice.C104
-rw-r--r--src/usr/initservice/baseinitsvc/initsvctasks.H21
-rw-r--r--src/usr/initservice/common/initsvcstructs.H12
-rw-r--r--src/usr/initservice/extinitsvc/extinitsvc.C21
-rw-r--r--src/usr/initservice/extinitsvc/extinitsvctasks.H7
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
}
};
OpenPOWER on IntegriCloud