diff options
author | sachin gupta <sgupta2m@in.ibm.com> | 2013-09-13 06:55:34 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2013-11-05 09:38:25 -0600 |
commit | ecb81160032beec228fe0e85c32b020c4b98113a (patch) | |
tree | 019ab069e5fd6a0fa12c774b6eb08d8bb971afb9 /src/usr/diag/prdf | |
parent | 5255e6862b3dca19deddbf11aa6f8fcedadea348 (diff) | |
download | talos-hostboot-ecb81160032beec228fe0e85c32b020c4b98113a.tar.gz talos-hostboot-ecb81160032beec228fe0e85c32b020c4b98113a.zip |
PRD: CS signature into primary RE attn
RTC: 48856
Change-Id: I6c72d60f7267d2fd646a21d845972ff920e7eb5c
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/6146
Tested-by: Jenkins Server
Reviewed-by: Zane Shelley <zshelle@us.ibm.com>
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/7041
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/diag/prdf')
7 files changed, 126 insertions, 13 deletions
diff --git a/src/usr/diag/prdf/common/framework/config/iipSystem.C b/src/usr/diag/prdf/common/framework/config/iipSystem.C index 6085bd1d8..14229b187 100755 --- a/src/usr/diag/prdf/common/framework/config/iipSystem.C +++ b/src/usr/diag/prdf/common/framework/config/iipSystem.C @@ -259,9 +259,11 @@ void System::Initialize(void) int System::Analyze(STEP_CODE_DATA_STRUCT & serviceData, ATTENTION_TYPE attentionType) { + #define PRDF_FUNC "[System::Analyze] " SYSTEM_DEBUG_CLASS sysdebug; Domain * domainAtAttentionPtr = NULL; ServiceDataCollector * l_saved_sdc = NULL; + ServiceDataCollector * l_temp_sdc = NULL; int rc = (prioritizedDomains.empty() ? NO_DOMAINS_IN_SYSTEM : SUCCESS); int l_saved_rc = 0; @@ -273,6 +275,7 @@ int System::Analyze(STEP_CODE_DATA_STRUCT & serviceData, ATTENTION_TYPE startAttention = attentionType; if((attentionType == MACHINE_CHECK) || (attentionType == UNIT_CS)) startAttention = RECOVERABLE; + ATTENTION_TYPE atnType = startAttention; for(atnType = startAttention; domainAtAttentionPtr == NULL && atnType >= attentionType ; @@ -302,18 +305,48 @@ int System::Analyze(STEP_CODE_DATA_STRUCT & serviceData, if(rc == PRD_POWER_FAULT) { - PRDF_ERR( "System::Analyze() Power Fault detected!" ); + PRDF_ERR( PRDF_FUNC"Power Fault detected!" ); break; } } - } - } - } + else if ( ( attentionType == MACHINE_CHECK ) + && ( atnType != MACHINE_CHECK ) ) + { + // We were asked to analyze MACHINE XTOP, but we found + // another attention and did analyze that. In this case + // we want to add additional signature of MACHINE XSTOP + // attention to error log. + + // l_temp_sdc is not NULL. It is a code bug. Do not do + // anything for error isolation pass. + if ( NULL != l_temp_sdc ) + { + PRDF_ERR( PRDF_FUNC"l_temp_sdc is not NULL" ); + continue; + } + + // Do a setup for error isolation pass for MACHINE + // XTOP. In this pass, we are only interested in + // error signature. + domainAtAttentionPtr = NULL; + l_temp_sdc = new ServiceDataCollector ( + *serviceData.service_data ); + // Set up Error Isolation Pass Flag. + serviceData.service_data->setIsolationOnlyPass(); + // Set the outer for loop iteration variable atnType so + // that we analyze MACHINE XSTOP in next iteration. + atnType = MACHINE_CHECK + 1; + break; + } + + } // end domainAtAttentionPtr != NULL + } // end inner for loop + } // end outer for loop // if ptr is NULL && we don't have a saved SDC than we have noAttns // if ptr is NULL && we have a saved SDC then we have an attn with no-bits-on // otherwise we are done - aready did the analysis - if(domainAtAttentionPtr == NULL) + if ( domainAtAttentionPtr == NULL) { if(l_saved_sdc == NULL) { @@ -326,16 +359,29 @@ int System::Analyze(STEP_CODE_DATA_STRUCT & serviceData, rc = l_saved_rc; } } - //else - //{ - // // mk442956 a Add atnType to CauseAttentionType in sdc - // serviceData.service_data->SetCauseAttentionType(atnType+1); - // rc = domainAtAttentionPtr->Analyze(serviceData, atnType+1); // jp01 - //} + + // l_temp_sdc will not be NULL if we go to ERROR ISOLATION ONLY PASS. + // In that case get the secondary signature and update this. + if ( NULL != l_temp_sdc ) + { + + // We are having only one secondary signature. Secondary signature + // here is mainly used for XSTOP error. XSTOP error can only happen + // on Fabric domain. For fabric domain, we use Fabric sorting which + // will give us first chip which is root cause for the XSTOP error. + // So signature we get after fabric sorting is enough for FFDC + // perspective. + + l_temp_sdc->AddSignatureList( + *( serviceData.service_data->GetErrorSignature() )); + *serviceData.service_data = *l_temp_sdc; + delete l_temp_sdc; + } + if(l_saved_sdc != NULL) delete l_saved_sdc; //dg05a } - + #undef PRDF_FUNC return(rc); } diff --git a/src/usr/diag/prdf/common/framework/resolution/prdfPluginCallResolution.H b/src/usr/diag/prdf/common/framework/resolution/prdfPluginCallResolution.H index 960a052f7..436caa5a7 100755 --- a/src/usr/diag/prdf/common/framework/resolution/prdfPluginCallResolution.H +++ b/src/usr/diag/prdf/common/framework/resolution/prdfPluginCallResolution.H @@ -56,6 +56,12 @@ class PluginCallResolution : public Resolution virtual int32_t Resolve(STEP_CODE_DATA_STRUCT & i_error) { + // In Isolation only pass, we are only interested in error + // signature. So we will not execute plugin resolution as it may + // call some HWP/update VPD etc which is not desired is isolation + // only pass. + if ( i_error.service_data->IsIsolationOnlyPass()) return SUCCESS; + if (NULL == iv_function) { return FAIL; diff --git a/src/usr/diag/prdf/common/framework/service/iipServiceDataCollector.h b/src/usr/diag/prdf/common/framework/service/iipServiceDataCollector.h index 89a24abe9..d15548be2 100755 --- a/src/usr/diag/prdf/common/framework/service/iipServiceDataCollector.h +++ b/src/usr/diag/prdf/common/framework/service/iipServiceDataCollector.h @@ -134,6 +134,14 @@ public: PRDF_SDC_FLAG(FLOODING, 0x00001) PRDF_SDC_FLAGS_MAP_END + /** Defines Analysis pass related properties. + * Flags defined here will be used in framework Analyze leg */ + enum AnalysisFlags + { + /** If this flag is set, We are mainly interested in getting signature + * for attention. */ + PASS_ISOLATION_ONLY = 0x01, + }; #ifndef PRDF_SDC_FLAGS_MAP_ONLY @@ -221,6 +229,15 @@ public: void AddSignatureList(TARGETING::TargetHandle_t i_ptargetHandle =NULL, uint32_t i_signature = 0x00000000); + /** + * @brief Add input signature to signature list. + * @param i_sig Signature Object. + * @note This is a costly operation as it uses reverse lookup from HUID + * to target handle. If possible, use another variant of this + * function which takes TargetHandle_t as input. + */ + void AddSignatureList( ErrorSignature & i_sig ); + /** Access the list of Mrus <ul> @@ -552,6 +569,21 @@ public: */ bool IsFlooding(void) const { return (flags & FLOODING)!=0 ? true:false; } + /** + * @brief returns true if code is in isolation only pass. + */ + bool IsIsolationOnlyPass(void) const { return ( ( analysisFlags & + PASS_ISOLATION_ONLY )!=0 ); } + /** + * @brief Sets isolation only flag. + */ + void setIsolationOnlyPass() { analysisFlags |= PASS_ISOLATION_ONLY ;} + + /** + * @brief Clears isolation only flag. + */ + void clearIsolationOnlyPass() { analysisFlags &= !PASS_ISOLATION_ONLY ;} + /** Set ErrorType for Gard <ul> @@ -764,6 +796,7 @@ private: // Data uint32_t flags; //mp01 c from uint16_t uint8_t hitCount; uint8_t threshold; + uint8_t analysisFlags; TARGETING::TargetHandle_t startingPoint; GardAction::ErrorType errorType; Timer ivCurrentEventTime; diff --git a/src/usr/diag/prdf/common/framework/service/iipServiceDataCollector.inl b/src/usr/diag/prdf/common/framework/service/iipServiceDataCollector.inl index 9fc74b204..dc6fc2a21 100755 --- a/src/usr/diag/prdf/common/framework/service/iipServiceDataCollector.inl +++ b/src/usr/diag/prdf/common/framework/service/iipServiceDataCollector.inl @@ -37,6 +37,7 @@ ServiceDataCollector::ServiceDataCollector() : flags(TRACKIT | LOGIT), hitCount(0), threshold(0), + analysisFlags(0), startingPoint(NULL), errorType(GardAction::NoGard), ivpDumpRequestChipHandle(NULL), diff --git a/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C b/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C index 250c0377a..984258f94 100644 --- a/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C +++ b/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C @@ -290,8 +290,11 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, } else { + ErrorSignature secSig = *(sdc.GetErrorSignature()); //set the sdc to the Saved SDC for UE sdc = sdcBuffer; + // Add secondary signature + sdc.AddSignatureList( secSig ); gardErrType = HWAS::GARD_Func; causeAttnPreviouslyReported = true; } @@ -305,8 +308,11 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, } else { + ErrorSignature secSig = *(sdc.GetErrorSignature()); //set the sdc to the Saved SDC for SUE sdc = sdcBuffer; + // Add secondary signature + sdc.AddSignatureList( secSig ); gardErrType = HWAS::GARD_Func; causeAttnPreviouslyReported = true; } diff --git a/src/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C b/src/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C index 5868c8a4b..7335991b5 100755 --- a/src/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C +++ b/src/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C @@ -194,6 +194,26 @@ void ServiceDataCollector::AddSignatureList( TargetHandle_t i_target, //------------------------------------------------------------------------------ +void ServiceDataCollector::AddSignatureList( ErrorSignature & i_sig ) +{ + #define PRDF_FUNC "[ServiceDataCollector::AddSignatureList] " + + TARGETING::TargetHandle_t tgt = PlatServices::getTarget( + i_sig.getChipId()); + + if ( NULL != tgt ) + { + AddSignatureList( tgt, i_sig.getSigId() ); + } + else + { + PRDF_ERR( PRDF_FUNC"Failed to get target Handle for " + "chip:0x%08X", i_sig.getChipId() ); + } + #undef PRDF_FUNC +} +//------------------------------------------------------------------------------ + TARGETING::TargetHandle_t ServiceDataCollector::getTargetAnalyzed( ) { ExtensibleChip * l_pChipAnalyzed = getChipAnalyzed(); diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfP8Mcs.C b/src/usr/diag/prdf/common/plat/pegasus/prdfP8Mcs.C index 8fe8a2999..5fa8f905c 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfP8Mcs.C +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfP8Mcs.C @@ -154,7 +154,8 @@ int32_t PostAnalysis( ExtensibleChip * i_mcsChip, { int32_t l_rc = SUCCESS; - if ( i_sc.service_data->GetFlag(ServiceDataCollector::UNIT_CS) ) + if ( i_sc.service_data->GetFlag(ServiceDataCollector::UNIT_CS) && + (CHECK_STOP != i_sc.service_data->GetAttentionType()) ) { P8McsDataBundle * mcsdb = getMcsDataBundle( i_mcsChip ); ExtensibleChip * membChip = mcsdb->getMembChip(); |