errlHndl_t main( ATTENTION_VALUE_TYPE i_attentionType, const AttnList & i_attnList ) { PRDF_ENTER( "PRDF::main() Global attnType=%04X", i_attentionType ); // will unlock when going out of scope PRDF_SYSTEM_SCOPELOCK; g_prd_errlHndl = NULL; uint32_t rc = SUCCESS; // clears all the chips saved to stack during last analysis ServiceDataCollector::clearChipStack(); if(( g_initialized == false)&&(NULL ==systemPtr)) { g_prd_errlHndl = noLock_initialize(); if(g_prd_errlHndl != NULL) rc = PRD_NOT_INITIALIZED; } ServiceDataCollector serviceData; STEP_CODE_DATA_STRUCT sdc; sdc.service_data = &serviceData; SYSTEM_DEBUG_CLASS sysdebug; sysdebug.Reinitialize(i_attnList); //Refresh sysdebug with latest Attn data //////////////////////////////////////////////////////////////////////////// // Normalize global attn type (ie 11,12,13,....) to (CHECKSTOP, RECOVERED, // SPECIAL..) //////////////////////////////////////////////////////////////////////////// if ( i_attentionType == INVALID_ATTENTION_TYPE || i_attentionType >= END_ATTENTION_TYPE ) { rc = PRD_INVALID_ATTENTION_TYPE; PRDF_ERR( "PrdMain: Invalid attention type! Global:%x", i_attentionType ); i_attentionType = RECOVERABLE; // This will prevent RAS service problems } // link to the right service Generator ServiceGeneratorClass & serviceGenerator = ServiceGeneratorClass::ThisServiceGenerator(); // Initialize the SDC error log. Required for GenerateSrcPfa() call below. serviceGenerator.createInitialErrl( i_attentionType ); // check for something wrong if ( g_initialized == false || rc != SUCCESS || systemPtr == NULL ) { if(rc == SUCCESS) { rc = PRD_NOT_INITIALIZED; } PRDF_ERR("PrdMain: PRD failed. RC=%x",rc ); // we are not going to do an analysis - so fill out the Service Data (serviceData.GetErrorSignature())->setSigId(rc); serviceData.SetCallout(SP_CODE); serviceData.SetThresholdMaskId(0); // Sets AT_THRESHOLD, DEGRADED, // SERVICE_CALL } else // do the analysis { // flush Cache so that SCR reads access hardware RegDataCache::getCachedRegisters().flush(); serviceData.SetAttentionType(i_attentionType); // capture time of day serviceGenerator.SetErrorTod( i_attentionType, serviceData ); if(serviceGenerator.QueryLoggingBufferFull()) { serviceData.SetFlooding(); } int32_t analyzeRc = systemPtr->Analyze(sdc, i_attentionType); // flush Cache to free up the memory RegDataCache::getCachedRegisters().flush(); ScanFacility & l_scanFac = ScanFacility::Access(); //delete all the wrapper register objects since these were created //just for plugin code l_scanFac.ResetPluginRegister(); SystemSpecific::postAnalysisWorkarounds(sdc); if(analyzeRc != SUCCESS && g_prd_errlHndl == NULL) { // We have a bad RC, but no error log - Fill out SDC and have // service generator make one (serviceData.GetErrorSignature())->setErrCode( (uint16_t)analyzeRc ); serviceData.SetCallout(SP_CODE); serviceData.SetServiceCall(); // We don't want to gard unless we have a good // return code serviceData.Gard(GardAction::NoGard); } } if(g_prd_errlHndl != NULL) { PRDF_INF("PRDTRACE: PrdMain: g_prd_errlHndl != NULL"); PRDF_ADD_PROCEDURE_CALLOUT( g_prd_errlHndl, SRCI_PRIORITY_MED, EPUB_PRC_SP_CODE ); // This forces any previous errls to be committed g_prd_errlHndl = NULL; // pw 597903 -- Don't GARD if we got a global error. serviceData.Gard(GardAction::NoGard); } g_prd_errlHndl = serviceGenerator.GenerateSrcPfa( i_attentionType, serviceData ); // Sleep for 20msec to let attention lines settle if we are at threshold. if ( (g_prd_errlHndl == NULL) && serviceData.IsAtThreshold() ) { PlatServices::milliSleep( 0, 20 ); } RasServices::SetTerminateOnCheckstop(true); PRDF_EXIT( "PRDF::main()" ); return(g_prd_errlHndl.release()); }
void ErrDataService::initPfaData( const ServiceDataCollector & i_sdc, uint32_t i_attnType, bool i_deferDeconfig, uint32_t i_errlAct, uint32_t i_errlSev, uint32_t i_gardPolicy, PfaData & o_pfa, TargetHandle_t & o_dumpTrgt ) { // Dump info o_pfa.msDumpLabel[0] = 0x4D532020; // Start of MS Dump flags o_pfa.msDumpLabel[1] = 0x44554D50; // 'MS DUMP' hwTableContent dumpContent; i_sdc.GetDumpRequest( dumpContent, o_dumpTrgt ); o_pfa.msDumpInfo.content = dumpContent; o_pfa.msDumpInfo.id = getHuid(o_dumpTrgt); // Error log actions and severity o_pfa.errlActions = i_errlAct; o_pfa.errlSeverity = i_errlSev; // PRD Service Data Collector Flags (1:true, 0:false) o_pfa.DUMP = i_sdc.IsDump() ? 1 : 0; o_pfa.UERE = i_sdc.IsUERE() ? 1 : 0; o_pfa.SUE = i_sdc.IsSUE() ? 1 : 0; o_pfa.AT_THRESHOLD = i_sdc.IsAtThreshold() ? 1 : 0; o_pfa.DEGRADED = i_sdc.IsDegraded() ? 1 : 0; o_pfa.SERVICE_CALL = i_sdc.queryServiceCall() ? 1 : 0; o_pfa.TRACKIT = i_sdc.IsMfgTracking() ? 1 : 0; o_pfa.TERMINATE = i_sdc.Terminate() ? 1 : 0; o_pfa.LOGIT = i_sdc.queryLogging() ? 1 : 0; o_pfa.UNIT_CHECKSTOP = i_sdc.IsUnitCS() ? 1 : 0; o_pfa.LAST_CORE_TERMINATE = 0; // Will be set later, if needed. o_pfa.USING_SAVED_SDC = i_sdc.IsUsingSavedSdc() ? 1 : 0; o_pfa.DEFER_DECONFIG = i_deferDeconfig ? 1 : 0; o_pfa.SECONDARY_ERROR = i_sdc.isSecondaryErrFound() ? 1 : 0; // Thresholding o_pfa.errorCount = i_sdc.GetHits(); o_pfa.threshold = i_sdc.GetThreshold(); // Misc o_pfa.serviceActionCounter = iv_serviceActionCounter; o_pfa.globalGardPolicy = i_gardPolicy; // Attention types o_pfa.priAttnType = i_attnType; o_pfa.secAttnType = i_sdc.getSecondaryAttnType(); // Initialize the MRU count to 0. Callouts will be added to the PFA data // when callouts are added to the error log. o_pfa.mruListCount = 0; // Build the signature list into PFA data const PRDF_SIGNATURES & sigList = i_sdc.getSignatureList(); uint32_t i = 0; for ( i = 0; i < sigList.size() && i < SigListLIMIT; i++ ) { o_pfa.sigList[i].chipId = getHuid(sigList[i].target); o_pfa.sigList[i].signature = sigList[i].signature; } o_pfa.sigListCount = i; }
errlHndl_t main( ATTENTION_VALUE_TYPE i_attentionType, const AttnList & i_attnList ) { PRDF_ENTER( "PRDF::main() Global attnType=%04X", i_attentionType ); // These have to be outside of system scope lock errlHndl_t retErrl = NULL; bool initiateHwudump = false; TARGETING::TargetHandle_t dumpTrgt = NULL; errlHndl_t dumpErrl = NULL; uint32_t dumpErrlActions = 0; { // system scope lock starts ------------------------------------------ // will unlock when going out of scope PRDF_SYSTEM_SCOPELOCK; g_prd_errlHndl = NULL; uint32_t rc = SUCCESS; // clears all the chips saved to stack during last analysis ServiceDataCollector::clearChipStack(); if(( g_initialized == false)&&(NULL ==systemPtr)) { g_prd_errlHndl = noLock_initialize(); if(g_prd_errlHndl != NULL) rc = PRD_NOT_INITIALIZED; } ServiceDataCollector serviceData; STEP_CODE_DATA_STRUCT sdc; sdc.service_data = &serviceData; SYSTEM_DEBUG_CLASS sysdebug; sysdebug.Reinitialize(i_attnList); //Refresh sysdebug with latest Attn data //////////////////////////////////////////////////////////////////////////// // Normalize global attn type (ie 11,12,13,....) to (CHECKSTOP, RECOVERED, // SPECIAL..) //////////////////////////////////////////////////////////////////////////// if ( i_attentionType == INVALID_ATTENTION_TYPE || i_attentionType >= END_ATTENTION_TYPE ) { rc = PRD_INVALID_ATTENTION_TYPE; PRDF_ERR( "PrdMain: Invalid attention type! Global:%x", i_attentionType ); i_attentionType = RECOVERABLE; // This will prevent RAS service problems } // link to the right service Generator ServiceGeneratorClass & serviceGenerator = ServiceGeneratorClass::ThisServiceGenerator(); // Initialize the SDC error log. Required for GenerateSrcPfa() call below. serviceGenerator.createInitialErrl( i_attentionType ); // check for something wrong if ( g_initialized == false || rc != SUCCESS || systemPtr == NULL ) { if(rc == SUCCESS) { rc = PRD_NOT_INITIALIZED; } PRDF_ERR("PrdMain: PRD failed. RC=%x",rc ); // we are not going to do an analysis - so fill out the Service Data (serviceData.GetErrorSignature())->setSigId(rc); serviceData.SetCallout(SP_CODE); serviceData.SetCallout( NextLevelSupport_ENUM, MRU_LOW ); serviceData.SetThresholdMaskId(0); // Sets AT_THRESHOLD, DEGRADED, // SERVICE_CALL } else // do the analysis { // flush Cache so that SCR reads access hardware RegDataCache::getCachedRegisters().flush(); serviceData.setPrimaryAttnType(i_attentionType); // Set the time in which PRD handled the error. Timer timeOfError; PlatServices::getCurrentTime( timeOfError ); serviceData.SetTOE( timeOfError ); ServiceDataCollector l_tempSdc = serviceData; l_tempSdc.setPrimaryPass(); sdc.service_data = &l_tempSdc; int32_t analyzeRc = systemPtr->Analyze( sdc, i_attentionType ); if( PRD_SCAN_COMM_REGISTER_ZERO == analyzeRc ) { // So, the first pass has failed. Hence, there are no primary // bits set. We must start second pass to see if there are any //secondary bits set. sdc.service_data = &serviceData; #if !defined(__HOSTBOOT_MODULE) && !defined(__HOSTBOOT_RUNTIME) ForceSyncAnalysis( l_tempSdc ); // save SDC till end of primary pass #endif // starting the second pass PRDF_INF( "PRDF::main() No bits found set in first pass," " starting second pass" ); sysdebug.initAttnPendingtatus( ); //for the second pass if( l_tempSdc.isSecondaryErrFound() ) { sdc.service_data->setSecondaryErrFlag(); } analyzeRc = systemPtr->Analyze( sdc, i_attentionType ); // merging capture data of primary pass with capture data of // secondary pass for better FFDC. serviceData.GetCaptureData().mergeData( l_tempSdc.GetCaptureData()); #if !defined(__HOSTBOOT_MODULE) && !defined(__HOSTBOOT_RUNTIME) // save SDC till end of secondary pass ForceSyncAnalysis( serviceData ); #endif } else { serviceData = l_tempSdc; sdc.service_data = &serviceData; } // flush Cache to free up the memory RegDataCache::getCachedRegisters().flush(); ScanFacility & l_scanFac = ScanFacility::Access(); //delete all the wrapper register objects since these were created //just for plugin code l_scanFac.ResetPluginRegister(); if(analyzeRc != SUCCESS && g_prd_errlHndl == NULL) { (serviceData.GetErrorSignature())->setErrCode( (uint16_t)analyzeRc ); serviceData.SetCallout(SP_CODE); serviceData.SetCallout( NextLevelSupport_ENUM, MRU_LOW ); serviceData.SetServiceCall(); // We don't want to gard unless we have a good // return code serviceData.Gard(GardAction::NoGard); } } if(g_prd_errlHndl != NULL) { PRDF_INF("PRDTRACE: PrdMain: g_prd_errlHndl != NULL"); PRDF_ADD_PROCEDURE_CALLOUT( g_prd_errlHndl, SRCI_PRIORITY_MED, EPUB_PRC_SP_CODE ); // This is a precautionary step. There is a possibilty that if // severity for g_prd_errlHndl is Predictve and there is only // EPUB_PRC_SP_CODE callout than it will be changed to tracing event. // So adding EPUB_PRC_LVL_SUPP to avoid this. PRDF_ADD_PROCEDURE_CALLOUT( g_prd_errlHndl, SRCI_PRIORITY_LOW, EPUB_PRC_LVL_SUPP ); // This forces any previous errls to be committed g_prd_errlHndl = NULL; // pw 597903 -- Don't GARD if we got a global error. serviceData.Gard(GardAction::NoGard); } g_prd_errlHndl = serviceGenerator.GenerateSrcPfa( i_attentionType, serviceData, initiateHwudump, dumpTrgt, dumpErrl, dumpErrlActions); // Sleep for 20msec to let attention lines settle if we are at threshold. if ( (g_prd_errlHndl == NULL) && serviceData.IsAtThreshold() ) { PlatServices::milliSleep( 0, 20 ); } retErrl = g_prd_errlHndl.release(); } // system scope lock ends ------------------------------------------ if ( true == initiateHwudump ) { PlatServices::initiateUnitDump( dumpTrgt, dumpErrl, dumpErrlActions ); } PRDF_EXIT( "PRDF::main()" ); return retErrl; }