diff --git a/src/include/usr/isteps/istep_reasoncodes.H b/src/include/usr/isteps/istep_reasoncodes.H index 167b9dc1cac..e3dd18900c1 100644 --- a/src/include/usr/isteps/istep_reasoncodes.H +++ b/src/include/usr/isteps/istep_reasoncodes.H @@ -55,6 +55,7 @@ namespace ISTEP MOD_VOLTAGE_CONFIG = 0x13, MOD_PM_VERIFY_OCC_CHKPT = 0x14, MOD_UPDATE_REDUNDANT_TPM = 0x15, + MOD_PROC_EXIT_CACHE_CONTAINED = 0x16, }; /** @@ -103,6 +104,7 @@ namespace ISTEP RC_SLAVE_PROC_BACKUP_HASH_READ_FAIL = ISTEP_COMP_ID | 0x26, RC_SLAVE_PROC_CBS_CONTROL_READ_FAIL = ISTEP_COMP_ID | 0x27, RC_PROC_SECURITY_STATE_MISMATCH = ISTEP_COMP_ID | 0x28, + RC_MIN_HW_CHECK_FAILED = ISTEP_COMP_ID | 0x29, }; }; diff --git a/src/usr/isteps/istep14/call_proc_exit_cache_contained.C b/src/usr/isteps/istep14/call_proc_exit_cache_contained.C index 827dfc0d3dd..60cb13285fd 100644 --- a/src/usr/isteps/istep14/call_proc_exit_cache_contained.C +++ b/src/usr/isteps/istep14/call_proc_exit_cache_contained.C @@ -49,6 +49,7 @@ #include #include #include +#include using namespace ISTEP; using namespace ISTEP_ERROR; @@ -83,14 +84,39 @@ void* call_proc_exit_cache_contained (void *io_pArgs) targetService().getTopLevelTarget(l_sys); assert( l_sys != NULL ); - errlHndl_t l_errl = NULL; - uint8_t l_mpipl = l_sys->getAttr(); - ATTR_PAYLOAD_BASE_type payloadBase = 0; + //Check that minimum hardware requirement is meet. + //If not, log error and do not proceed + bool l_bootable; + errlHndl_t l_errl = nullptr; + l_errl = HWAS::checkMinimumHardware(l_sys, &l_bootable); + if (!l_bootable && !l_errl) + { + /*@ + * @errortype ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP::MOD_PROC_EXIT_CACHE_CONTAINED + * @reasoncode ISTEP::RC_MIN_HW_CHECK_FAILED + * @devdesc call_proc_exit_cache_contained: did not + * find minimum hardware to continue + * @custdesc Host firmware did not find enough + * hardware to continue the boot + */ + l_errl = new ERRORLOG::ErrlEntry( + ERRORLOG::ERRL_SEV_UNRECOVERABLE, + ISTEP::MOD_PROC_EXIT_CACHE_CONTAINED, + ISTEP::RC_MIN_HW_CHECK_FAILED); + } + uint8_t l_mpipl = 0; TARGETING::TargetHandleList l_procList; - getAllChips(l_procList, TYPE_PROC); + if (!l_errl) + { + l_mpipl = l_sys->getAttr(); + getAllChips(l_procList, TYPE_PROC); + } + + ATTR_PAYLOAD_BASE_type payloadBase = 0; - if(!l_mpipl) + if(!l_mpipl && !l_errl) { ATTR_PAYLOAD_IN_MIRROR_MEM_type l_mirrored = false;