summaryrefslogtreecommitdiffstats
path: root/src/usr
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr')
-rw-r--r--src/usr/cxxtest/cxxtestexec.C29
-rwxr-xr-xsrc/usr/cxxtest/cxxtestgen.pl2
-rw-r--r--src/usr/hwas/hwas.C60
-rw-r--r--src/usr/hwas/testHWP.C10
-rw-r--r--src/usr/hwpf/hwp/dmi_training/dmi_training.C51
-rw-r--r--src/usr/hwpf/hwp/dram_training/dram_training.C84
-rw-r--r--src/usr/hwpf/hwp/mc_init/mc_init.C28
-rw-r--r--src/usr/hwpf/hwp/sbe_centaur_init/sbe_centaur_init.C84
-rw-r--r--src/usr/initservice/baseinitsvc/initservice.C495
-rw-r--r--src/usr/initservice/baseinitsvc/initservice.H53
-rw-r--r--src/usr/initservice/baseinitsvc/initservicetaskentry.C67
-rw-r--r--src/usr/initservice/baseinitsvc/initsvctasks.H17
-rw-r--r--src/usr/initservice/baseinitsvc/makefile3
-rw-r--r--src/usr/initservice/extinitsvc/extinitsvc.C312
-rw-r--r--src/usr/initservice/extinitsvc/extinitsvc.H7
-rw-r--r--src/usr/initservice/extinitsvc/extinitsvctasks.H3
-rw-r--r--src/usr/initservice/initsvctesttask/makefile (renamed from src/usr/initservice/initsvctasktest2/makefile)4
-rw-r--r--src/usr/initservice/initsvctesttask/tasktest2.C (renamed from src/usr/initservice/initsvctasktest2/tasktest2.C)29
-rw-r--r--src/usr/initservice/initsvctesttask/tasktest2.H (renamed from src/usr/initservice/initsvctasktest2/tasktest2.H)18
-rw-r--r--src/usr/initservice/initsvcunittesttask2/makefile28
-rw-r--r--src/usr/initservice/istepdispatcher/istepdispatcher.C351
-rw-r--r--src/usr/initservice/istepdispatcher/istepdispatcher.H43
-rw-r--r--src/usr/initservice/istepdispatcher/splesscommand.C113
-rw-r--r--src/usr/initservice/istepdispatcher/splesscommon.H9
-rw-r--r--src/usr/initservice/istepdispatcher/splessstatus.C93
-rw-r--r--src/usr/initservice/makefile6
-rw-r--r--src/usr/initservice/taskargs/makefile28
-rw-r--r--src/usr/initservice/taskargs/taskargs.C162
-rw-r--r--src/usr/initservice/test/initservicetest.H6
-rw-r--r--src/usr/intr/intrrp.C12
-rw-r--r--src/usr/intr/intrrp.H4
-rw-r--r--src/usr/pnor/pnorrp.C32
-rw-r--r--src/usr/pnor/pnorrp.H10
-rw-r--r--src/usr/targeting/attrrp.C20
-rw-r--r--src/usr/targeting/attrrp.H6
-rw-r--r--src/usr/targeting/targetservice.C17
-rw-r--r--src/usr/vfs/vfsrp.C15
-rw-r--r--src/usr/vfs/vfsrp.H4
38 files changed, 790 insertions, 1525 deletions
diff --git a/src/usr/cxxtest/cxxtestexec.C b/src/usr/cxxtest/cxxtestexec.C
index d78b99205..664d0ec0f 100644
--- a/src/usr/cxxtest/cxxtestexec.C
+++ b/src/usr/cxxtest/cxxtestexec.C
@@ -40,30 +40,35 @@ namespace CxxTest
} // namespace
-using namespace INITSERVICE;
+// prototype
+void cxxinit( errlHndl_t &io_taskRetErrl );
+
trace_desc_t *g_trac_cxxtest = NULL;
TRAC_INIT(&g_trac_cxxtest, CXXTEST_COMP_NAME, 1024 );
/**
- * @brief _start() for CxxTest
+ * _start entry point for this task.
+ */
+TASK_ENTRY_MACRO( cxxinit );
+
+
+/**
+ * @brief init() for CxxTest
* Iterate through all modules in the VFS named "libtest*" and create
* children tasks to execute them.
*
- * * @parms[in,out] - pointer to TaskArgs struct
+ * * @parms[in,out] - pointer to any args
*
*/
-extern "C"
-void _start(void *io_pArgs)
+
+void cxxinit( errlHndl_t &io_taskRetErrl )
{
errlHndl_t l_errl = NULL;
std::vector<const char *> module_list;
std::vector<tid_t> tasks;
tid_t tidrc = 0;
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
-
// output a blank line so that it's easier to find the beginning of
// CxxTest
@@ -142,10 +147,8 @@ void _start(void *io_pArgs)
TRACFCOMP( g_trac_cxxtest, " trace calls: %d",
CxxTest::g_TraceCalls );
- // dump out an informational errorlog
- assert(l_errl == NULL);
+ // @todo dump out an informational errorlog??
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ // should always return NULL
+ task_end2( l_errl );
}
diff --git a/src/usr/cxxtest/cxxtestgen.pl b/src/usr/cxxtest/cxxtestgen.pl
index 2ae66a7ba..48b89c0c6 100755
--- a/src/usr/cxxtest/cxxtestgen.pl
+++ b/src/usr/cxxtest/cxxtestgen.pl
@@ -744,7 +744,7 @@ sub write_start() {
print "\n";
print "\t__sync_add_and_fetch(&CxxTest::g_ModulesCompleted, 1);\n";
print "\n";
- print "\ttask_end();\n";
+ print "\ttask_end2( NULL );\n";
print "}\n";
}
diff --git a/src/usr/hwas/hwas.C b/src/usr/hwas/hwas.C
index 2c73b0c21..172ec6315 100644
--- a/src/usr/hwas/hwas.C
+++ b/src/usr/hwas/hwas.C
@@ -92,11 +92,9 @@ void enableHwasState( TARGETING::HwasState &i_rhwasState )
}
-
void init_target_states( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+ errlHndl_t l_errl = NULL;
TARGETING::HwasState l_hwasState;
TRACDCOMP( g_trac_hwas, "init_target_states entry: set default HWAS state:" );
@@ -113,8 +111,6 @@ void init_target_states( void *io_pArgs )
l_TargetItr->setAttr<ATTR_HWAS_STATE>( l_hwasState );
}
-
-
/**
* @todo Enable cpu 0 and centaur 0 for now.
*/
@@ -236,17 +232,14 @@ void init_target_states( void *io_pArgs )
} // end else
// $$$$$ TEMPORARY $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ TRACFCOMP( g_trac_hwas, "$$ init_target_states DEBUG: return %p", l_errl );
+ task_end2( l_errl );
}
void init_fsi( void *io_pArgs )
{
errlHndl_t l_errl = NULL;
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
TRACDCOMP( g_trac_hwas, "init_fsi entry" );
@@ -254,79 +247,63 @@ void init_fsi( void *io_pArgs )
if ( l_errl )
{
TRACFCOMP( g_trac_hwas, "ERROR: failed to init FSI hardware" );
- pTaskArgs->postErrorLog( l_errl );
- }
+ }
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( l_errl );
}
+
void apply_fsi_info( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+ errlHndl_t l_errl = NULL;
TRACDCOMP( g_trac_hwas, "apply_fsi_info entry" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( l_errl );
}
void apply_dd_presence( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+ errlHndl_t l_errl = NULL;
TRACDCOMP( g_trac_hwas, "apply_dd_presence entry" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( l_errl );
}
void apply_pr_keyword_data( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+ errlHndl_t l_errl = NULL;
TRACDCOMP( g_trac_hwas, "apply_pr_keyword_data" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( l_errl );
}
void apply_partial_bad( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+ errlHndl_t l_errl = NULL;
TRACDCOMP( g_trac_hwas, "apply_partial_bad entry" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( l_errl );
}
void apply_gard( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+ errlHndl_t l_errl = NULL;
TRACDCOMP( g_trac_hwas, "apply_gard entry" );
- errlHndl_t l_errl = theDeconfigGard().clearGardRecordsForReplacedTargets();
+ l_errl = theDeconfigGard().clearGardRecordsForReplacedTargets();
if (l_errl)
{
TRACFCOMP(g_trac_hwas, "ERROR: apply_gard failed to clear GARD Records for replaced Targets");
- pTaskArgs->postErrorLog(l_errl);
}
else
{
@@ -335,7 +312,6 @@ void apply_gard( void *io_pArgs )
if (l_errl)
{
TRACFCOMP(g_trac_hwas, "ERROR: apply_gard failed to deconfigure Targets from GARD Records for IPL");
- pTaskArgs->postErrorLog(l_errl);
}
else
{
@@ -343,9 +319,7 @@ void apply_gard( void *io_pArgs )
}
}
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( l_errl );
}
diff --git a/src/usr/hwas/testHWP.C b/src/usr/hwas/testHWP.C
index febd985a4..9de820c13 100644
--- a/src/usr/hwas/testHWP.C
+++ b/src/usr/hwas/testHWP.C
@@ -69,8 +69,6 @@ extern trace_desc_t *g_trac_hwas;
void testHWP( void * io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
errlHndl_t l_err = NULL;
// Get the master processor chip
@@ -85,14 +83,10 @@ void testHWP( void * io_pArgs )
if (l_err)
{
- TRACFCOMP( g_trac_hwas, "testHWP failed, committing errorlog");
- errlCommit(l_err,HWAS_COMP_ID);
- pTaskArgs->postReturnCode( 0x1234 );
+ TRACFCOMP( g_trac_hwas, "testHWP failed. ");
}
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( l_err );
}
diff --git a/src/usr/hwpf/hwp/dmi_training/dmi_training.C b/src/usr/hwpf/hwp/dmi_training/dmi_training.C
index 3123abe7d..766232947 100644
--- a/src/usr/hwpf/hwp/dmi_training/dmi_training.C
+++ b/src/usr/hwpf/hwp/dmi_training/dmi_training.C
@@ -79,17 +79,13 @@ using namespace fapi;
//
void call_dmi_scominit( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_dmi_scominit entry" );
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "dmi_scominit exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
@@ -98,17 +94,13 @@ void call_dmi_scominit( void *io_pArgs )
//
void call_dmi_erepair( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_dmi_erepair entry" );
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "dmi_erepair exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
//
@@ -116,17 +108,13 @@ void call_dmi_erepair( void *io_pArgs )
//
void call_dmi_io_dccal( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_dmi_io_dccal entry" );
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "dmi_io_dccal exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
@@ -135,8 +123,6 @@ void call_dmi_io_dccal( void *io_pArgs )
//
void call_dmi_io_run_training( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
fapi::ReturnCode l_fapirc;
TARGETING::TargetService& l_targetService = targetService();
uint8_t l_cpuNum = 0;
@@ -276,9 +262,7 @@ void call_dmi_io_run_training( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_io_run_training exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
@@ -287,17 +271,13 @@ void call_dmi_io_run_training( void *io_pArgs )
//
void call_host_startPRD_dmi( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_startPRD_dmi entry" );
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "host_startPRD_dmi exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
@@ -306,17 +286,14 @@ void call_host_startPRD_dmi( void *io_pArgs )
//
void call_host_attnlisten_cen( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_attnlisten_cen entry" );
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "<host_attnlisten_cen exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
//
@@ -324,8 +301,7 @@ void call_host_attnlisten_cen( void *io_pArgs )
//
void call_proc_cen_framelock( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
proc_cen_framelock_args l_args;
TARGETING::TargetService& l_targetService = targetService();
@@ -453,9 +429,7 @@ void call_proc_cen_framelock( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_cen_framework exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
@@ -464,17 +438,14 @@ void call_proc_cen_framelock( void *io_pArgs )
//
void call_cen_set_inband_addr( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_set_inband_addr entry" );
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "cen_set_inband_addr exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
diff --git a/src/usr/hwpf/hwp/dram_training/dram_training.C b/src/usr/hwpf/hwp/dram_training/dram_training.C
index 046a0de54..d49d10ada 100644
--- a/src/usr/hwpf/hwp/dram_training/dram_training.C
+++ b/src/usr/hwpf/hwp/dram_training/dram_training.C
@@ -95,8 +95,7 @@ using namespace fapi;
void call_host_disable_vddr( void *io_pArgs )
{
// @todo remove when join() merged
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_disable_vddr entry" );
@@ -148,9 +147,7 @@ void call_host_disable_vddr( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_disable_vddr exit" );
- // end the task.
- pTaskArgs->waitChildSync(); // @todo remove when join() merged
- task_end();
+ task_end2( NULL );
}
@@ -161,8 +158,7 @@ void call_host_disable_vddr( void *io_pArgs )
void call_mc_pll_setup( void *io_pArgs )
{
// @todo remove when join() merged
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mc_pll_setup entry" );
@@ -214,9 +210,7 @@ void call_mc_pll_setup( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mc_pll_setup exit" );
- // end the task.
- pTaskArgs->waitChildSync(); // @todo remove when join() merged
- task_end();
+ task_end2( NULL );
}
@@ -227,8 +221,7 @@ void call_mc_pll_setup( void *io_pArgs )
void call_mba_startclocks( void *io_pArgs )
{
// @todo remove when join() merged
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mba_startclocks entry" );
@@ -280,9 +273,7 @@ void call_mba_startclocks( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mba_startclocks exit" );
- // end the task.
- pTaskArgs->waitChildSync(); // @todo remove when join() merged
- task_end();
+ task_end2( NULL );
}
@@ -293,8 +284,7 @@ void call_mba_startclocks( void *io_pArgs )
void call_host_enable_vddr( void *io_pArgs )
{
// @todo remove when join() merged
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_enable_vddr entry" );
@@ -346,9 +336,7 @@ void call_host_enable_vddr( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_enable_vddr exit" );
- // end the task.
- pTaskArgs->waitChildSync(); // @todo remove when join() merged
- task_end();
+ task_end2( NULL );
}
@@ -359,8 +347,7 @@ void call_host_enable_vddr( void *io_pArgs )
void call_mss_initf( void *io_pArgs )
{
// @todo remove when join() merged
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_initf entry" );
@@ -412,9 +399,7 @@ void call_mss_initf( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_initf exit" );
- // end the task.
- pTaskArgs->waitChildSync(); // @todo remove when join() merged
- task_end();
+ task_end2( NULL );
}
//
@@ -422,10 +407,9 @@ void call_mss_initf( void *io_pArgs )
//
void call_mss_ddr_phy_reset( void *io_pArgs )
{
- // @todo remove when join() merged
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
errlHndl_t l_err = NULL;
+ fapi::ReturnCode l_fapirc;
+
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_ddr_phy_reset entry" );
@@ -486,9 +470,7 @@ void call_mss_ddr_phy_reset( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_ddr_phy_reset exit" );
- // end the task.
- pTaskArgs->waitChildSync(); // @todo remove when join() merged
- task_end();
+ task_end2( NULL );
}
@@ -498,10 +480,8 @@ void call_mss_ddr_phy_reset( void *io_pArgs )
//
void call_mss_draminit( void *io_pArgs )
{
-
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
errlHndl_t l_err = NULL;
+ fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_draminit entry" );
@@ -563,9 +543,7 @@ void call_mss_draminit( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_draminit exit" );
- // end the task.
- pTaskArgs->waitChildSync(); // @todo remove when join() merged
- task_end();
+ task_end2( NULL );
}
//
@@ -574,8 +552,7 @@ void call_mss_draminit( void *io_pArgs )
void call_mss_restore_dram_repair( void *io_pArgs )
{
// @todo remove when join() merged
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_restore_dram_repair entry" );
@@ -627,9 +604,7 @@ void call_mss_restore_dram_repair( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_restore_dram_repair exit" );
- // end the task.
- pTaskArgs->waitChildSync(); // @todo remove when join() merged
- task_end();
+ task_end2( NULL );
}
@@ -639,11 +614,8 @@ void call_mss_restore_dram_repair( void *io_pArgs )
//
void call_mss_draminit_training( void *io_pArgs )
{
-
- // @todo remove when join() merged
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
errlHndl_t l_err = NULL;
+ fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_draminit_training entry" );
@@ -706,9 +678,7 @@ void call_mss_draminit_training( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_draminit_training exit" );
- // end the task.
- pTaskArgs->waitChildSync(); // @todo remove when join() merged
- task_end();
+ task_end2( NULL );
}
//
@@ -717,8 +687,7 @@ void call_mss_draminit_training( void *io_pArgs )
void call_mss_draminit_trainadv( void *io_pArgs )
{
// @todo remove when join() merged
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_draminit_trainadv entry" );
@@ -770,9 +739,7 @@ void call_mss_draminit_trainadv( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_draminit_trainadv exit" );
- // end the task.
- pTaskArgs->waitChildSync(); // @todo remove when join() merged
- task_end();
+ task_end2( NULL );
}
//
@@ -780,11 +747,8 @@ void call_mss_draminit_trainadv( void *io_pArgs )
//
void call_mss_draminit_mc( void *io_pArgs )
{
-
- // @todo remove when join() merged
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
errlHndl_t l_err = NULL;
+ fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_draminit_mc entry" );
@@ -846,9 +810,7 @@ void call_mss_draminit_mc( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_draminit_mc exit" );
- // end the task.
- pTaskArgs->waitChildSync(); // @todo remove when join() merged
- task_end();
+ task_end2( NULL );
}
diff --git a/src/usr/hwpf/hwp/mc_init/mc_init.C b/src/usr/hwpf/hwp/mc_init/mc_init.C
index d7f7dbd85..abfcf6200 100644
--- a/src/usr/hwpf/hwp/mc_init/mc_init.C
+++ b/src/usr/hwpf/hwp/mc_init/mc_init.C
@@ -84,8 +84,7 @@ using namespace fapi;
void call_host_collect_dimm_spd( void *io_pArgs )
{
// @todo remove when join() merged
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_collect_dimm_spd entry" );
@@ -136,9 +135,7 @@ void call_host_collect_dimm_spd( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_collect_dimm_spd exit" );
- // end the task.
- pTaskArgs->waitChildSync(); // @todo remove when join() merged
- task_end();
+ task_end2( NULL );
}
@@ -149,8 +146,7 @@ void call_host_collect_dimm_spd( void *io_pArgs )
void call_mss_volt( void *io_pArgs )
{
// @todo remove when join() merged
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_volt entry" );
@@ -218,9 +214,7 @@ void call_mss_volt( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_volt exit" );
- // end the task.
- pTaskArgs->waitChildSync(); // @todo remove when join() merged
- task_end();
+ task_end2( NULL );
}
//
@@ -229,8 +223,7 @@ void call_mss_volt( void *io_pArgs )
void call_mss_freq( void *io_pArgs )
{
// @todo remove when join() merged
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_freq entry" );
@@ -295,9 +288,7 @@ void call_mss_freq( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_freq exit" );
- // end the task.
- pTaskArgs->waitChildSync(); // @todo remove when join() merged
- task_end();
+ task_end2( NULL );
}
@@ -308,8 +299,7 @@ void call_mss_freq( void *io_pArgs )
void call_mss_eff_config( void *io_pArgs )
{
// @todo remove when join() merged
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_eff_config entry" );
@@ -378,9 +368,7 @@ void call_mss_eff_config( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_eff_config exit" );
- // end the task.
- pTaskArgs->waitChildSync(); // @todo remove when join() merged
- task_end();
+ task_end2( NULL );
}
diff --git a/src/usr/hwpf/hwp/sbe_centaur_init/sbe_centaur_init.C b/src/usr/hwpf/hwp/sbe_centaur_init/sbe_centaur_init.C
index 10e6dbdbe..5ac08041c 100644
--- a/src/usr/hwpf/hwp/sbe_centaur_init/sbe_centaur_init.C
+++ b/src/usr/hwpf/hwp/sbe_centaur_init/sbe_centaur_init.C
@@ -82,8 +82,7 @@ using namespace fapi;
//
void call_cen_sbe_tp_chiplet_init1( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
fapi::ReturnCode l_fapirc2;
@@ -285,9 +284,7 @@ void call_cen_sbe_tp_chiplet_init1( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "cen_sbe_tp_chiplet_init1 exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
@@ -296,8 +293,7 @@ void call_cen_sbe_tp_chiplet_init1( void *io_pArgs )
//
void call_cen_sbe_tp_arrayinit( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_tp_arrayinit entry" );
@@ -330,9 +326,7 @@ void call_cen_sbe_tp_arrayinit( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_tp_arrayinit exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
//
@@ -340,8 +334,7 @@ void call_cen_sbe_tp_arrayinit( void *io_pArgs )
//
void call_cen_sbe_tp_chiplet_init2( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_tp_chiplet_init2 entry" );
@@ -374,9 +367,7 @@ void call_cen_sbe_tp_chiplet_init2( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_tp_chiplet_init2 exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
@@ -385,8 +376,7 @@ void call_cen_sbe_tp_chiplet_init2( void *io_pArgs )
//
void call_cen_sbe_tp_chiplet_init3( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_tp_chiplet_init3 entry" );
@@ -419,9 +409,7 @@ void call_cen_sbe_tp_chiplet_init3( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_tp_chiplet_init3 exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
@@ -430,8 +418,7 @@ void call_cen_sbe_tp_chiplet_init3( void *io_pArgs )
//
void call_cen_sbe_chiplet_init( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_chiplet_init entry" );
@@ -464,9 +451,7 @@ void call_cen_sbe_chiplet_init( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_chiplet_init exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
@@ -475,8 +460,7 @@ void call_cen_sbe_chiplet_init( void *io_pArgs )
//
void call_cen_sbe_arrayinit( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_arrayinit entry" );
@@ -509,9 +493,7 @@ void call_cen_sbe_arrayinit( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_arrayinit exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
@@ -520,8 +502,7 @@ void call_cen_sbe_arrayinit( void *io_pArgs )
//
void call_cen_sbe_pll_initf( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_pll_initf entry" );
@@ -555,9 +536,7 @@ void call_cen_sbe_pll_initf( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_pll_initf exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
@@ -566,8 +545,7 @@ void call_cen_sbe_pll_initf( void *io_pArgs )
//
void call_cen_sbe_dts_init( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_dts_init entry" );
@@ -600,9 +578,7 @@ void call_cen_sbe_dts_init( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_dts_init exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
@@ -611,8 +587,7 @@ void call_cen_sbe_dts_init( void *io_pArgs )
//
void call_cen_sbe_initf( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_initf entry" );
@@ -645,9 +620,7 @@ void call_cen_sbe_initf( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_initf exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
@@ -656,8 +629,7 @@ void call_cen_sbe_initf( void *io_pArgs )
//
void call_cen_sbe_do_manual_inits( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_do_manual_inits entry" );
@@ -690,9 +662,7 @@ void call_cen_sbe_do_manual_inits( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_do_manual_inits exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
@@ -701,8 +671,7 @@ void call_cen_sbe_do_manual_inits( void *io_pArgs )
//
void call_cen_sbe_startclocks( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_startclocks entry" );
@@ -735,9 +704,7 @@ void call_cen_sbe_startclocks( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_startclocks exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
@@ -746,8 +713,7 @@ void call_cen_sbe_startclocks( void *io_pArgs )
//
void call_cen_sbe_scominits( void *io_pArgs )
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_pArgs );
+
fapi::ReturnCode l_fapirc;
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_scominits entry" );
@@ -780,9 +746,7 @@ void call_cen_sbe_scominits( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_cen_sbe_scominits exit" );
- // wait here on the barrier, then end the task.
- pTaskArgs->waitChildSync();
- task_end();
+ task_end2( NULL );
}
}; // end namespace
diff --git a/src/usr/initservice/baseinitsvc/initservice.C b/src/usr/initservice/baseinitsvc/initservice.C
index 532d899d6..2187b8cb0 100644
--- a/src/usr/initservice/baseinitsvc/initservice.C
+++ b/src/usr/initservice/baseinitsvc/initservice.C
@@ -45,6 +45,8 @@
#include <errl/errludstring.H>
+#include <initservice/taskargs.H> // TASK_ENTRY_MACRO
+
#include "initservice.H"
#include "initsvctasks.H"
@@ -52,131 +54,369 @@
// ----- namespace SPLESS -----------------------------------------------
namespace SPLESS
{
- // allocate space for SPLess Command regs
+ // allocate space for SPLess Command regs in the base image.
uint64_t g_SPLess_Command_Reg = 0;
uint64_t g_SPLess_Status_Reg = 0;
uint64_t g_SPLess_IStepMode_Reg = 0x123456789abcdef0;
-} // ----- end namespace SPLESS ---------------------------------------
+}
+// ----- end namespace SPLESS ---------------------------------------
+
namespace INITSERVICE
{
trace_desc_t *g_trac_initsvc = NULL;
-TRAC_INIT(&g_trac_initsvc, "INITSVC", 4096 );
+TRAC_INIT(&g_trac_initsvc, "INITSVC", 2048 );
+
+/**
+ * @brief start() task entry procedure
+ * This one is "special" since we do not return anything to the kernel/vfs
+ */
+extern "C"
+void _start(void *ptr)
+{
+ TRACFCOMP( g_trac_initsvc,
+ "Executing Initialization Service module." );
+
+ // initialize the base modules in Hostboot.
+ InitService::getTheInstance().init( ptr );
+
+ TRACFCOMP( g_trac_initsvc,
+ "return from Initialization Service module." );
+
+ task_end();
+}
+
-errlHndl_t InitService::startTask( const TaskInfo *i_ptask,
- TaskArgs::TaskArgs *io_pargs ) const
+errlHndl_t InitService::checkNLoadModule( const TaskInfo *i_ptask ) const
{
- tid_t l_tidrc = 0;
- errlHndl_t l_errl = NULL;
+ errlHndl_t l_errl = NULL;
+ const char *l_modulename = NULL;
+
+ assert(i_ptask->taskflags.task_type == START_FN );
+
+ do {
+
+ // i_ptask->taskflags.task_type == STARTFN
+ l_modulename = VFS::module_find_name(
+ reinterpret_cast<void*>(i_ptask->taskfn) );
+ if ( l_modulename == NULL )
+ {
+ /*@ errorlog tag
+ * @errortype ERRL_SEV_CRITICAL_SYS_TERM
+ * @moduleid BASE_INITSVC_MOD_ID
+ * @reasoncode INITSVC_LOAD_MODULE_FAILED
+ * @userdata1 0
+ * @userdata2 0
+ *
+ * @devdesc Initialization Service failed to load a
+ * module needed to load a function or task.
+ * UserDetails will contain the name of the
+ * function or task.
+ */
+ l_errl = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM,
+ INITSERVICE::BASE_INITSVC_MOD_ID,
+ INITSERVICE::INITSVC_LOAD_MODULE_FAILED,
+ 0,
+ 0 );
+
+ // error, break out of do block
+ break;
+ }
+
+ TRACDCOMP( g_trac_initsvc,
+ "checkNLoadModule: found %s in module %s",
+ i_ptask->taskname,
+ ((l_modulename!=NULL)?l_modulename:"NULL???") );
+
+ if ( !VFS::module_is_loaded( l_modulename )
+ )
+ {
+ TRACDCOMP( g_trac_initsvc,
+ "loading module %s",
+ l_modulename );
+ l_errl = VFS::module_load( l_modulename );
+ if ( l_errl )
+ {
+ // load module returned with errl set
+ TRACFCOMP( g_trac_initsvc,
+ "module_load( %s ) returned with an error.",
+ l_modulename );
+
+ // break out of do block
+ break;
+ }
+ }
+
+ } while( 0 ); // end do() block
+
+
+ return l_errl;
+}
+
+
+errlHndl_t InitService::startTask(
+ const TaskInfo *i_ptask,
+ void *io_pargs ) const
+{
+ tid_t l_tidlnchrc = 0;
+ tid_t l_tidretrc = 0;
+ errlHndl_t l_errl = NULL;
+ int l_childsts = 0;
+ void *l_childerrl = NULL;
+
assert( i_ptask != NULL );
- assert( i_ptask->taskflags.task_type == START_TASK );
+ // assert( i_ptask->taskflags.task_type == START_TASK );
- // Base modules have already been loaded and initialized,
- // extended modules have not.
- if ( i_ptask->taskflags.module_type == EXT_IMAGE )
- {
- // load module and call _init()
- l_errl = VFS::module_load( i_ptask->taskname );
- }
+ do {
+ // Base modules have already been loaded and initialized,
+ // extended modules have not.
+ if ( i_ptask->taskflags.module_type == EXT_IMAGE )
+ {
+ // load module if necessary
+ l_errl = VFS::module_load( i_ptask->taskname );
+ }
+ if ( l_errl )
+ {
+ TRACFCOMP(g_trac_initsvc,
+ "ERROR: failed to load module for task '%s'",
+ i_ptask->taskname);
+
+ // drop out of do block with errl set
+ break;
+ }
- if ( ! l_errl )
- {
// launch a task and wait for it.
- l_tidrc = task_exec( i_ptask->taskname, io_pargs );
+ l_tidlnchrc = task_exec( i_ptask->taskname, io_pargs );
+ TRACDCOMP( g_trac_initsvc,
+ "launch task %s returned %d",
+ i_ptask->taskname,
+ l_tidlnchrc );
// process the return - kernel returns a 16-bit signed # as a
// threadid/error
- if ( static_cast<int16_t> (l_tidrc) < 0 )
+ if ( static_cast<int16_t> (l_tidlnchrc) < 0 )
{
// task failed to launch, post an errorlog and dump some trace
- TRACFCOMP(g_trac_initsvc, "ERROR: starting task '%s'",
- i_ptask->taskname);
+ TRACFCOMP(g_trac_initsvc,
+ "ERROR 0x%x: starting task '%s'",
+ l_tidlnchrc,
+ i_ptask->taskname);
/*@ errorlog tag
* @errortype ERRL_SEV_CRITICAL_SYS_TERM
- * @moduleid INITSVC_START_TASK_MOD_ID
+ * @moduleid BASE_INITSVC_MOD_ID
* @reasoncode START_TASK_FAILED
- * @userdata1 task return code
+ * @userdata1 0
+ * @userdata2 task id or task return code
*
* @devdesc Initialization Service failed to start a task.
*
*/
l_errl = new ERRORLOG::ErrlEntry(
ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM,
- INITSERVICE::INITSVC_START_TASK_MOD_ID,
+ INITSERVICE::BASE_INITSVC_MOD_ID,
INITSERVICE::START_TASK_FAILED,
- l_tidrc );
+ 0,
+ l_tidlnchrc );
- // Add the task name as user detail data
- ERRORLOG::ErrlUserDetailsString(i_ptask->taskname).addToLog(l_errl);
- } // endif tidrc
- else
+ // break out of do block
+ break;
+ } // endif tidlnchrc
+
+ TRACDCOMP(g_trac_initsvc,
+ "Wait for tid %d '%s'",
+ l_tidlnchrc,
+ i_ptask->taskname);
+
+ // wait here for the task to end.
+ // status of the task ( OK or Crashed ) is returned in l_childsts
+ // if the task returns an errorlog, it will be returned
+ // (via task_end2) in l_childerrl
+ l_tidretrc = task_wait_tid(
+ l_tidlnchrc,
+ &l_childsts,
+ &l_childerrl );
+ if ( ( static_cast<int16_t>(l_tidretrc) < 0 )
+ || ( l_childsts != TASK_STATUS_EXITED_CLEAN )
+ )
{
- // if InitService passed in a taskargs, wait for barrier.
- if ( io_pargs )
- {
- io_pargs->waitParentSync();
- }
- } // endelse
- } // endif ! l_errl
+ // the launched task failed or crashed,
+ // post an errorlog and dump some trace
+ /*@ errorlog tag
+ * @errortype ERRL_SEV_CRITICAL_SYS_TERM
+ * @moduleid BASE_INITSVC_MOD_ID
+ * @reasoncode WAIT_TASK_FAILED
+ * @userdata1 task id or task return code
+ * @userdata2 returned status from task
+ *
+ * @devdesc Initialization Service launched a task and
+ * the task returned an error.
+ *
+ */
+ l_errl = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM,
+ INITSERVICE::BASE_INITSVC_MOD_ID,
+ INITSERVICE::WAIT_TASK_FAILED,
+ l_tidretrc,
+ l_childsts );
+
+ // break out of do block
+ break;
+ } // endif tidretrc
+ // check for returned errorlog
+ if ( l_childerrl != NULL )
+ {
+ // cast to the correct type and return
+ l_errl = reinterpret_cast<errlHndl_t>(l_childerrl);
+
+ // break out of do block
+ break;
+ }
+
+ } while(0); // end do block
+
+ if ( l_errl )
+ {
+ // Add the task name as user detail data to any errorlog
+ ERRORLOG::ErrlUserDetailsString(i_ptask->taskname).addToLog(l_errl);
+ }
// return any errorlog to the caller
return l_errl;
-}
+} // startTask()
+
-errlHndl_t InitService::executeFn( const TaskInfo *i_ptask,
- TaskArgs *io_pargs ) const
+errlHndl_t InitService::executeFn(
+ const TaskInfo *i_ptask,
+ void *io_pargs ) const
{
- tid_t l_tidrc = 0;
- errlHndl_t l_errl = NULL;
+ tid_t l_tidlnchrc = 0;
+ tid_t l_tidretrc = 0;
+ errlHndl_t l_errl = NULL;
+ int l_childsts = 0;
+ void *l_childerrl = NULL;
assert( i_ptask != NULL );
assert( i_ptask->taskfn != NULL ) ;
- /**
- * @todo: add Doug Gilbert's code here to look up the module based on
- * the function pointer and then load the module.
- * For now we just blindly load the module in istepdispatcher
- */
- // valid function, launch it
- l_tidrc = task_create( i_ptask->taskfn, io_pargs);
- if (static_cast<int16_t> (l_tidrc) < 0)
- {
- TRACFCOMP(g_trac_initsvc, "ERROR: starting function in task'%s'",
- i_ptask->taskname);
-
- /*@ errorlog tag
- * @errortype ERRL_SEV_CRITICAL_SYS_TERM
- * @moduleid INITSVC_START_FN_MOD_ID
- * @reasoncode START_FN_FAILED
- * @userdata1 task return code
- *
- * @devdesc Initialization Service attempted to start a
- * function within a module but the function
- * failed to launch
- */
- l_errl = new ERRORLOG::ErrlEntry(
- ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM,
- INITSERVICE::INITSVC_START_FN_MOD_ID,
- INITSERVICE::START_FN_FAILED,
- l_tidrc );
+ do {
- // Add the task name as user detail data
- ERRORLOG::ErrlUserDetailsString(i_ptask->taskname).addToLog(l_errl);
- } // endif tidrc
- else
- {
- // task launched OK.
- if ( io_pargs )
+ //
+ l_errl = checkNLoadModule( i_ptask );
+ if ( l_errl )
{
- io_pargs->waitParentSync(); // sync up parent task
+ TRACFCOMP(g_trac_initsvc,
+ "ERROR: failed to load module for task '%s'",
+ i_ptask->taskname);
+
+ // break out with errorlog set
+ break;
}
+
+ // valid function, launch it
+ l_tidlnchrc = task_create( i_ptask->taskfn, io_pargs);
+ if (static_cast<int16_t> (l_tidlnchrc) < 0)
+ {
+ TRACFCOMP(g_trac_initsvc,
+ "ERROR %d: starting function in task'%s'",
+ l_tidlnchrc,
+ i_ptask->taskname);
+
+ /*@ errorlog tag
+ * @errortype ERRL_SEV_CRITICAL_SYS_TERM
+ * @moduleid BASE_INITSVC_MOD_ID
+ * @reasoncode START_FN_FAILED
+ * @userdata1 task return code
+ * @userdata2 0
+ *
+ * @devdesc Initialization Service attempted to start a
+ * function within a module but the function
+ * failed to launch
+ */
+ l_errl = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM,
+ INITSERVICE::BASE_INITSVC_MOD_ID,
+ INITSERVICE::START_FN_FAILED,
+ l_tidlnchrc,
+ 0 );
+
+ // break out with errorlog set
+ break;
+ } // endif tidlnchrc
+
+ // wait here for the task to end.
+ // status of the task ( OK or Crashed ) is returned in l_childsts
+ // if the task returns an errorlog, it will be returned
+ // (via task_end2) in l_childerrl
+ l_tidretrc = task_wait_tid(
+ l_tidlnchrc,
+ &l_childsts,
+ &l_childerrl );
+ if ( ( static_cast<int16_t>(l_tidretrc) < 0 )
+ || ( l_childsts != TASK_STATUS_EXITED_CLEAN )
+ )
+ {
+ // the launched task failed or crashed
+ // post an errorlog and dump some trace
+ /*@ errorlog tag
+ * @errortype ERRL_SEV_CRITICAL_SYS_TERM
+ * @moduleid BASE_INITSVC_MOD_ID
+ * @reasoncode WAIT_TASK_FAILED
+ * @userdata1 task id or task return code
+ * @userdata2 returned status from task
+ *
+ * @devdesc Initialization Service launched a task and the task returned an error.
+ *
+ *
+ */
+ l_errl = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM,
+ INITSERVICE::BASE_INITSVC_MOD_ID,
+ INITSERVICE::WAIT_TASK_FAILED,
+ l_tidretrc,
+ l_childsts );
+
+ TRACFCOMP(g_trac_initsvc,
+ "ERROR : task_wait_tid(0x%x). '%s', l_tidretrc=0x%x, l_childsts=0x%x",
+ l_tidlnchrc,
+ i_ptask->taskname,
+ l_tidretrc,
+ l_childsts );
+
+ // break out of do block
+ break;
+ } // endif tidretrc
+
+ // check for returned errorlog
+ if ( l_childerrl != NULL )
+ {
+ TRACFCOMP(g_trac_initsvc,
+ "ERROR : task_wait_tid(0x%x). '%s', l_childerrl=%p",
+ l_tidlnchrc,
+ i_ptask->taskname,
+ l_childerrl );
+
+ // cast to the correct type and return
+ l_errl = reinterpret_cast<errlHndl_t>(l_childerrl);
+
+ // break out of do block
+ break;
+ }
+
+ } while( 0 ); // end do block
+
+ if ( l_errl )
+ {
+ // Add the task name as user detail data to any errorlog that was
+ // posted.
+ ERRORLOG::ErrlUserDetailsString(i_ptask->taskname).addToLog(l_errl);
}
return l_errl;
@@ -195,7 +435,7 @@ void InitService::setProgressCode( uint64_t i_progresscode ) const
errlHndl_t InitService::dispatchTask( const TaskInfo *i_ptask,
- TaskArgs *io_pargs ) const
+ void *io_pargs ) const
{
errlHndl_t l_errl = NULL;
@@ -255,20 +495,23 @@ errlHndl_t InitService::dispatchTask( const TaskInfo *i_ptask,
void InitService::init( void *io_ptr )
{
- errlHndl_t l_errl = NULL;
- uint64_t l_task = 0;
- const TaskInfo *l_ptask = NULL;
- TaskArgs::TaskArgs l_args;
- uint64_t l_childrc = 0;
+ errlHndl_t l_errl = NULL;
+ uint64_t l_task = 0;
+ const TaskInfo *l_ptask = NULL;
+ // init shutdown status to good.
+ uint64_t l_shutdownStatus = SHUTDOWN_STATUS_GOOD;
+
+ // @todo detach from parent.
+ // $$ task_detach();
printk( "InitService entry.\n" );
TRACFCOMP( g_trac_initsvc,
- ENTER_MRK "Initialization Service is starting %p.", io_ptr );
+ "Initialization Service is starting, io_ptr=%p.", io_ptr );
// loop through the task list and start up any tasks necessary
for ( l_task=0;
- l_task < INITSERVICE::MAX_TASKS;
+ l_task < ( sizeof(g_taskinfolist)/sizeof(TaskInfo) ) ;
l_task++ )
{
// make a local copy of the base image task
@@ -280,11 +523,9 @@ void InitService::init( void *io_ptr )
break;
}
- l_args.clear(); // clear args struct for next task
-
// dispatch the task and return good or errorlog
- l_errl = dispatchTask( l_ptask,
- &l_args );
+ l_errl = dispatchTask( l_ptask ,
+ NULL );
// process errorlogs returned from the task that was launched
if ( l_errl )
@@ -296,77 +537,35 @@ void InitService::init( void *io_ptr )
break;
}
-
- // make local copies of the values in TaskArgs that are returned from
- // the child.
- // this also clears the errorlog from the TaskArgs struct, so
- // use it or lose it ( see taskargs.H for details ).
- l_childrc = l_args.getReturnCode();
- l_errl = l_args.getErrorLog();
-
- if ( l_errl )
- {
- TRACFCOMP( g_trac_initsvc,
- " ERROR: Child task returned 0x%llx, errlog=0x%p",
- l_childrc,
- l_errl );
- // drop out with the error
- break;
- }
- else
- {
- // Check child results for a valid nonzero return code.
- // If we have one, and no errorlog, then we create and
- // post our own errorlog here.
- if ( l_childrc != 0 )
- {
- TRACFCOMP( g_trac_initsvc,
- "ERROR: Child task '%s' returned 0x%llx, no errlog",
- l_ptask->taskname,
- l_childrc );
-
- /*@ errorlog tag
- * @errortype ERRL_SEV_CRITICAL_SYS_TERM
- * @moduleid INITSVC_TASK_RETURNED_ERROR_ID
- * @reasoncode INITSVC_FAILED_NO_ERRLOG
- * @userdata1 returncode from task
- * @userdata2 0
- *
- * @devdesc The task returned with an error,
- * but there was no errorlog returned.
- * See userdata1 for the return code.
- *
- */
- l_errl = new ERRORLOG::ErrlEntry(
- ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM,
- INITSVC_TASK_RETURNED_ERROR_ID,
- INITSERVICE::INITSVC_FAILED_NO_ERRLOG,
- l_childrc,
- 0 );
- // drop out with the error
- break;
- } // end if
- } // end else
} // endfor
// die if we drop out with an error
if ( l_errl )
{
+
// commit the log first, then shutdown.
- TRACFCOMP( g_trac_initsvc, "InitService: Committing errorlog." );
+ TRACFCOMP( g_trac_initsvc,
+ "InitService: Committing errorlog %p",
+ l_errl );
errlCommit( l_errl, INITSVC_COMP_ID );
- //Tell initservice to perform shutdown sequence
- doShutdown( SHUTDOWN_STATUS_INITSVC_FAILED );
-
+ // post bad shutdown status
+ l_shutdownStatus = SHUTDOWN_STATUS_INITSVC_FAILED;
}
+ // =====================================================================
+ // ----- Shutdown all CPUs -----------------------------------------
+ // =====================================================================
+
TRACFCOMP( g_trac_initsvc,
- EXIT_MRK "Initilization Service finished.");
+ "InitService finished, shutdown = 0x%x.",
+ l_shutdownStatus );
- printk( "InitService exit.\n" );
+ // Tell kernel to perform shutdown sequence
+ InitService::getTheInstance().doShutdown( l_shutdownStatus );
- // return to _start()
+ printk( "InitService exit.\n" );
+ // return to _start() to exit the task.
}
@@ -426,7 +625,7 @@ void InitService::doShutdown(uint64_t i_status)
/*
* @errorlog tag
* @errortype ERRL_SEV_CRITICAL_SYS_TERM
- * @moduleid INITSVC_DO_SHUTDOWN_MOD_ID
+ * @moduleid BASE_INITSVC_MOD_ID
* @reasoncode SHUTDOWN_FLUSH_FAILED
* @userdata1 returncode from mm_remove_pages()
* @userdata2 0
@@ -436,7 +635,7 @@ void InitService::doShutdown(uint64_t i_status)
*/
l_err = new ERRORLOG::ErrlEntry(
ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM,
- INITSERVICE::INITSVC_DO_SHUTDOWN_MOD_ID,
+ INITSERVICE::BASE_INITSVC_MOD_ID,
INITSERVICE::SHUTDOWN_FLUSH_FAILED,l_rc,0);
//Commit and attempt flushing other registered blocks
errlCommit( l_err, INITSVC_COMP_ID );
diff --git a/src/usr/initservice/baseinitsvc/initservice.H b/src/usr/initservice/baseinitsvc/initservice.H
index 4d15ffeec..d80c5d2ef 100644
--- a/src/usr/initservice/baseinitsvc/initservice.H
+++ b/src/usr/initservice/baseinitsvc/initservice.H
@@ -42,9 +42,9 @@
#include <sys/vfs.h> // VFS_MODULE_NAME_MAX
#include <trace/interface.H>
-#include <errl/errlentry.H>
+#include <errl/errlentry.H> // errlHndl_t
+#include <errl/errlmanager.H> // errlCommit()
#include <initservice/initsvcreasoncodes.H>
-#include <initservice/taskargs.H>
#include <initservice/initsvcstructs.H>
#include <vmmconst.h>
@@ -108,47 +108,28 @@ public:
* is the name of the compiled and linked targetting module.
* The module is expected to have implemented a extern "C"
* function called "void _start(void *args)" which is considered
- * to be the "task entry point". When _start is called, its
- * parameter will be set to point to a TaskArgs struct which
- * can be used to pass information back and forth. See the
- * comments in TaskArgs.H for more info.
- * See initsvctasks.H and the unit tests for some examples of
- * how this is used.
- *
+ * to be the "task entry point". *
*
* @param[in] i_ptask pointer to a TaskInfo struct
- * @param[in,out] io_pargs pointer to a TaskArgs struct, or NULL
- * On input, TaskArgs struct will have
- * command, returncode, and errlog fields
- * cleared. task can fill in these values
- * on return.
+ * @param[in,out] io_pargs pointer to any args. This is usually NULL.
*
* @return pointer to errorlog
* @retval NULL if success, filled in errorlog handle for failure
- *
- * @note startTask() can also be used to launch an asynchronous task
- * by calling it with i_pargs set to NULL. This will disable
- * the barrier check.
- *
*/
errlHndl_t startTask( const TaskInfo *i_ptask,
- TaskArgs::TaskArgs *io_pargs ) const;
+ void *io_pargs ) const;
/**
* @brief Execute an function
*
* @param[in] i_ptask - pointer to an TaskInfo struct
- * @param[in,out] i_pargs - pointer to a TaskArgs struct
- * On input, TaskArgs struct will have
- * command, returncode, and errlog fields
- * cleared. Task can fill in these values
- * on return.
+ * @param[in,out] i_pargs - pointer to any args. This is usually NULL.
*
* @return pointer to errorlog
* @retval NULL if success, filled out errorlog if failure
*/
errlHndl_t executeFn( const TaskInfo *i_ptask,
- TaskArgs *i_pargs ) const;
+ void *i_pargs ) const;
/**
@@ -172,14 +153,13 @@ public:
*
* @param[in] i_ptask - pointer to a TaskInfo struct, which should
* contain all the info to run the task.
- * @param[in,out] io_pargs - pointer to a TaskArgs struct. It is
- * possible that this will not be used at all.
+ * @param[in,out] io_pargs - pointer to any args. This is usually NULL.
*
* @return pointer to errlog
* @retval returns NULL, or a pointer to a filled out errorlog
*/
errlHndl_t dispatchTask( const TaskInfo *i_ptask,
- TaskArgs *io_pargs ) const;
+ void *io_pargs ) const;
/**
* @brief Registry a block/range of vitual memory to be handled during a
@@ -218,11 +198,24 @@ protected:
private:
/**
- * @note Disable copy constructor and assignment operator
+ * Disable copy constructor and assignment operator
*/
InitService(const InitService& i_right);
InitService& operator=(const InitService& i_right);
+
+ /**
+ * Check and load module associated with this task or function
+ * if necessary.
+ *
+ * @param[in] i_ptask - pointer to a TaskInfo struct, which should
+ * contain all the info to run the task.
+ * @return pointer to errorlog
+ * @retval NULL if success, filled out errorlog if failure
+ */
+ errlHndl_t checkNLoadModule( const TaskInfo *i_ptask ) const;
+
+
/**
* @struct regBlock_t
* @brief Attributes stored for virtual memory ranges that must be handled
diff --git a/src/usr/initservice/baseinitsvc/initservicetaskentry.C b/src/usr/initservice/baseinitsvc/initservicetaskentry.C
deleted file mode 100644
index eec6eef96..000000000
--- a/src/usr/initservice/baseinitsvc/initservicetaskentry.C
+++ /dev/null
@@ -1,67 +0,0 @@
-// IBM_PROLOG_BEGIN_TAG
-// This is an automatically generated prolog.
-//
-// $Source: src/usr/initservice/baseinitsvc/initservicetaskentry.C $
-//
-// IBM CONFIDENTIAL
-//
-// COPYRIGHT International Business Machines Corp. 2011
-//
-// p1
-//
-// Object Code Only (OCO) source materials
-// Licensed Internal Code Source Materials
-// IBM HostBoot Licensed Internal Code
-//
-// 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.
-//
-// Origin: 30
-//
-// IBM_PROLOG_END
-/**
- * @file initservicetaskentry.C
- * task entry point for Initialization Service.
- * init_main.C will call this by executing
- * task_exec( "libinitservice.so", NULL );
- * From there we can execute the classes that will run in the task.
- *
- * At the end, we must run task_end().
- */
-#include <kernel/console.H>
-#include <sys/vfs.h>
-#include <sys/task.h>
-#include <trace/interface.H>
-#include <errl/errlentry.H>
-
-#include "initservice.H"
-
-
-
-namespace INITSERVICE
-{
-
-extern trace_desc_t *g_trac_initsvc;
-
-/**
- * @brief task entry routine, called by init_main.C
- *
- */
-
-extern "C"
-void _start(void *ptr)
-{
- TRACFCOMP( g_trac_initsvc,
- ENTER_MRK "Executing Initialization Service module." );
-
- // initialize the base modules in Hostboot.
- InitService::getTheInstance().init( ptr );
-
- TRACFCOMP( g_trac_initsvc,
- EXIT_MRK "return from Initialization Service module." );
-
- task_end();
-}
-
-} // namespace
diff --git a/src/usr/initservice/baseinitsvc/initsvctasks.H b/src/usr/initservice/baseinitsvc/initsvctasks.H
index 69b146c92..eed58f592 100644
--- a/src/usr/initservice/baseinitsvc/initsvctasks.H
+++ b/src/usr/initservice/baseinitsvc/initsvctasks.H
@@ -33,27 +33,14 @@
#include <initservice/initsvcreasoncodes.H>
#include "initservice.H"
+
namespace INITSERVICE
{
-const uint64_t MAX_TASKS = 10;
const TaskInfo g_taskinfolist[] = {
/**
- * @brief Errorlog Task
- */
- {
- "liberrl.so" , // taskname
- NULL, // no ptr to fn
- {
- NONE, // don't start
- BASE_IMAGE, // Base Module
- }
- },
-
-
- /**
* @brief PNOR Driver Task
*/
{
@@ -86,7 +73,7 @@ const TaskInfo g_taskinfolist[] = {
"libextinitsvc.so" , // taskname
NULL, // no pointer to fn
{
- START_TASK, // call start()
+ START_TASK,
EXT_IMAGE, // EXT_IMAGE
}
},
diff --git a/src/usr/initservice/baseinitsvc/makefile b/src/usr/initservice/baseinitsvc/makefile
index 097dc3f98..0bbe15d22 100644
--- a/src/usr/initservice/baseinitsvc/makefile
+++ b/src/usr/initservice/baseinitsvc/makefile
@@ -23,7 +23,6 @@
ROOTPATH = ../../../..
MODULE = initservice
-OBJS = initservice.o \
- initservicetaskentry.o
+OBJS = initservice.o
include ${ROOTPATH}/config.mk
diff --git a/src/usr/initservice/extinitsvc/extinitsvc.C b/src/usr/initservice/extinitsvc/extinitsvc.C
index 2db1c44b6..0c42e9678 100644
--- a/src/usr/initservice/extinitsvc/extinitsvc.C
+++ b/src/usr/initservice/extinitsvc/extinitsvc.C
@@ -40,7 +40,7 @@
#include <trace/interface.H>
#include <errl/errlentry.H>
-#include <initservice/taskargs.H> // task entry routine
+#include <initservice/taskargs.H> // task entry macro
#include "extinitsvc.H"
#include "extinitsvctasks.H"
@@ -51,36 +51,31 @@ namespace INITSERVICE
extern trace_desc_t *g_trac_initsvc;
-
/**
- * @brief set up _start() task entry procedure using the macro in taskargs.H
+ * _start() task entry procedure using the macro in taskargs.H
*/
TASK_ENTRY_MACRO( ExtInitSvc::getTheInstance().init );
-void ExtInitSvc::init( void *io_ptr )
+void ExtInitSvc::init( errlHndl_t &io_rtaskRetErrl )
{
errlHndl_t l_errl = NULL;
uint64_t l_task = 0;
const TaskInfo *l_ptask = NULL;
- TaskArgs::TaskArgs l_args;
- uint64_t l_childrc = 0;
- // set up pointer to our taskargs
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_ptr );
printk( "ExtInitSvc entry.\n" );
- TRACFCOMP( g_trac_initsvc,
- "Extended Initialization Service is starting %p.", io_ptr );
-
+ // @todo detach from initservice
+ // task_detach();
+ TRACFCOMP( g_trac_initsvc,
+ "Extended Initialization Service is starting." );
// ----------------------------------------------------------------
// loop through the task list and start up any tasks necessary
// ----------------------------------------------------------------
for ( l_task=0;
- l_task<INITSERVICE::MAX_EXT_TASKS;
+ l_task < ( sizeof(g_exttaskinfolist)/sizeof(TaskInfo) ) ;
l_task++ )
{
// make a local copy of the extended image task
@@ -92,226 +87,155 @@ void ExtInitSvc::init( void *io_ptr )
break;
}
- l_args.clear();
-
// dispatch the task
l_errl = InitService::getTheInstance().dispatchTask( l_ptask,
- &l_args );
+ NULL );
// process errorlogs returned from the task that was launched
if ( l_errl )
{
TRACFCOMP( g_trac_initsvc,
- "ERROR: dispatching task, errlog=0x%p",
- l_errl );
- // break out of loop with error.
- break;
- }
-
- // make local copies of the values in TaskArgs that are returned from
- // the child.
- // this also clears the errorlog from the TaskArgs struct, so
- // use it or lose it ( see taskargs.H for details ).
- l_childrc = l_args.getReturnCode();
- l_errl = l_args.getErrorLog();
-
- if ( l_errl )
- {
- TRACFCOMP( g_trac_initsvc,
- " Child task %s returned 0x%llx, errlog=0x%p",
+ "ERROR: task %s returned errlog=0x%p",
l_ptask->taskname,
- l_childrc,
l_errl );
- // break out of loop with error
+ // break out of loop with error.
break;
}
- else
- {
- // Check child results for a valid nonzero return code.
- // If we have one, and no errorlog, then we create and
- // post our own errorlog here.
- if ( l_childrc != 0 )
- {
- TRACFCOMP( g_trac_initsvc,
- "EIS: Child task %s returned 0x%llx, no errlog",
- l_ptask->taskname,
- l_childrc );
-
- /*@ errorlog tag
- * @errortype ERRL_SEV_CRITICAL_SYS_TERM
- * @moduleid EXTINITSVC_TASK_RETURNED_ERROR_ID
- * @reasoncode EXTINITSVC_FAILED_NO_ERRLOG
- * @userdata1 returncode from task
- * @userdata2 0
- *
- * @devdesc The task returned with an error,
- * but there was no errorlog returned.
- *
- */
- l_errl = new ERRORLOG::ErrlEntry(
- ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM,
- EXTINITSVC_TASK_RETURNED_ERROR_ID,
- INITSERVICE::EXTINITSVC_FAILED_NO_ERRLOG,
- l_childrc,
- 0 );
-
- // break out of loop with error
- break;
- } // end if
- } // end else
} // endfor
// die if we drop out with an error
if ( l_errl )
{
- // dropped out of loop with error.
- // Commit the log first, then stop right here.
+
+#if 0
+ // @todo detach this task and just do task_end()
+ // Commit the errorlog here.
TRACFCOMP( g_trac_initsvc,
- "ExtInitSvc: Committing errorlog..." );
+ "ExtInitSvc ERROR: Committing errorlog %p & shutdown",
+ l_errl );
errlCommit( l_errl, INITSVC_COMP_ID );
- // pass an error code to initsvc that we are shutting down.
- pTaskArgs->postReturnCode( TASKARGS_SHUTDOWN_RC );
- //Tell initservice to perform shutdown sequence
+ // Tell the kernel to shut down. This will not actually
+ // happen until the last thread has ended.
InitService::getTheInstance().doShutdown(
SHUTDOWN_STATUS_EXTINITSVC_FAILED);
+
+ // end the task.
+ end_task();
+#endif
+
+ // end the task and pass the errorlog to initservice to be committed.
+ // initservice should do the shutdown.
+ TRACFCOMP( g_trac_initsvc,
+ "ExtInitSvc: ERROR: return to initsvc with errlog %p",
+ l_errl );
+
+ task_end2( l_errl );
}
TRACFCOMP( g_trac_initsvc,
- EXIT_MRK "ExtInitSvc finished.");
+ "ExtInitSvc finished OK.");
+
- // Test if the child posted an errorcode. If so, don't
- // bother to run the unit tests.
- if ( pTaskArgs->getReturnCode() == 0 )
+ // =====================================================================
+ // ----- Unit Tests -------------------------------------------------
+ // =====================================================================
+ /**
+ * @note run all of the unit tests after we finish the rest
+ * There are 2 images generated in the build:
+ * hbicore.bin (HostBoot shippable image)
+ * hbicore_test.bin (runs all unit tests)
+ * Only hbicore_test.bin has the libcxxtest.so module, so that's
+ * how we test whether to run this.
+ */
+
+ // If the test task does not exist then don't run it.
+ if ( VFS::module_exists( cxxTestTask.taskname ) )
{
- // =====================================================================
- // ----- Unit Tests -------------------------------------------------
- // =====================================================================
- /**
- * @note run all of the unit tests after we finish the rest
- * There are 2 images generated in the build:
- * hbicore.bin (HostBoot shippable image)
- * hbicore_test.bin (runs all unit tests)
- * Only hbicore_test.bin has the libcxxtest.so module, so when
- * we execute startTask() below on hbicore.bin, it will return -ENOENT,
- * no module present. This is OK.
- *
- * @todo can we call call module_load() to see if libcxxtest.so exists?
- * ask Doug or Patrick
- *
- */
-
- printk( "start CxxTest.\n" );
-
- // add a do-while loop so there is only one return at the bottom....
- do
+ printk( "CxxTest entry.\n" );
+
+ // Pass it a set of args so we can wait on the barrier
+ errlHndl_t l_cxxerrl = NULL;
+ const TaskInfo *l_pcxxtask = &cxxTestTask;
+
+ TRACDCOMP( g_trac_initsvc,
+ "Run CxxTest Unit Tests: %s",
+ l_pcxxtask->taskname );
+
+ l_cxxerrl = InitService::getTheInstance().startTask( l_pcxxtask,
+ NULL );
+ // process any errorlogs from cxxtestexec (not sure there are any...)
+ if ( l_cxxerrl )
{
- // Pass it a set of args so we can wait on the barrier
- errlHndl_t l_cxxerrl = NULL;
- TaskArgs::TaskArgs l_cxxtestargs;
- const TaskInfo *l_pcxxtask = &CXXTEST_TASK;
- uint64_t l_cxxchildrc = 0;
- errlHndl_t l_cxxchilderrl = NULL;
+#if 0
+ // @todo detach this task and just do task_end()
+ // First commit the errorlog...
+ TRACFCOMP( g_trac_initsvc,
+ "Committing errorlog %p from cxxtask",
+ l_cxxerrl );
+ errlCommit( l_cxxerrl, INITSVC_COMP_ID );
- l_cxxtestargs.clear();
+ // Tell the kernel to shut down. This will not actually
+ // happen until the last thread has ended.
+ InitService::getTheInstance().doShutdown( SHUTDOWN_STATUS_UT_FAILED);
- TRACDCOMP( g_trac_initsvc,
- ENTER_MRK "Run Unit Tests (if libcxxtests.so is present): %s",
- l_pcxxtask->taskname );
-
- // If the test task does not exist then don't run it.
- if(!VFS::module_exists(l_pcxxtask->taskname)) break;
-
- l_cxxerrl = InitService::getTheInstance().startTask( l_pcxxtask,
- &l_cxxtestargs );
-
- // process errorlogs returned from the task that was launched
- // @TODO if we are running the non-test version of HostBoot, this
- // will always post an extra errorlog. We need a way to know
- // if we are running the _test version or not.
- if ( l_cxxerrl )
- {
- TRACFCOMP( g_trac_initsvc,
- "Committing error from cxxtask launch" );
- errlCommit( l_cxxerrl, INITSVC_COMP_ID );
- break; // ERROR, break out of do-while.
- }
-
- // make local copies of the values in TaskArgs that are returned from
- // the child.
- // this also clears the errorlog from the TaskArgs struct, so
- // use it or lose it ( see taskargs.H for details ).
- l_cxxchildrc = l_cxxtestargs.getReturnCode();
- l_cxxchilderrl = l_cxxtestargs.getErrorLog();
-
- if ( l_cxxchilderrl )
- {
- TRACFCOMP( g_trac_initsvc,
- " Child task returned 0x%llx, errlog=0x%p",
- l_cxxchildrc,
- l_cxxchilderrl );
- errlCommit( l_cxxchilderrl, INITSVC_COMP_ID );
- }
- else
- {
- // Check child results for a valid nonzero return code.
- // If we have one, and no errorlog, then we create and
- // post our own errorlog here.
- if ( l_cxxchildrc != 0 )
- {
- TRACFCOMP( g_trac_initsvc,
- "Child task returned 0x%llx, no errlog",
- l_cxxchildrc );
-
- /*@ errorlog tag
- * @errortype ERRL_SEV_CRITICAL_SYS_TERM
- * @moduleid CXXTEST_TASK_RETURNED_ERROR_ID
- * @reasoncode CXXTEST_FAILED_NO_ERRLOG
- * @userdata1 returncode from istep
- * @userdata2 0
- *
- * @devdesc The unit test dispatcher returned with an
- * error, but there was no errorlog returned.
- */
- l_cxxerrl = new ERRORLOG::ErrlEntry(
- ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM,
- CXXTEST_TASK_RETURNED_ERROR_ID,
- INITSERVICE::CXXTEST_FAILED_NO_ERRLOG,
- l_cxxchildrc,
- 0 );
- errlCommit( l_cxxerrl, INITSVC_COMP_ID );
-
- } // end if
- } // end else
-
- } while(0); // end do-while
-
- printk( "finish CxxTest.\n" );
+ // end the task.
+ end_task();
+#endif
- }
+ // end the task and pass the errorlog to initservice to be committed.
+ // initservice should do the shutdown.
+ TRACFCOMP( g_trac_initsvc,
+ "CxxTest: ERROR: return to initsvc with errlog %p",
+ l_cxxerrl );
+ task_end2( l_cxxerrl );
+ } // endif l_cxxerrl
- // =====================================================================
- // ----- Shutdown all CPUs -----------------------------------------
- // =====================================================================
- TRACFCOMP( g_trac_initsvc,
- EXIT_MRK "CxxTests finished.");
+ // make up and post an errorlog if any tests failed.
+ if ( CxxTest::g_FailedTests )
+ {
+ // some unit tests failed, post an errorlog
+ /*@ errorlog tag
+ * @errortype ERRL_SEV_CRITICAL_SYS_TERM
+ * @moduleid CXXTEST_MOD_ID
+ * @reasoncode CXXTEST_FAILED_TEST
+ * @userdata1 number of failed tests
+ * @userdata2 0
+ *
+ * @devdesc One or more CxxTest Unit Tests failed.
+ *
+ */
+ l_cxxerrl = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM,
+ INITSERVICE::CXXTEST_MOD_ID,
+ INITSERVICE::CXXTEST_FAILED_TEST,
+ CxxTest::g_FailedTests,
+ 0 );
+ TRACFCOMP( g_trac_initsvc,
+ "CxxTest ERROR: %d failed tests, build errlog %p.",
+ CxxTest::g_FailedTests,
+ l_cxxerrl );
- uint64_t l_shutdownStatus = SHUTDOWN_STATUS_GOOD;
+ // end the task and pass the errorlog to initservice to be committed.
+ // initservice should do the shutdown.
+ TRACFCOMP( g_trac_initsvc, "CxxTest: return to initsvc with errlog" );
- if (CxxTest::g_FailedTests)
- {
- l_shutdownStatus = SHUTDOWN_STATUS_UT_FAILED;
- }
+ task_end2( l_cxxerrl );
+ } // endif g_FailedTest
- //Tell initservice to perform shutdown sequence
- InitService::getTheInstance().doShutdown(l_shutdownStatus);
+ printk( "CxxTest exit.\n" );
- printk( "ExtInitSvc exit.\n" );
+ } // endif cxxtest module exists.
+ // finish things up, return to initservice with goodness.
+ TRACFCOMP( g_trac_initsvc,
+ "ExtInitSvc finished OK, return to initsvc with NULL.");
+
+ printk( "ExtInitSvc exit.\n" );
- // return to _start()
+ task_end2( NULL );
}
diff --git a/src/usr/initservice/extinitsvc/extinitsvc.H b/src/usr/initservice/extinitsvc/extinitsvc.H
index eb56dd98c..7c6acec1b 100644
--- a/src/usr/initservice/extinitsvc/extinitsvc.H
+++ b/src/usr/initservice/extinitsvc/extinitsvc.H
@@ -82,14 +82,13 @@ public:
*/
static ExtInitSvc& getTheInstance();
+
/**
* @brief Provide an entry function into the class, called from _start()
*
- * @param[in] i_args pointer to any arguments passed in from
- * _start() and by extension the kernel,
- * currently this is NULL .
+ * @param[in] io_rtaskRetErrl ref to an errlHndl_t passed back to _start()
*/
- void init( void *i_args);
+ void init( errlHndl_t &io_rtaskRetErrl );
protected:
diff --git a/src/usr/initservice/extinitsvc/extinitsvctasks.H b/src/usr/initservice/extinitsvc/extinitsvctasks.H
index e02954319..7d40421e4 100644
--- a/src/usr/initservice/extinitsvc/extinitsvctasks.H
+++ b/src/usr/initservice/extinitsvc/extinitsvctasks.H
@@ -36,7 +36,6 @@
namespace INITSERVICE
{
-const uint64_t MAX_EXT_TASKS = 25;
const TaskInfo g_exttaskinfolist[] = {
@@ -284,7 +283,7 @@ const TaskInfo g_exttaskinfolist[] = {
// -------------------------------------------------------------------------
// ----- UNIT TESTS -------------------------------------------------
// -------------------------------------------------------------------------
-const TaskInfo CXXTEST_TASK = {
+const TaskInfo cxxTestTask = {
"libcxxtest.so" , // taskname
NULL, // no pointer to fn
{
diff --git a/src/usr/initservice/initsvctasktest2/makefile b/src/usr/initservice/initsvctesttask/makefile
index 40d0d6c38..8bdd7cf28 100644
--- a/src/usr/initservice/initsvctasktest2/makefile
+++ b/src/usr/initservice/initsvctesttask/makefile
@@ -21,8 +21,8 @@
#
# IBM_PROLOG_END
ROOTPATH = ../../../..
-MODULE = initsvctasktest2
+MODULE = initsvctesttask
-OBJS = tasktest2.o
+OBJS = tasktest2.o
include ${ROOTPATH}/config.mk
diff --git a/src/usr/initservice/initsvctasktest2/tasktest2.C b/src/usr/initservice/initsvctesttask/tasktest2.C
index fdf830518..c8c52a386 100644
--- a/src/usr/initservice/initsvctasktest2/tasktest2.C
+++ b/src/usr/initservice/initsvctesttask/tasktest2.C
@@ -33,12 +33,14 @@
#include <sys/task.h>
#include <trace/interface.H>
#include <initservice/taskargs.H>
+#include <initservice/initsvcreasoncodes.H>
#include "tasktest2.H"
namespace INITSERVICE
{
+TASK_ENTRY_MACRO( InitSvcTaskTest2::getTheInstance().init );
/******************************************************************************/
// Globals/Constants
@@ -53,33 +55,12 @@ InitSvcTaskTest2& InitSvcTaskTest2::getTheInstance()
}
-/**
- * @brief _start() - task entry point for this module
- *
- */
-extern "C"
-void _start( void *io_pArgs )
+void InitSvcTaskTest2::init( errlHndl_t &io_taskRetErrl )
{
- TaskArgs::TaskArgs *pTaskArgs = (TaskArgs::TaskArgs *)io_pArgs;
-
- // create an instance of InitService
- InitSvcTaskTest2::InitSvcTaskTest2& tt = InitSvcTaskTest2::getTheInstance();
-
- // initialize the base modules in Hostboot.
- tt.init( io_pArgs );
+ errlHndl_t l_errl = NULL;
- if ( pTaskArgs )
- {
- pTaskArgs->waitChildSync();
- }
-
- task_end();
-}
-
-void InitSvcTaskTest2::init( void *i_args )
-{
- return;
+ task_end2( l_errl );
};
} // namespace
diff --git a/src/usr/initservice/initsvctasktest2/tasktest2.H b/src/usr/initservice/initsvctesttask/tasktest2.H
index 227013990..ec2b20db5 100644
--- a/src/usr/initservice/initsvctasktest2/tasktest2.H
+++ b/src/usr/initservice/initsvctesttask/tasktest2.H
@@ -34,8 +34,9 @@
/******************************************************************************/
// Includes
/******************************************************************************/
-#include <stdint.h>
-#include <util/singleton.H>
+#include <stdint.h>
+#include <util/singleton.H>
+
namespace INITSERVICE
{
@@ -63,13 +64,13 @@ class InitSvcTaskTest2
public:
/**
- * @brief Constructor for the InitService object.
+ * @brief Constructor
*/
InitSvcTaskTest2()
{ }
/**
- * @brief Destructor for the InitService object.
+ * @brief Destructor
*/
~InitSvcTaskTest2()
{ }
@@ -77,20 +78,17 @@ public:
/**
* @brief Get singleton instance of this class.
*
- * @return the (one and only) instance of InitService
+ * @return the (one and only) instance
*/
static InitSvcTaskTest2& getTheInstance();
/**
* @brief Provide an entry function into the class, called from _start()
*
- * @param[in] i_args pointer to any arguments passed in from
- * _start() and by extension the kernel,
- * currently this is NULL .
+ * @param[in,out] - reference to an errlHndl_t
*
- * @todo document any changes for args
*/
- void init( void *i_args);
+ void init( errlHndl_t &io_taskRetErrl );
private:
diff --git a/src/usr/initservice/initsvcunittesttask2/makefile b/src/usr/initservice/initsvcunittesttask2/makefile
deleted file mode 100644
index dfb0339ee..000000000
--- a/src/usr/initservice/initsvcunittesttask2/makefile
+++ /dev/null
@@ -1,28 +0,0 @@
-# IBM_PROLOG_BEGIN_TAG
-# This is an automatically generated prolog.
-#
-# $Source: src/usr/initservice/initsvcunittesttask2/makefile $
-#
-# IBM CONFIDENTIAL
-#
-# COPYRIGHT International Business Machines Corp. 2011
-#
-# p1
-#
-# Object Code Only (OCO) source materials
-# Licensed Internal Code Source Materials
-# IBM HostBoot Licensed Internal Code
-#
-# 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.
-#
-# Origin: 30
-#
-# IBM_PROLOG_END
-ROOTPATH = ../../../..
-MODULE = tasktest2
-
-OBJS = tasktest2.o
-
-include ${ROOTPATH}/config.mk
diff --git a/src/usr/initservice/istepdispatcher/istepdispatcher.C b/src/usr/initservice/istepdispatcher/istepdispatcher.C
index 6c36fa1ec..519369f64 100644
--- a/src/usr/initservice/istepdispatcher/istepdispatcher.C
+++ b/src/usr/initservice/istepdispatcher/istepdispatcher.C
@@ -55,7 +55,7 @@
#include <initservice/isteps_trace.H> // ISTEPS_TRACE buffer
#include <initservice/initsvcudistep.H> // InitSvcUserDetailsIstep
-#include <initservice/taskargs.H> // TaskArgs structs
+#include <initservice/taskargs.H> // TASK_ENTRY_MACRO
#include <targeting/attributes.H> // ISTEP_MODE attribute
@@ -93,39 +93,37 @@ using namespace SPLESS; // SingleStepMode
extern trace_desc_t *g_trac_initsvc;
/**
-
* @note SPLess PAUSE - These two constants are used in a nanosleep() call
* below to sleep between polls of the StatusReg. Typically this will
* be about 10 ms - the actual value will be determined empirically.
- *
*/
const uint64_t SINGLESTEP_PAUSE_S = 0;
const uint64_t SINGLESTEP_PAUSE_NS = 10000000;
/**
- * @brief set up _start() task entry procedure using the macro in taskargs.H
+ * _start() task entry procedure using the macro in taskargs.H
*/
TASK_ENTRY_MACRO( IStepDispatcher::getTheInstance().init );
const TaskInfo *IStepDispatcher::findTaskInfo(
const uint16_t i_IStep,
- const uint16_t i_SubStep,
- const char *&io_rmodulename ) const
+ const uint16_t i_SubStep ) const
{
+ // default return is NULL
const TaskInfo *l_pistep = NULL;
/**
* @todo
* everything calling this should feed into the "real" istep/substep
- * numbers ( starting at 1 ) - this routine will translate to index into
+ * numbers ( starting at 1 ) - this routine should translate to index into
* the isteplists ( starting at 0 )
*
+ * int16_t l_istepIndex = i_IStep-1;
+ * int16_t l_substepIndex = i_SubStep-1;
+ *
+ * assert( l_istepIndex >= 0 );
+ * assert( l_substepIndex >= 0 );
*/
- //int16_t l_istepIndex = i_IStep-1;
- //int16_t l_substepIndex = i_SubStep-1;
-
- //assert( l_istepIndex >= 0 );
- //assert( l_substepIndex >= 0 );
// apply filters
do
@@ -134,7 +132,7 @@ const TaskInfo *IStepDispatcher::findTaskInfo(
if ( g_isteps[i_IStep].pti == NULL)
{
TRACDCOMP( g_trac_initsvc,
- "g_isteps[0x%x].pti == NULL (substep=0x%x)",
+ "g_isteps[%d].pti == NULL (substep=%d)",
i_IStep,
i_SubStep );
break;
@@ -144,7 +142,7 @@ const TaskInfo *IStepDispatcher::findTaskInfo(
if ( i_IStep >= MAX_ISTEPS )
{
TRACDCOMP( g_trac_initsvc,
- "IStep 0x%x out of range. (substep=0x%x) ",
+ "IStep %d out of range. (substep=%d) ",
i_IStep,
i_SubStep );
break; // break out with l_pistep set to NULL
@@ -154,7 +152,7 @@ const TaskInfo *IStepDispatcher::findTaskInfo(
if ( i_SubStep >= g_isteps[i_IStep].numitems )
{
TRACDCOMP( g_trac_initsvc,
- "IStep 0x%x Substep 0x%x out of range.",
+ "IStep %d Substep %d out of range.",
i_IStep,
i_SubStep );
break; // break out with l_pistep set to NULL
@@ -165,7 +163,7 @@ const TaskInfo *IStepDispatcher::findTaskInfo(
== END_TASK_LIST )
{
TRACDCOMP( g_trac_initsvc,
- "IStep 0x%x SubSStep 0x%x task_type==END_TASK_LIST.",
+ "IStep %d SubStep %d task_type==END_TASK_LIST.",
i_IStep,
i_SubStep );
break;
@@ -177,25 +175,15 @@ const TaskInfo *IStepDispatcher::findTaskInfo(
if ( g_isteps[i_IStep].pti[i_SubStep].taskfn == NULL )
{
TRACDCOMP( g_trac_initsvc,
- "IStep 0x%x SubSStep 0x%x fn ptr is NULL.",
+ "IStep %d SubStep %d fn ptr is NULL.",
i_IStep,
i_SubStep );
break;
}
+ // we're good, set the istep & return it to caller
l_pistep = &( g_isteps[i_IStep].pti[i_SubStep] );
- // find the name of the module that contains this function,
- io_rmodulename = VFS::module_find_name(
- reinterpret_cast<void*>(l_pistep->taskfn) );
- // looks good, send it back to the caller
- TRACDCOMP( g_trac_initsvc,
- "Found TaskInfo 0x%p %d.%d in module %s",
- l_pistep,
- i_IStep,
- i_SubStep,
- ((io_rmodulename!=NULL)?io_rmodulename:"NULL???") );
-
} while ( 0 );
@@ -203,9 +191,8 @@ const TaskInfo *IStepDispatcher::findTaskInfo(
}
-void IStepDispatcher::init( void * io_ptr )
+void IStepDispatcher::init( errlHndl_t &io_rtaskRetErrl )
{
- // note, io_ptr will pass the TaskArgs struct through to runAllSteps, etc.
// initialize (and declare) ISTEPS_TRACE here, the rest of the isteps will use it.
ISTEPS_TRACE::g_trac_isteps_trace = NULL;
@@ -215,8 +202,7 @@ void IStepDispatcher::init( void * io_ptr )
TRAC_INIT(&ISTEPS_TRACE::g_trac_isteps_trace, "ISTEPS_TRACE", 2048 );
TRACFCOMP( g_trac_initsvc,
- "IStep Dispatcher is starting %p.", io_ptr );
-
+ "IStep Dispatcher is starting." );
if ( getIStepMode() )
{
@@ -226,7 +212,7 @@ void IStepDispatcher::init( void * io_ptr )
"IStep single-step enable" );
// IStep single-step
- singleStepISteps( io_ptr );
+ singleStepISteps( io_rtaskRetErrl );
}
else
{
@@ -236,7 +222,7 @@ void IStepDispatcher::init( void * io_ptr )
"IStep run all" );
// Run all the ISteps sequentially
- runAllISteps( io_ptr );
+ runAllISteps( io_rtaskRetErrl );
} // endelse
@@ -245,7 +231,8 @@ void IStepDispatcher::init( void * io_ptr )
printk( "IStepDispatcher exit.\n" );
- // return to _start()
+
+ task_end2( io_rtaskRetErrl );
}
@@ -273,35 +260,20 @@ bool IStepDispatcher::getIStepMode( ) const
}
-/**
- * @brief Command 0: Run the requested IStep/SubStep
- *
- * param[in] i_rcmd - ref to a filled in SPLessCmd struct
- * @post iv_sts set to current istep status
- *
- * @return none
- */
void IStepDispatcher::processSingleIStepCmd(
SPLessCmd &i_rrawcmd )
{
errlHndl_t l_errl = NULL;
- uint64_t l_isteprc = NULL;
- TaskArgs::TaskArgs l_taskargs;
const TaskInfo *l_pistep = NULL;
// init the command 0x00 struct to the incoming command reg values
SPLessSingleIStepCmd l_cmd( i_rrawcmd );
// create a cleared status 0x00 reg
SPLessSingleIStepSts l_sts;
- const char *l_modulename = NULL;
-
-
// look up istep+substep
l_pistep = IStepDispatcher::getTheInstance().findTaskInfo(
l_cmd.istep,
- l_cmd.substep,
- l_modulename);
-
+ l_cmd.substep );
do
{
if ( l_pistep == NULL )
@@ -349,46 +321,6 @@ void IStepDispatcher::processSingleIStepCmd(
// handleBreakPoint will need sequence number
iv_sts.hdr.seqnum = l_cmd.hdr.seqnum;
-
- /**
- * @todo temporary - executeFn will eventually figure out and
- * load the correct module
- */
- if ( ( l_modulename != NULL )
- && ( !VFS::module_is_loaded( l_modulename ) )
- )
- {
- TRACDCOMP( g_trac_initsvc,
- "loading module %s",
- l_modulename );
- l_errl = VFS::module_load( l_modulename );
- if ( l_errl )
- {
- // can't load module for istep, break out of inner loop
- // with errl set
- TRACFCOMP( g_trac_initsvc,
- "Could not load module %s",
- l_modulename );
-
- l_sts.hdr.status = SPLESS_TASKRC_RETURNED_ERRLOG;
- // go ahead and commit the errorlog
- errlCommit( l_errl, INITSVC_COMP_ID );
-
- // failed to load module, return error
- l_sts.hdr.runningbit = false;
- l_sts.hdr.readybit = true;
- l_sts.hdr.status = SPLESS_TASKRC_FAIL_LOADMODULE;
- l_sts.istep = l_cmd.istep;
- l_sts.substep = l_cmd.substep;
- l_sts.istepStatus = 0;
-
- // return to caller to write back to user console
- iv_sts = l_sts;
-
- break;
- }
- }
-
/**
* @todo placeholder - set progress code before starting
* This will not be finalized until the progress code driver
@@ -403,56 +335,28 @@ void IStepDispatcher::processSingleIStepCmd(
l_cmd.substep,
l_pistep->taskname );
- // clear the TaskArgs struct
- l_taskargs.clear();
-
// clear the status struct for the next step
l_sts.val64 = 0;
// launch the istep
l_errl = InitService::getTheInstance().executeFn( l_pistep,
- &l_taskargs );
- // filter errors returning from executeFn
+ NULL );
+ // check for child errorlog
if ( l_errl )
{
- // handle an errorlog from the parent. This means the
- // launch failed, set the task Status to Bad.
- // no need to process child info, thus the else.
- // set the taskStatus to LAUNCH_FAIL; this will fall
- // out the bottom and be written to SPLESS Status
- l_sts.hdr.status = SPLESS_TASKRC_LAUNCH_FAIL;
+ // tell the user that the IStep returned an errorlog
+ l_sts.hdr.status = SPLESS_TASKRC_RETURNED_ERRLOG;
+ l_sts.istepStatus = SPLESS_TASKRC_RETURNED_ERRLOG;
+ // go ahead and commit the child errorlog
errlCommit( l_errl, INITSVC_COMP_ID );
}
- else
- {
- // process information returned from the IStep.
- // make local copies of the info; this has a secondary
- // effect of clearing the errorlog pointer inside
- // the TaskArgs struct.
- l_isteprc = l_taskargs.getReturnCode(); // local copy
- l_errl = l_taskargs.getErrorLog(); // local copy
-
- // check for child errorlog
- if ( l_errl )
- {
- // tell the user that the IStep returned an errorlog
- l_sts.hdr.status = SPLESS_TASKRC_RETURNED_ERRLOG;
- // go ahead and commit the child errorlog
- errlCommit( l_errl, INITSVC_COMP_ID );
- }
-
- // truncate IStep return status to 32 bits.
- l_isteprc &= SPLESS_SINGLE_STEP_STS_MASK;
- l_sts.istepStatus = static_cast<uint32_t>(l_isteprc);
- } // end else parent errlog
- // task status and istepStatus should be set correctly now,
- // send it to the user console.
+ // send status to the user console.
// clear runningbit, report status
// set running bit, fill in istep and substep
l_sts.hdr.runningbit = false;
l_sts.hdr.readybit = true;
- // l_sts.hdr.seqnum = i_seqnum;
+ // l_sts.hdr.seqnum set by caller
// task status set above
l_sts.istep = l_cmd.istep;
l_sts.substep = l_cmd.substep;
@@ -473,25 +377,15 @@ void IStepDispatcher::processSingleIStepCmd(
}
-/**
- * @brief singleStepISteps
- *
- * Stop and wait for SP to send the next IStep to run. Run that, then
- * wait for the next one.
- * This is not expected to return - errors etc are sent to the user to
- * handle.
- *
- * @param[in,out] io_ptr - pointer to any args passed in from
- * ExtInitSvc. This may be a pointer to an
- * TaskArgs struct (or something else) which
- * can be filled out on return
- *
- * @return none
- */
-void IStepDispatcher::singleStepISteps( void * io_ptr )
+void IStepDispatcher::singleStepISteps( errlHndl_t &io_rtaskRetErrl )
{
SPLessCmd l_cmd;
uint8_t l_seqnum = 0;
+ bool quitflag = false;
+ errlHndl_t l_errl = NULL;
+
+ // init to no errorlog
+ io_rtaskRetErrl = NULL;
mutex_lock(&iv_poll_mutex); // make sure this is only poller
@@ -524,11 +418,7 @@ void IStepDispatcher::singleStepISteps( void * io_ptr )
{
switch( l_cmd.hdr.cmdnum )
{
- case SPLESS_CLEAR_TRACE_CMD:
- TRAC_CLEAR_BUFFERS();
- TRACFCOMP( g_trac_initsvc,
- "Cleared all trace buffers." );
- break;
+
case SPLESS_SINGLE_ISTEP_CMD:
mutex_unlock(&iv_poll_mutex);
// command 0: run istep/substep
@@ -540,6 +430,17 @@ void IStepDispatcher::singleStepISteps( void * io_ptr )
iv_sts.hdr.status = SPLESS_NOT_AT_BREAK_POINT;
break;
+ case SPLESS_CLEAR_TRACE_CMD:
+ TRAC_CLEAR_BUFFERS();
+ TRACFCOMP( g_trac_initsvc,
+ "Cleared all trace buffers." );
+ break;
+
+ case SPLESS_SHUTDOWN_CMD:
+ iv_sts.hdr.status = SPLESS_SHUTTING_DOWN;
+ quitflag = true;
+ break;
+
default:
iv_sts.hdr.status = SPLESS_INVALID_COMMAND;
} // endif switch
@@ -554,6 +455,30 @@ void IStepDispatcher::singleStepISteps( void * io_ptr )
} // endif gobit
+ if ( quitflag == true )
+ {
+ // shutdown command issued, break out of loop
+
+ /*@ errorlog tag
+ * @errortype ERRL_SEV_INFORMATIONAL
+ * @moduleid BASE_INITSVC_MOD_ID
+ * @reasoncode ISTEP_SINGLESTEP_SHUTDOWN
+ * @userdata1 0
+ * @userdata2 0
+ *
+ * @devdesc hb-istep terminated
+ *
+ */
+ l_errl = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_INFORMATIONAL,
+ INITSERVICE::BASE_INITSVC_MOD_ID,
+ INITSERVICE::ISTEP_SINGLESTEP_SHUTDOWN,
+ 0,
+ 0 );
+
+ break;
+ }
+
// sleep, and wait for user to give us something else to do.
/**
* @todo Need a common method of doing delays in HostBoot
@@ -575,8 +500,6 @@ void IStepDispatcher::singleStepISteps( void * io_ptr )
// @note
// Fell out of loop, clear sts reg and turn off readybit
- // Currently this will never be reached. Later there may be
- // a reason to break out of the loop, if this happens we want to
// disable the ready bit so the user knows.
iv_sts.val64 = 0;
iv_sts.hdr.status = SPLESS_TASKRC_TERMINATED;
@@ -584,25 +507,21 @@ void IStepDispatcher::singleStepISteps( void * io_ptr )
writeSts( iv_sts );
mutex_unlock(&iv_poll_mutex);
+ // return with io_rtaskRetErrl set
+ io_rtaskRetErrl = l_errl;
}
-void IStepDispatcher::runAllISteps( void * io_ptr ) const
+void IStepDispatcher::runAllISteps( errlHndl_t &io_rtaskRetErrl ) const
{
errlHndl_t l_errl = NULL;
uint16_t l_IStep = 0;
uint16_t l_SubStep = 0;
const TaskInfo *l_pistep = NULL;
uint64_t l_progresscode = 0;
- uint64_t l_isteprc = 0;
- const char *l_modulename = NULL;
-
- // taskargs struct for children
- TaskArgs::TaskArgs l_args;
- // set up pointer to our taskargs, passed in from caller
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>( io_ptr );
+ // init, just to be sure.
+ io_rtaskRetErrl = NULL;
for ( l_IStep=0;
l_IStep<INITSERVICE::MAX_ISTEPS;
@@ -613,123 +532,38 @@ void IStepDispatcher::runAllISteps( void * io_ptr ) const
l_SubStep++)
{
l_pistep = findTaskInfo( l_IStep,
- l_SubStep,
- l_modulename );
+ l_SubStep );
if ( l_pistep == NULL )
{
break; // break out of inner for loop
}
-
- /**
- * @todo temporary - executeFn will eventually figure out and
- * load the correct module
- */
- if ( ( l_modulename != NULL )
- && ( !VFS::module_is_loaded( l_modulename ) )
- )
- {
- TRACDCOMP( g_trac_initsvc,
- "loading module %s",
- l_modulename );
- l_errl = VFS::module_load( l_modulename );
- if ( l_errl )
- {
- // can't load module for istep, break out of inner loop
- // with errl set
- TRACFCOMP( g_trac_initsvc,
- "Could not load module %s",
- l_modulename );
-
- break;
- }
- }
-
// @todo placeholder until progress codes are defined and
// progress code driver is implemented.
l_progresscode = ( (l_IStep<<16) | l_SubStep );
InitService::getTheInstance().setProgressCode( l_progresscode );
+
// print out what we are running
TRACFCOMP( g_trac_initsvc,
- "Run IStep %d.%d %s",
+ "IStepDisp: Run IStep %d.%d %s",
l_IStep,
l_SubStep,
l_pistep->taskname );
-
- l_args.clear();
l_errl = InitService::getTheInstance().executeFn( l_pistep,
- &l_args );
- if ( l_errl )
- {
- // Handle an errorlog from the parent, if it exists
- // an error here is probably fatal, it means we can't
- // launch the task or it doesn't exist. In either
- // case we should exit the loop.
- // Can't commit the errorlog here because we are using it
- // as a flag to exit the loop.
- break;
- }
-
- // make local copies of the status returned from the istep.
- // note that this also removes the errorlog from the TaskArgs
- // struct - it is read-once. See taskargs.H for details
- l_isteprc = l_args.getReturnCode();
- l_errl = l_args.getErrorLog();
-
-
+ NULL );
if ( l_errl )
{
TRACFCOMP( g_trac_initsvc,
- "ISD: istep %s returned 0x%llx, errlog=%p",
+ "IStepDisp: istep %s returned errlog=%p",
l_pistep->taskname,
- l_isteprc,
l_errl );
// if we have an errorlog, break out of the inner loop
// and handle it.
break;
}
- else
- {
- // Check child results for a valid nonzero return code.
- // If we have one, and no errorlog, then we create an
- // errorlog here.
- if ( l_isteprc != 0 )
- {
- TRACFCOMP( g_trac_initsvc,
- "ISD: istep %s returned 0x%llx, no errlog",
- l_pistep->taskname,
- l_isteprc );
-
- /*@ errorlog tag
- * @errortype ERRL_SEV_CRITICAL_SYS_TERM
- * @moduleid ISTEP_RETURNED_ERROR_ID
- * @reasoncode ISTEP_FAILED_NO_ERRLOG
- * @userdata1 istep / substep
- * @userdata2 returncode from istep
- *
- * @devdesc The Istep returned with an error,
- * but there was no errorlog posted
- * from the IStep. Look at user1 data
- * for the istep / substep, and
- * user2 data for the returned errorcode.
- */
- l_errl = new ERRORLOG::ErrlEntry(
- ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM,
- ISTEP_RETURNED_ERROR_ID,
- INITSERVICE::ISTEP_FAILED_NO_ERRLOG,
- ( l_IStep << 8 | l_SubStep ),
- l_isteprc );
-
- // Add IStep user detail data to the error log
- InitSvcUserDetailsIstep(l_pistep->taskname, l_IStep,
- l_SubStep).addToLog( l_errl );
-
- // drop out of inner loop with errlog set.
- break;
- } // end if ( )
- }
+
} // endfor l_SubStep
if ( l_errl )
@@ -746,22 +580,14 @@ void IStepDispatcher::runAllISteps( void * io_ptr ) const
*/
- // Post any errorlogs. If one exists, stop here. Otherwise, return
- // to caller.
if ( l_errl )
{
TRACFCOMP( g_trac_initsvc,
- "ERROR: istep=0x%x, substep=0x%x, isteprc=0x%x, committing errorlog and shutting down.",
- l_IStep,
- l_SubStep,
- l_isteprc );
- errlCommit( l_errl, INITSVC_COMP_ID );
-
- // pass an error code on to extinitsvc that we are shutting down.
- pTaskArgs->postReturnCode( TASKARGS_SHUTDOWN_RC );
- //Tell initservice to perform shutdown sequence
- InitService::getTheInstance().doShutdown( SHUTDOWN_STATUS_ISTEP_FAILED );
+ "IStepDisp ERROR: errorlog %p",
+ l_errl );
+ // return to _start() with the errorlog set, parent should do shutdown
+ io_rtaskRetErrl = l_errl;
}
}
@@ -797,6 +623,7 @@ IStepDispatcher::IStepDispatcher()
IStepDispatcher::~IStepDispatcher()
{ }
+
void IStepDispatcher::handleBreakPoint( uint32_t i_info )
{
SPLessCmd l_cmd;
diff --git a/src/usr/initservice/istepdispatcher/istepdispatcher.H b/src/usr/initservice/istepdispatcher/istepdispatcher.H
index 6679f30d5..b4842f5e9 100644
--- a/src/usr/initservice/istepdispatcher/istepdispatcher.H
+++ b/src/usr/initservice/istepdispatcher/istepdispatcher.H
@@ -92,19 +92,19 @@ public:
/**
* @brief Provide an entry function into the class, called from _start()
*
- * @param[in] i_pargs pointer to any arguments passed in from
- * _start().
+ * @param[in] io_rtaskRetErrl - ref to errlHndl_t passed back to _start().
*
* @return nothing
*/
- void init( void *i_pargs);
+ void init( errlHndl_t &io_rtaskRetErrl );
+
/**
* @brief Handle an istep break point
* @param[in] i_info, @TODO - location/info
- * @pre iv_sts contains current istep status + seqnum or
+ * @pre iv_sts contains current istep status + seqnum or
* 0 if not in step mode
- * @note blocks until an outside istep cmd to resume is recieved.
+ * @note blocks until an outside istep cmd to resume is recieved.
*/
void handleBreakPoint( uint32_t info);
@@ -146,7 +146,6 @@ private:
*
* @param[in] i_IStep - IStepNumber
* @param[in] i_SubStep - SubStepNumber
- * @param[in,out] io_rmodulename - return name of module to load
*
* @return pointer to a TaskInfo struct
* @retval pointer to a TaskInfo struct, or NULL
@@ -154,8 +153,7 @@ private:
*/
const TaskInfo *findTaskInfo(
const uint16_t i_IStep,
- const uint16_t i_SubStep,
- const char *&io_rmodulename ) const;
+ const uint16_t i_SubStep ) const;
/**
* @brief Command 0: Run the requested IStep/SubStep
@@ -165,8 +163,7 @@ private:
*
* @return none
*/
- void processSingleIStepCmd(
- SPLESS::SPLessCmd &i_rcmd);
+ void processSingleIStepCmd( SPLESS::SPLessCmd &i_rcmd);
/**
@@ -174,17 +171,12 @@ private:
*
* Stop and wait for SP to send the next IStep to run. Run that, then
* wait for the next one.
- * This is not expected to return - errors etc are sent to the user to
- * handle.
- *
- * @param[in,out] io_ptr - pointer to any args passed in from
- * ExtInitSvc. This may be a pointer to an
- * TaskArgs struct (or something else) which
- * can be filled out on return
+ * @param[in,out] - ref to an errlHndl_t that can be passed back to
+ * ExtInitSvc .
*
* @return none
*/
- void singleStepISteps( void * io_ptr );
+ void singleStepISteps( errlHndl_t &io_rtaskRetErrl ) ;
/**
@@ -194,14 +186,12 @@ private:
* If an IStep gets an error, report it and stop.
* Otherwise, return.
*
- * @param[in,out] io_ptr - pointer to a TaskArgs struct on input
- * command, returncode and errorlog will be
- * clear on input
- * one or more may be filled in on return
+ * @param[in,out] - ref to an errlHndl_t that can be passed back to
+ * ExtInitSvc .
*
* @return none
*/
- void runAllISteps( void * io_ptr ) const;
+ void runAllISteps( errlHndl_t &io_rtaskRetErrl ) const;
/**
@@ -226,9 +216,10 @@ private:
* vague - requirements for Can-Continue behaviour have not been
* defined yet.
*/
- bool getCanContinueProcedure( const TaskInfo &i_failingIStep,
- errlHndl_t &i_failingError,
- TaskInfo &io_nextIStep ) const;
+ bool getCanContinueProcedure(
+ const TaskInfo &i_failingIStep,
+ errlHndl_t &i_failingError,
+ TaskInfo &io_nextIStep ) const;
// ----- internal vars -----------------------------
diff --git a/src/usr/initservice/istepdispatcher/splesscommand.C b/src/usr/initservice/istepdispatcher/splesscommand.C
deleted file mode 100644
index 563a4be3a..000000000
--- a/src/usr/initservice/istepdispatcher/splesscommand.C
+++ /dev/null
@@ -1,113 +0,0 @@
-// IBM_PROLOG_BEGIN_TAG
-// This is an automatically generated prolog.
-//
-// $Source: src/usr/initservice/istepdispatcher/splesscommand.C $
-//
-// IBM CONFIDENTIAL
-//
-// COPYRIGHT International Business Machines Corp. 2011
-//
-// p1
-//
-// Object Code Only (OCO) source materials
-// Licensed Internal Code Source Materials
-// IBM HostBoot Licensed Internal Code
-//
-// 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.
-//
-// Origin: 30
-//
-// IBM_PROLOG_END
-
-/**
- * @file splesscommand.C
- *
- * Collection of routines to read/write the spless command reg
- *
- */
-
-
-/******************************************************************************/
-// Includes
-/******************************************************************************/
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <errl/errlentry.H> // errlHndl_t
-#include <sys/mmio.h> // mmio_scratch_read/write
-
-#include "splesscommon.H"
-
-
-/******************************************************************************/
-// Globals/Constants
-/******************************************************************************/
-
-/******************************************************************************/
-// Typedef/Enumerations
-/******************************************************************************/
-
-namespace SPLESSCMD
-{
-
-
-void read( bool &io_rgobit,
- uint16_t &io_ristep,
- uint16_t &io_rsubstep )
-{
- InternalCommand l_cmd;
-
- l_cmd.val64 = mmio_scratch_read(MMIO_SCRATCH_IPLSTEP_COMMAND);
-
- io_rgobit = l_cmd.f.gobit;
- io_ristep = l_cmd.f.istep;
- io_rsubstep = l_cmd.f.substep;
-
-}
-
-
-void write( const bool i_gobit,
- const uint16_t i_istep,
- const uint16_t i_substep )
-{
- InternalCommand l_cmd;
-
- // copy into union
- l_cmd.f.gobit = i_gobit;
- l_cmd.f.istep = i_istep;
- l_cmd.f.substep = i_substep;
-
- mmio_scratch_write( MMIO_SCRATCH_IPLSTEP_COMMAND, l_cmd.val64 );
-
-}
-
-
-void getgobit( bool &o_rgobit )
-{
- uint16_t l_istep = 0;
- uint16_t l_substep = 0;
-
- // re-use above call...
- read( o_rgobit,
- l_istep,
- l_substep );
-
-}
-
-
-void setgobit( const bool i_gobit )
-{
- InternalCommand l_cmd;
-
- l_cmd.val64 = mmio_scratch_read( MMIO_SCRATCH_IPLSTEP_COMMAND);
-
- l_cmd.f.gobit = i_gobit;
-
- mmio_scratch_write( MMIO_SCRATCH_IPLSTEP_COMMAND, l_cmd.val64 );
-
-}
-
-} // namespace
diff --git a/src/usr/initservice/istepdispatcher/splesscommon.H b/src/usr/initservice/istepdispatcher/splesscommon.H
index 2cb273f0e..e912b7a85 100644
--- a/src/usr/initservice/istepdispatcher/splesscommon.H
+++ b/src/usr/initservice/istepdispatcher/splesscommon.H
@@ -95,9 +95,10 @@ enum {
SPLESS_TASKRC_TERMINATED = -6, // terminated the polling loop
SPLESS_TASKRC_FAIL_LOADMODULE = -7, // failed to load module
- SPLESS_INVALID_COMMAND = 10, // invalid command from user console
- SPLESS_AT_BREAK_POINT = 11, // at breakpoint
- SPLESS_NOT_AT_BREAK_POINT = 12, // resume command w/o breakpoint
+ SPLESS_INVALID_COMMAND = 10, // invalid command from user console
+ SPLESS_AT_BREAK_POINT = 11, // at breakpoint
+ SPLESS_NOT_AT_BREAK_POINT = 12, // resume command w/o breakpoint
+ SPLESS_SHUTTING_DOWN = 13, // shutdown command issued
};
/**
@@ -139,6 +140,8 @@ extern uint64_t g_SPLess_IStepMode_Reg;
const uint8_t SPLESS_SINGLE_ISTEP_CMD = 0x00;
const uint8_t SPLESS_RESUME_ISTEP_CMD = 0x01;
const uint8_t SPLESS_CLEAR_TRACE_CMD = 0x02;
+const uint8_t SPLESS_SHUTDOWN_CMD = 0x03;
+
const uint64_t SPLESS_SINGLE_STEP_STS_MASK = 0x00000000ffffffff;
/**
diff --git a/src/usr/initservice/istepdispatcher/splessstatus.C b/src/usr/initservice/istepdispatcher/splessstatus.C
deleted file mode 100644
index 30818778c..000000000
--- a/src/usr/initservice/istepdispatcher/splessstatus.C
+++ /dev/null
@@ -1,93 +0,0 @@
-// IBM_PROLOG_BEGIN_TAG
-// This is an automatically generated prolog.
-//
-// $Source: src/usr/initservice/istepdispatcher/splessstatus.C $
-//
-// IBM CONFIDENTIAL
-//
-// COPYRIGHT International Business Machines Corp. 2011
-//
-// p1
-//
-// Object Code Only (OCO) source materials
-// Licensed Internal Code Source Materials
-// IBM HostBoot Licensed Internal Code
-//
-// 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.
-//
-// Origin: 30
-//
-// IBM_PROLOG_END
-/**
- * @file splessstatus.C
- *
- * Routines to read and write spless status reg
- *
- */
-
-/******************************************************************************/
-// Includes
-/******************************************************************************/
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <errl/errlentry.H> // errlHndl_t
-#include <sys/mmio.h> // mmio_scratch_read/write
-
-#include "splesscommon.H"
-
-/******************************************************************************/
-// Globals/Constants
-/******************************************************************************/
-
-/******************************************************************************/
-// Typedef/Enumerations
-/******************************************************************************/
-
-
-void SPLESSSTS::read( bool &io_rrunningbit,
- bool &io_rreadybit,
- uint16_t &io_ristep,
- uint16_t &io_rsubstep,
- uint16_t &io_rtaskStatus,
- uint16_t &io_ristepStatus )
-{
- InternalStatus l_sts;
-
- l_sts.val64 = mmio_scratch_read(MMIO_SCRATCH_IPLSTEP_STATUS);
-
- // read was good
- io_rrunningbit = l_sts.f.runningbit;
- io_rreadybit = l_sts.f.readybit;
- io_ristep = l_sts.f.istep;
- io_rsubstep = l_sts.f.substep;
- io_rtaskStatus = l_sts.f.taskStatus;
- io_ristepStatus = l_sts.f.istepStatus;
-
-}
-
-
-void SPLESSSTS::write( const bool i_runningbit,
- const bool i_readybit,
- const uint16_t i_istep,
- const uint16_t i_substep,
- const uint16_t i_taskStatus,
- const uint16_t i_istepStatus )
-{
- InternalStatus l_sts;
-
- // copy in all the values
- l_sts.f.runningbit = i_runningbit;
- l_sts.f.readybit = i_readybit;
- l_sts.f.istep = i_istep;
- l_sts.f.substep = i_substep;
- l_sts.f.taskStatus = i_taskStatus;
- l_sts.f.istepStatus = i_istepStatus;
-
- mmio_scratch_write( MMIO_SCRATCH_IPLSTEP_STATUS, l_sts.val64 );
-
-}
-
diff --git a/src/usr/initservice/makefile b/src/usr/initservice/makefile
index 5bdac5fde..c87b7187a 100644
--- a/src/usr/initservice/makefile
+++ b/src/usr/initservice/makefile
@@ -26,9 +26,9 @@ ROOTPATH = ../../..
# OBJS =
-# NOTE: initsvctasktest2 is a dummy module that is executed by
+# NOTE: initsvctest is a dummy module that is executed by
# unit test 2 in the test directory. Please do not rename.
-SUBDIRS = baseinitsvc.d extinitsvc.d taskargs.d istepdispatcher.d \
- test.d initsvctasktest2.d build.d
+SUBDIRS = baseinitsvc.d extinitsvc.d istepdispatcher.d \
+ test.d initsvctesttask.d build.d
include ${ROOTPATH}/config.mk
diff --git a/src/usr/initservice/taskargs/makefile b/src/usr/initservice/taskargs/makefile
deleted file mode 100644
index 7d3c28fd8..000000000
--- a/src/usr/initservice/taskargs/makefile
+++ /dev/null
@@ -1,28 +0,0 @@
-# IBM_PROLOG_BEGIN_TAG
-# This is an automatically generated prolog.
-#
-# $Source: src/usr/initservice/taskargs/makefile $
-#
-# IBM CONFIDENTIAL
-#
-# COPYRIGHT International Business Machines Corp. 2011
-#
-# p1
-#
-# Object Code Only (OCO) source materials
-# Licensed Internal Code Source Materials
-# IBM HostBoot Licensed Internal Code
-#
-# 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.
-#
-# Origin: 30
-#
-# IBM_PROLOG_END
-ROOTPATH = ../../../..
-MODULE = taskargs
-
-OBJS = taskargs.o
-
-include ${ROOTPATH}/config.mk
diff --git a/src/usr/initservice/taskargs/taskargs.C b/src/usr/initservice/taskargs/taskargs.C
deleted file mode 100644
index 75cd7f828..000000000
--- a/src/usr/initservice/taskargs/taskargs.C
+++ /dev/null
@@ -1,162 +0,0 @@
-// IBM_PROLOG_BEGIN_TAG
-// This is an automatically generated prolog.
-//
-// $Source: src/usr/initservice/taskargs/taskargs.C $
-//
-// IBM CONFIDENTIAL
-//
-// COPYRIGHT International Business Machines Corp. 2011
-//
-// p1
-//
-// Object Code Only (OCO) source materials
-// Licensed Internal Code Source Materials
-// IBM HostBoot Licensed Internal Code
-//
-// 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.
-//
-// Origin: 30
-//
-// IBM_PROLOG_END
-
-/**
- * @file taskargs.C
- *
- * common file to hold arguments passed onto tasks.
- * will also hold macros, etc to manage arguments
- *
- * @note Notes on barrier:
- * barrier_init() will initialize the barrier to the number of threads to
- * wait on.
- * "barrier_wait() function shall synchronize participating threads at
- * the barrier referenced by barrier.
- * The calling thread shall block until the required number of threads
- * have called pthread_barrier_wait specifying the barrier."
- *
- * So in this case, the barrier is initialized to 2 (through barrier_init()
- * in the constructor).
- * When InitSvc launches the child, it calls barrier wait() (through
- * waitChildSync() ) which adds 1 task to the "waitlist", blocks, and
- * returns to InitSvc. InitSvc then calls waitParentSync() which adds
- * its' task to the "waitlist". When the second task is added, both task
- * are unblocked.
- *
- * The barrier is destroyed when TaskArgs goes out of scope by calling
- * barrier_destroy() in the destructor.
- *
- */
-
-#include <initservice/taskargs.H>
-
-
-namespace INITSERVICE
-{
-
-extern trace_desc_t *g_trac_initsvc;
-
-
-void TaskArgs::waitParentSync( )
-{
-
- barrier_wait( &iv_sync_barrier);
-
-}
-
-
-void TaskArgs::waitChildSync( )
-{
-
- barrier_wait( &iv_sync_barrier);
-
-}
-
-
-void TaskArgs::postReturnCode( const uint64_t i_returncode )
-{
- iv_taskreturncode = i_returncode;
-
- return;
-}
-
-
-uint64_t TaskArgs::getReturnCode( ) const
-{
-
- return iv_taskreturncode;
-}
-
-
-void TaskArgs::setCommand( const uint64_t i_command )
-{
-
- iv_taskcommand = i_command;
-
- return;
-}
-
-
-uint64_t TaskArgs::getCommand( ) const
-{
-
- return iv_taskcommand;
-}
-
-
-void TaskArgs::postErrorLog( errlHndl_t i_errl )
-{
-
- iv_errl = i_errl;
-}
-
-
-errlHndl_t TaskArgs::getErrorLog( )
-{
- errlHndl_t l_errl = iv_errl;
-
- // null out iv_errl after returning it to someone.
- iv_errl = NULL;
-
- return l_errl;
-}
-
-
-void TaskArgs::clear()
-{
- iv_taskreturncode = 0; // init iv_returncode
- iv_taskcommand = 0; // init iv_command
-
- // this should not happen, should have been handled by the caller(s)
- // commit the errorlog here just to get rid of it
- if ( iv_errl )
- {
- TRACFCOMP( g_trac_initsvc,
- ERR_MRK "ERROR: errorlog %p was left in TaskArgs",
- iv_errl );
-
- errlCommit(iv_errl,INITSVC_COMP_ID);
- }
-
-}
-
-
-TaskArgs::TaskArgs()
-: iv_errl( NULL ), // init errorlog handle to NULL
- iv_taskreturncode(0), // init iv_returncode to undefined
- iv_taskcommand(0) // init iv_command to undefined
-{
- // set barrier to wait for 2 tasks before releasing,
- // see notes above.
- barrier_init( &iv_sync_barrier, 2 );
-}
-
-
-TaskArgs::~TaskArgs()
-{
- clear();
- barrier_destroy( &iv_sync_barrier );
- // add an assert here to check if there is still an errorlog pending?
-}
-
-}; // namespace
diff --git a/src/usr/initservice/test/initservicetest.H b/src/usr/initservice/test/initservicetest.H
index d912a6e88..5cbd77111 100644
--- a/src/usr/initservice/test/initservicetest.H
+++ b/src/usr/initservice/test/initservicetest.H
@@ -32,6 +32,8 @@
#define __TEST_INIT_SERVICETEST_H
+#include <errl/errlentry.H> // errlHndl_t
+#include <errl/errlmanager.H> // errlCommit()
#include <cxxtest/TestSuite.H>
@@ -58,7 +60,7 @@ const INITSERVICE::TaskInfo TASK_TEST1 = {
*
*/
const INITSERVICE::TaskInfo TASK_TEST2 = {
- "libinitsvctasktest2.so" , // taskname
+ "libinitsvctesttask.so" , // taskname
NULL, // ptr to fn
{
INITSERVICE::START_TASK, // startflag=true, try to start
@@ -110,7 +112,7 @@ public:
TS_TRACE( "=====>Run a nonexistent task, expect an ERROR.");
l_errl = l_is.startTask( &TASK_TEST1,
- NULL );
+ NULL );
if ( l_errl )
{
TS_TRACE( "SUCCESS: startTask returned an errorlog.\n");
diff --git a/src/usr/intr/intrrp.C b/src/usr/intr/intrrp.C
index c2531a3ea..224826fc1 100644
--- a/src/usr/intr/intrrp.C
+++ b/src/usr/intr/intrrp.C
@@ -51,16 +51,14 @@ TRAC_INIT(&g_trac_intr, INTR_COMP_NAME, 2 * 1024);
TASK_ENTRY_MACRO( IntrRp::init );
-void IntrRp::init( void * i_taskArgs )
+void IntrRp::init( errlHndl_t &io_errlHndl_t )
{
errlHndl_t err = NULL;
+
err = Singleton<IntrRp>::instance()._init();
- INITSERVICE::TaskArgs* args =
- static_cast<INITSERVICE::TaskArgs*>(i_taskArgs);
- if(err)
- {
- args->postErrorLog(err);
- }
+
+ // pass task error back to parent
+ task_end2( err );
}
diff --git a/src/usr/intr/intrrp.H b/src/usr/intr/intrrp.H
index 3e8c06659..7078f823f 100644
--- a/src/usr/intr/intrrp.H
+++ b/src/usr/intr/intrrp.H
@@ -42,9 +42,9 @@ namespace INTR
/**
* Prepare HW and system to recieve external interrupts
- * @param[in] task args
+ * @param[in] ref to errlHndl_t
*/
- static void init(void * i_taskArgs);
+ static void init( errlHndl_t &io_rtaskRetErrl );
protected:
diff --git a/src/usr/pnor/pnorrp.C b/src/usr/pnor/pnorrp.C
index 40ea0e453..a2175d06b 100644
--- a/src/usr/pnor/pnorrp.C
+++ b/src/usr/pnor/pnorrp.C
@@ -89,16 +89,32 @@ errlHndl_t PNOR::getSectionInfo( PNOR::SectionId i_section,
* STATIC
* @brief Static Initializer
*/
-void PnorRP::init( void* i_taskArgs )
+void PnorRP::init( errlHndl_t &io_rtaskRetErrl )
{
TRACUCOMP(g_trac_pnor, "PnorRP::init> " );
- INITSERVICE::TaskArgs* args =
- static_cast<INITSERVICE::TaskArgs*>(i_taskArgs);
uint64_t rc = 0;
+ errlHndl_t l_errl = NULL;
+
if( Singleton<PnorRP>::instance().didStartupFail(rc) )
{
- args->postReturnCode(rc);
+ /*@ errorlog tag
+ * @errortype ERRL_SEV_CRITICAL_SYS_TERM
+ * @moduleid MOD_PNORRP_DIDSTARTUPFAIL
+ * @reasoncode RC_BAD_STARTUP_RC
+ * @userdata1 return code
+ * @userdata2 0
+ *
+ * @devdesc PNOR startup task returned an error.
+ */
+ l_errl = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM,
+ PNOR::MOD_PNORRP_DIDSTARTUPFAIL,
+ PNOR::RC_BAD_STARTUP_RC,
+ rc,
+ 0 );
}
+
+ task_end2( l_errl );
}
@@ -325,7 +341,7 @@ errlHndl_t PnorRP::readTOC()
// Will update under Story 3871
// assume 1 chip with only 1 side for now, no sideless
- // TOC starts at offset zero
+ // TOC starts at offset zero
// put some random sizes in here
iv_TOC[PNOR::SIDE_A][PNOR::TOC].size = 8 + 8 + PNOR::NUM_SECTIONS*sizeof(TOCEntry_t);
@@ -339,7 +355,7 @@ errlHndl_t PnorRP::readTOC()
iv_TOC[PNOR::SIDE_A][PNOR::HB_EXT_CODE].virtAddr = iv_TOC[PNOR::SIDE_A][PNOR::TOC].virtAddr + iv_TOC[PNOR::SIDE_A][PNOR::TOC].size;
iv_TOC[PNOR::SIDE_A][PNOR::GLOBAL_DATA].virtAddr = iv_TOC[PNOR::SIDE_A][PNOR::HB_EXT_CODE].virtAddr + iv_TOC[PNOR::SIDE_A][PNOR::HB_EXT_CODE].size;
iv_TOC[PNOR::SIDE_A][PNOR::HB_DATA].virtAddr = iv_TOC[PNOR::SIDE_A][PNOR::GLOBAL_DATA].virtAddr + iv_TOC[PNOR::SIDE_A][PNOR::GLOBAL_DATA].size;
- // flash
+ // flash
iv_TOC[PNOR::SIDE_A][PNOR::TOC].flashAddr = 0;
iv_TOC[PNOR::SIDE_A][PNOR::HB_EXT_CODE].flashAddr = iv_TOC[PNOR::SIDE_A][PNOR::TOC].flashAddr + iv_TOC[PNOR::SIDE_A][PNOR::TOC].size;
iv_TOC[PNOR::SIDE_A][PNOR::GLOBAL_DATA].flashAddr = iv_TOC[PNOR::SIDE_A][PNOR::HB_EXT_CODE].flashAddr + iv_TOC[PNOR::SIDE_A][PNOR::HB_EXT_CODE].size;
@@ -354,7 +370,7 @@ errlHndl_t PnorRP::readTOC()
TRACFCOMP(g_trac_pnor, "DATA: size=0x%.8X flash=0x%.8X virt=0x%.16X", iv_TOC[PNOR::SIDE_A][PNOR::HB_DATA].size, iv_TOC[PNOR::SIDE_A][PNOR::HB_DATA].flashAddr, iv_TOC[PNOR::SIDE_A][PNOR::HB_DATA].virtAddr );
//@todo - load flash layout (how many chips)
- //@todo - read TOC on each chip/bank/whatever
+ //@todo - read TOC on each chip/bank/whatever
TRACUCOMP(g_trac_pnor, "< PnorRP::readTOC" );
return l_errhdl;
@@ -392,7 +408,7 @@ void PnorRP::waitForMessage()
eff_addr = (uint8_t*)message->data[0];
user_addr = (uint8_t*)message->data[1];
- //figure out the real pnor offset
+ //figure out the real pnor offset
l_errhdl = computeDeviceAddr( eff_addr, dev_offset, chip_select, needs_ecc );
if( l_errhdl )
{
diff --git a/src/usr/pnor/pnorrp.H b/src/usr/pnor/pnorrp.H
index 6d387c203..97a7fa80c 100644
--- a/src/usr/pnor/pnorrp.H
+++ b/src/usr/pnor/pnorrp.H
@@ -38,9 +38,9 @@ class PnorRP
public:
/**
* @brief Static Initializer
- * @param[in] Task Args pointer passed by init service
+ * @param[in] ref to errlHndl_t
*/
- static void init( void* i_taskArgs );
+ static void init( errlHndl_t &io_rtaskRetErrl );
/**
* @brief Return the size and address of a given section of PNOR data
@@ -89,7 +89,7 @@ class PnorRP
LAST_VADDR = BASE_VADDR + TOTAL_SIZE, /**< End of our VA range */
/** Real number of bytes required to read 1 logical page */
- PAGESIZE_PLUS_ECC = PAGESIZE * (9/8), // 8 bytes of data + 1 byte of ECC
+ PAGESIZE_PLUS_ECC = PAGESIZE * (9/8), // 8 bytes of data + 1 byte of ECC
};
/**
@@ -205,7 +205,7 @@ class PnorRP
* @brief Figure out which section a VA belongs to
*
* @param[in] i_vaddr Virtual address of page
- * @param[out] o_side Which side of the flash
+ * @param[out] o_side Which side of the flash
* @param[out] o_id Which section of PNOR
*
* @return Error if VA is bad
@@ -264,4 +264,4 @@ class PnorRP
};
-#endif
+#endif
diff --git a/src/usr/targeting/attrrp.C b/src/usr/targeting/attrrp.C
index 5bdf42c41..324911778 100644
--- a/src/usr/targeting/attrrp.C
+++ b/src/usr/targeting/attrrp.C
@@ -54,10 +54,10 @@ namespace TARGETING
uint64_t size;
};
- void AttrRP::init(TaskArgs* i_taskArgs)
+ void AttrRP::init( errlHndl_t &io_taskRetErrl )
{
// Call startup on singleton instance.
- Singleton<AttrRP>::instance().startup(i_taskArgs);
+ Singleton<AttrRP>::instance().startup( io_taskRetErrl );
}
void AttrRP::startMsgServiceTask(void* i_instance)
@@ -78,7 +78,7 @@ namespace TARGETING
assert(false);
}
- void AttrRP::startup(TaskArgs* i_taskArgs)
+ void AttrRP::startup( errlHndl_t &io_taskRetErrl )
{
errlHndl_t l_errl = NULL;
@@ -101,18 +101,10 @@ namespace TARGETING
if (l_errl)
{
l_errl->setSev(ERRORLOG::ERRL_SEV_UNRECOVERABLE);
- if (i_taskArgs)
- {
- i_taskArgs->postErrorLog(l_errl);
- }
- else
- {
- TRACFCOMP(g_trac_targeting,
- ERR_MRK "AttrRP: Critical error in startup and no "
- "TaskArgs given by init-service.");
- errlCommit(l_errl,TARG_COMP_ID);
- }
}
+
+ // return any errlogs to _start()
+ io_taskRetErrl = l_errl;
}
void AttrRP::msgServiceTask() const
diff --git a/src/usr/targeting/attrrp.H b/src/usr/targeting/attrrp.H
index 9c338114f..3fc2f6a02 100644
--- a/src/usr/targeting/attrrp.H
+++ b/src/usr/targeting/attrrp.H
@@ -44,13 +44,13 @@ namespace TARGETING
{
public:
/** @brief Initializes and starts the AttrRP daemon.
- * @param[in] i_taskArgs - Pointer to init service arguments.
+ * @param[in,out] - ref to an errHndl_t
*
* @note If any error occurs during initialization, it will be
* reported back through the TaskArgs structure to the init
* service.
*/
- static void init(INITSERVICE::TaskArgs* i_taskArgs);
+ static void init( errlHndl_t &io_taskRetErrl );
protected:
/** @brief Default constructor.
@@ -75,7 +75,7 @@ namespace TARGETING
* init() is a static function that just calls
* Singleton<AttrRP>::instance().startup(). See init for behavior.
*/
- void startup(INITSERVICE::TaskArgs* i_taskArgs);
+ void startup( errlHndl_t &io_taskRetErrl );
/** @brief Daemon thread processing function.
*
diff --git a/src/usr/targeting/targetservice.C b/src/usr/targeting/targetservice.C
index 27b208a47..63c76012b 100644
--- a/src/usr/targeting/targetservice.C
+++ b/src/usr/targeting/targetservice.C
@@ -78,28 +78,23 @@ namespace TARGETING
extern "C"
void _start(void* io_pArgs)
{
- INITSERVICE::TaskArgs *pTaskArgs =
- static_cast<INITSERVICE::TaskArgs *>(io_pArgs);
+ errlHndl_t io_taskRetErrl = NULL;
#define TARG_FN "_start(...)"
TARG_ENTER();
- AttrRP::init(pTaskArgs);
- if (( pTaskArgs ) && (!pTaskArgs->queryErrorLog()))
+ AttrRP::init( io_taskRetErrl );
+
+ if ( io_taskRetErrl == NULL )
{
TargetService& l_targetService = targetService();
(void)l_targetService.init();
}
- TARG_EXIT();
-
- if ( pTaskArgs )
- {
- pTaskArgs->waitChildSync();
- }
+ task_end2( io_taskRetErrl );
- task_end();
+ TARG_EXIT();
#undef TARG_FN
}
diff --git a/src/usr/vfs/vfsrp.C b/src/usr/vfs/vfsrp.C
index be9364965..42a63ea86 100644
--- a/src/usr/vfs/vfsrp.C
+++ b/src/usr/vfs/vfsrp.C
@@ -64,18 +64,15 @@ VfsRp::~VfsRp()
/**
* STATIC initializer of vfs resource provider entry point
*/
-void VfsRp::init( void * i_taskArgs )
+void VfsRp::init( errlHndl_t &io_taskRetErrl )
{
errlHndl_t err = NULL;
+
err = Singleton<VfsRp>::instance()._init();
- INITSERVICE::TaskArgs* args =
- static_cast<INITSERVICE::TaskArgs*>(i_taskArgs);
- if(err)
- {
- args->postErrorLog(err);
- }
-}
+
+ task_end2( err );
+}
// ----------------------------------------------------------------------------
/**
@@ -434,7 +431,7 @@ const char * VfsRp::get_name_from_address(const void * i_vaddr) const
{
module = vfs_find_address(VFS_MODULES,i_vaddr);
}
- if(module)
+ if(module)
{
result = module->module;
}
diff --git a/src/usr/vfs/vfsrp.H b/src/usr/vfs/vfsrp.H
index c57603907..36e9ed1c8 100644
--- a/src/usr/vfs/vfsrp.H
+++ b/src/usr/vfs/vfsrp.H
@@ -47,7 +47,7 @@ namespace VFS
* static init
* @param[in] task args
*/
- static void init(void * i_taskArgs);
+ static void init( errlHndl_t &io_taskRetErrl );
/**
* Get the list of test modules
@@ -126,7 +126,7 @@ namespace VFS
errlHndl_t _init();
/**
- * Message handler
+ * Message handler
*/
void msgHandler();
OpenPOWER on IntegriCloud