diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/include/usr/hwas/common/hwas_reasoncodes.H | 1 | ||||
-rw-r--r-- | src/usr/hwas/hostbootIstep.C | 57 |
2 files changed, 46 insertions, 12 deletions
diff --git a/src/include/usr/hwas/common/hwas_reasoncodes.H b/src/include/usr/hwas/common/hwas_reasoncodes.H index e8f08125f..23693d65b 100644 --- a/src/include/usr/hwas/common/hwas_reasoncodes.H +++ b/src/include/usr/hwas/common/hwas_reasoncodes.H @@ -30,6 +30,7 @@ namespace HWAS MOD_DECONFIG_GARD = 0x01, MOD_PROCESS_CALLOUT = 0x02, MOD_HOST_DISCOVER_TARGETS = 0x03, + MOD_HOST_GARD = 0x04, }; enum HwasReasonCode diff --git a/src/usr/hwas/hostbootIstep.C b/src/usr/hwas/hostbootIstep.C index 4e5b900de..9205e03fc 100644 --- a/src/usr/hwas/hostbootIstep.C +++ b/src/usr/hwas/hostbootIstep.C @@ -87,10 +87,7 @@ void* host_discover_targets( void *io_pArgs ) // Check whether we're in MPIPL mode using namespace TARGETING; Target* l_pTopLevel = NULL; - uint8_t l_attrIsMpipl = 0; - - TargetService& l_targetService = targetService(); - l_targetService.getTopLevelTarget( l_pTopLevel ); + targetService().getTopLevelTarget( l_pTopLevel ); if( l_pTopLevel == NULL ) { @@ -111,20 +108,16 @@ void* host_discover_targets( void *io_pArgs ) } else { - l_attrIsMpipl = l_pTopLevel->getAttr<ATTR_IS_MPIPL_HB> (); - - if (l_attrIsMpipl) + if (l_pTopLevel->getAttr<ATTR_IS_MPIPL_HB>()) { - TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "MPIPL mode" ); + TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "MPIPL mode"); // Sync attributes from Fsp errl = syncAllAttributesFromFsp(); } else { - TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "Normal IPL mode" ); + TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "Normal IPL mode"); errl = discoverTargets(); } @@ -143,8 +136,48 @@ void* host_gard( void *io_pArgs ) { TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "host_gard entry" ); - errlHndl_t errl = collectGard(); + errlHndl_t errl; + + // Check whether we're in MPIPL mode + using namespace TARGETING; + Target* l_pTopLevel = NULL; + targetService().getTopLevelTarget( l_pTopLevel ); + + if( l_pTopLevel == NULL ) + { + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "Top level handle was NULL" ); + + /*@ + * @errortype + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid HWAS::MOD_HOST_GARD + * @reasoncode HWAS::RC_TOP_LEVEL_TARGET_NULL + * @devdesc Call to get top level targeting handle + * returned NULL + */ + errl = hwasError( ERRORLOG::ERRL_SEV_UNRECOVERABLE, + HWAS::MOD_HOST_GARD, + HWAS::RC_TOP_LEVEL_TARGET_NULL ); + } + else + { + if (l_pTopLevel->getAttr<ATTR_IS_MPIPL_HB>()) + { + TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "MPIPL mode"); + + // we only want EX units to be processed + TARGETING::PredicateCTM l_exFilter(TARGETING::CLASS_UNIT, + TARGETING::TYPE_EX); + errl = collectGard(&l_exFilter); + } + else + { + TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "Normal IPL mode"); + errl = collectGard(); + } + } TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "host_gard exit" ); return errl; |