summaryrefslogtreecommitdiffstats
path: root/src/usr/initservice/baseinitsvc/initservice.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/initservice/baseinitsvc/initservice.C')
-rw-r--r--src/usr/initservice/baseinitsvc/initservice.C214
1 files changed, 143 insertions, 71 deletions
diff --git a/src/usr/initservice/baseinitsvc/initservice.C b/src/usr/initservice/baseinitsvc/initservice.C
index de96ea922..dc8380f19 100644
--- a/src/usr/initservice/baseinitsvc/initservice.C
+++ b/src/usr/initservice/baseinitsvc/initservice.C
@@ -1,3 +1,20 @@
+/****************************************************************************
+ * $IBMCopyrightBlock:
+ *
+ * IBM Confidential
+ *
+ * Licensed Internal Code Source Materials
+ *
+ * IBM HostBoot Licensed Internal Code
+ *
+ * (C) Copyright IBM Corp. 2011
+ *
+ * The source code for this program is not published or other-
+ * wise divested of its trade secrets, irrespective of what has
+ * been deposited with the U.S. Copyright Office.
+ * $
+****************************************************************************/
+
/**
* @file initservice.C
*
@@ -51,16 +68,12 @@ InitService::~InitService()
}
-/**
- * @todo mechanism to set taskcommand in TaskArgs struct
- * @todo check taskreturncode inside of TaskArgs
- * @todo test errorlog inside of Taskargs
- */
+
errlHndl_t InitService::startTask( const TaskInfo *i_ptask,
- TaskArgs::TaskArgs *io_pargs,
- errlHndl_t &io_rerrl ) const
+ TaskArgs::TaskArgs *io_pargs ) const
{
- tid_t tidrc = 0;
+ tid_t tidrc = 0;
+ errlHndl_t lo_errl = NULL;
assert(i_ptask->taskflags.task_type == START_TASK);
@@ -68,7 +81,18 @@ errlHndl_t InitService::startTask( const TaskInfo *i_ptask,
if ( static_cast<int16_t>(tidrc) < 0 )
{
// task failed to launch, post an errorlog and dump some trace
- io_rerrl = new ERRORLOG::ErrlEntry(
+ /*@ 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
@@ -81,37 +105,36 @@ errlHndl_t InitService::startTask( const TaskInfo *i_ptask,
strlen(i_ptask->taskname) );
TRACDCOMP( g_trac_initsvc,
"tidrc=%d, errlog p = %p" ,
- (int16_t)tidrc, io_rerrl );
+ (int16_t)tidrc, lo_errl );
} // endif tidrc
else
{
- // task launched OK.
+ // 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, io_rerrl );
+ tidrc, lo_errl );
if ( io_pargs )
{
io_pargs->waitParentSync(); // sync up childtask
}
-
- }
- return io_rerrl;
+ }
+
+ return lo_errl;
}
errlHndl_t InitService::executeFn( const TaskInfo *i_ptask,
- TaskArgs *io_pargs
-) const
+ TaskArgs *io_pargs ) const
{
tid_t tidrc = 0;
- errlHndl_t errl = NULL;
+ errlHndl_t lo_errl = NULL;
if ( i_ptask->taskfn == NULL )
{
@@ -119,57 +142,82 @@ errlHndl_t InitService::executeFn( const TaskInfo *i_ptask,
"ERROR: NULL function pointer:",
i_ptask->taskname,
strlen(i_ptask->taskname) );
-
- errl = new ERRORLOG::ErrlEntry(
+ /*@ errorlog tag
+ * @errortype ERRL_SEV_CRITICAL_SYS_TERM
+ * @moduleid see task list
+ * @reasoncode NULL_FN_PTR
+ * @userdata1 0
+ * @userdata2 0
+ *
+ * @devdesc Initialization Service attempted to start a
+ * function within a module but found a NULL pointer
+ * instead of the function.
+ * 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::NULL_FN_PTR, // reason Code
0,
0 );
- return errl;
+ // fall through to end and return bad error log
}
-
-
- // valid function, launch it
- tidrc = task_create( i_ptask->taskfn, io_pargs );
- if ( static_cast<int16_t>(tidrc) < 0 )
- {
- errl = new ERRORLOG::ErrlEntry(
- ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM, // severity
- i_ptask->taskflags.module_id, // moduleid
- INITSERVICE::START_FN_FAILED, // reason Code
- tidrc, // user1 = tidrc
- 0 );
-
- TRACDBIN( g_trac_initsvc,
- ENTER_MRK "ERROR starting function:",
- i_ptask->taskname,
- strlen(i_ptask->taskname) );
- TRACDCOMP( g_trac_initsvc,
- EXIT_MRK "tidrc=%d, errlog p = %p" ,
- (int16_t)tidrc, errl );
-
- } // endif tidrc
else
{
- TRACDBIN( g_trac_initsvc,
- ENTER_MRK "function launched OK :",
- i_ptask->taskname,
- strlen(i_ptask->taskname) );
- TRACDCOMP( g_trac_initsvc,
- EXIT_MRK "task number %d, errlog p = %p",
- tidrc, errl );
+ // valid function, launch it
+ tidrc = task_create( i_ptask->taskfn, io_pargs );
+ if ( static_cast<int16_t>(tidrc) < 0 )
+ {
+ /*@ errorlog tag
+ * @errortype ERRL_SEV_CRITICAL_SYS_TERM
+ * @moduleid see task list
+ * @reasoncode NULL_FN_PTR
+ * @userdata1 0
+ * @userdata2 0
+ *
+ * @devdesc Initialization Service attempted to start a
+ * function within a module but the function
+ * failed to launch
+ * 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_FN_FAILED, // reason Code
+ tidrc, // user1 = tidrc
+ 0 );
- // task launched OK.
- if ( io_pargs )
+ TRACDBIN( g_trac_initsvc,
+ ENTER_MRK "ERROR starting function:",
+ i_ptask->taskname,
+ strlen(i_ptask->taskname) );
+ TRACDCOMP( g_trac_initsvc,
+ EXIT_MRK "tidrc=%d, errlog p = %p" ,
+ (int16_t)tidrc, lo_errl );
+
+ } // endif tidrc
+ else
{
- io_pargs->waitParentSync(); // sync up parent task
+ TRACDBIN( g_trac_initsvc,
+ ENTER_MRK "function launched OK :",
+ i_ptask->taskname,
+ strlen(i_ptask->taskname) );
+ TRACDCOMP( g_trac_initsvc,
+ EXIT_MRK "task number %d, errlog p = %p",
+ tidrc, lo_errl );
+
+ // task launched OK.
+ if ( io_pargs )
+ {
+ io_pargs->waitParentSync(); // sync up parent task
+ }
}
- }
- return errl;
+ } // end else
+
+ return lo_errl;
}
@@ -185,21 +233,19 @@ void InitService::reportError(errlHndl_t &io_rerrl ) const
TRACDCOMP( g_trac_initsvc,
"Committing the error log %p.",
- io_rerrl
- );
+ io_rerrl );
errlCommit( io_rerrl );
}
- return;
}
/**
* @todo this will make a system call to post the error code.
*/
-void InitService::setProgressCode( uint64_t &i_progresscode ) const
+void InitService::setProgressCode( uint64_t i_progresscode ) const
{
// do nothing for now
@@ -212,10 +258,10 @@ void InitService::setProgressCode( uint64_t &i_progresscode ) const
*/
void InitService::init( void *i_ptr )
{
- errlHndl_t errl = NULL; // steps will return an error handle if failure
- uint64_t nextTask = 0;
- const TaskInfo *ptask = NULL;
- TaskArgs::TaskArgs args;
+ errlHndl_t errl = NULL; // steps will return an error handle if failure
+ uint64_t nextTask = 0;
+ const TaskInfo *ptask = NULL;
+ TaskArgs::TaskArgs args;
TRACFCOMP( g_trac_initsvc,
ENTER_MRK "Initialization Service is starting." );
@@ -229,7 +275,7 @@ void InitService::init( void *i_ptr )
nextTask++ )
{
// make a local copy of the base image task
- ptask = &(iv_taskinfolist[nextTask]);
+ ptask = &(g_taskinfolist[nextTask]);
if ( ptask->taskflags.task_type == END_TASK_LIST )
{
TRACDCOMP( g_trac_initsvc,
@@ -237,6 +283,8 @@ void InitService::init( void *i_ptr )
break;
}
+ args.clear(); // clear args struct for next task
+
// dispatch tasks...
switch ( ptask->taskflags.task_type)
{
@@ -253,30 +301,41 @@ void InitService::init( void *i_ptr )
ptask->taskname,
strlen( ptask->taskname) );
errl = startTask( ptask, // task struct
- &args, // args
- errl ); // errlog
+ &args ); // args
break;
case START_FN:
TRACDCOMP( g_trac_initsvc,
"task_type==START_FN : %p",
ptask->taskfn );
- // $$TODO
+ errl = executeFn( ptask,
+ &args );
break;
case BARRIER:
TRACDCOMP( g_trac_initsvc,
"task_type==BARRIER" );
// $$TODO
break;
-
default:
TRACDCOMP( g_trac_initsvc,
"Invalid task_type %d: ",
ptask->taskflags.task_type );
+ /*@ errorlog tag
+ * @errortype ERRL_SEV_CRITICAL_SYS_TERM
+ * @moduleid BASE_INITSVC_ERRL_ID
+ * @reasoncode INVALID_TASK_TYPE
+ * @userdata1 task_type value
+ * @userdata2 0
+ *
+ * @devdesc Initialization Service found an invalid
+ * Task Type in the task list.
+ * The module id will identify the task.
+ * task_type value will be the invalid type.
+ */
errl = new ERRORLOG::ErrlEntry(
ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM, // severity
BASE_INITSVC_ERRL_ID, // moduleid
INVALID_TASK_TYPE, // reason Code
- 0, // user1 = tidrc
+ ptask->taskflags.task_type,
0 );
break;
@@ -285,6 +344,20 @@ void InitService::init( void *i_ptr )
// report an error
reportError( errl );
+ if ( args.getReturnCode() != TASKARGS_UNDEFINED64 )
+ {
+ TRACFCOMP( g_trac_initsvc,
+ ERR_MRK "InitService TaskArgs returned 0x%llx, errlog=%p",
+ args.getReturnCode(),
+ args.getErrorLog()
+ );
+
+ errlHndl_t childerrl = args.getErrorLog(); // local copy
+ reportError( childerrl ); // report child error
+ }
+
+
+
} // endfor
// die if we drop out with an error
@@ -295,8 +368,7 @@ void InitService::init( void *i_ptr )
EXIT_MRK "Initilization Service finished.");
// return to _start(), which may end the task or die.
- return;
}
-} // namespace INITSERVICE
+} // namespace
OpenPOWER on IntegriCloud