summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf
diff options
context:
space:
mode:
authorsachin gupta <sgupta2m@in.ibm.com>2013-09-13 06:55:34 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2013-11-05 09:38:25 -0600
commitecb81160032beec228fe0e85c32b020c4b98113a (patch)
tree019ab069e5fd6a0fa12c774b6eb08d8bb971afb9 /src/usr/diag/prdf
parent5255e6862b3dca19deddbf11aa6f8fcedadea348 (diff)
downloadtalos-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')
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/config/iipSystem.C70
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/resolution/prdfPluginCallResolution.H6
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/service/iipServiceDataCollector.h33
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/service/iipServiceDataCollector.inl1
-rw-r--r--src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C6
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C20
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfP8Mcs.C3
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();
OpenPOWER on IntegriCloud