summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Phan <cphan@us.ibm.com>2014-09-05 11:45:02 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2014-09-08 15:14:53 -0500
commit8a7a58075ab919f2bbd599e5e749fd274e0b9218 (patch)
treee577a7d7a31d62524030d5f2eb0566373f3f3cdf
parent64a4cc44eec52438c34e0f718b3901e2e2b2a7bf (diff)
downloadblackbird-hostboot-8a7a58075ab919f2bbd599e5e749fd274e0b9218.tar.gz
blackbird-hostboot-8a7a58075ab919f2bbd599e5e749fd274e0b9218.zip
PRD: release system lock before initiating hwudump
Change-Id: I706348607d29f465bc1647b53fa6cfbf73c1af10 CQ: SW275135 Backport: release-fips811 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/13158 Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com> Tested-by: Jenkins Server Reviewed-by: Zane Shelley <zshelle@us.ibm.com> Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/13167
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H11
-rw-r--r--src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C63
-rw-r--r--src/usr/diag/prdf/common/framework/service/prdfRasServices_common.H29
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/service/xspprdService.h29
-rwxr-xr-xsrc/usr/diag/prdf/common/prdfMain_common.C27
-rw-r--r--src/usr/diag/prdf/framework/service/prdfPlatServices.C14
-rw-r--r--src/usr/diag/prdf/framework/service/prdfRasServices.C8
-rwxr-xr-xsrc/usr/diag/prdf/test/prdfsimRasServices.C18
-rwxr-xr-xsrc/usr/diag/prdf/test/prdfsimRasServices.H33
9 files changed, 179 insertions, 53 deletions
diff --git a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H
index 5b0f4f1e5..57a455751 100755
--- a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H
+++ b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H
@@ -141,6 +141,17 @@ bool isSmpCoherent();
*/
bool isSapphireRunning( );
+/**
+ * @brief Initiate hwudump.
+ * @param i_target target handle.
+ * @param i_errl error handle
+ * @param i_errlActions error action flags
+ */
+void initiateUnitDump( TARGETING::TargetHandle_t i_target,
+ errlHndl_t i_errl,
+ uint32_t i_errlActions);
+
+
//##############################################################################
//## Processor specific functions
//##############################################################################
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 598ffd80d..99dd14325 100644
--- a/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C
+++ b/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C
@@ -172,16 +172,28 @@ void RasServices::SaveRcForSrc(int32_t the_rc)
//------------------------------------------------------------------------------
errlHndl_t RasServices::GenerateSrcPfa( ATTENTION_TYPE i_attnType,
- ServiceDataCollector & i_sdc )
+ ServiceDataCollector & i_sdc,
+ bool & o_initiateHwudump,
+ TargetHandle_t & o_dumpTrgt,
+ errlHndl_t & o_dumpErrl,
+ uint32_t & o_dumpErrlActions)
{
- return iv_ErrDataService->GenerateSrcPfa( i_attnType, i_sdc );
+ return iv_ErrDataService->GenerateSrcPfa( i_attnType, i_sdc,
+ o_initiateHwudump,
+ o_dumpTrgt,
+ o_dumpErrl,
+ o_dumpErrlActions);
}
//------------------------------------------------------------------------------
errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType,
- ServiceDataCollector & i_sdc )
+ ServiceDataCollector & i_sdc,
+ bool & o_initiateHwudump,
+ TargetHandle_t & o_dumpTrgt,
+ errlHndl_t & o_dumpErrl,
+ uint32_t & o_dumpErrlActions)
{
#define PRDF_FUNC "[ErrDataService::GenerateSrcPfa] "
@@ -708,6 +720,9 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType,
initPfaData( sdc, i_attnType, deferDeconfig, actionFlag, severityParm,
prdGardErrType, pfaData, dumpTrgt );
+ // set returned dump target
+ o_dumpTrgt = dumpTrgt;
+
//**************************************************************
// Check for Terminating the system for non mnfg conditions.
//**************************************************************
@@ -793,7 +808,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType,
// deconfiguration, dump/FFDC collection, etc.
if ( sdc.IsUnitCS() && !sdc.IsUsingSavedSdc() )
{
- handleUnitCS( dumpTrgt );
+ handleUnitCS( dumpTrgt, o_initiateHwudump );
}
// Commit the Error log
@@ -802,24 +817,38 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType,
// for FSP specific SRC handling in the future
MnfgTrace( esig, pfaData );
- PRDF_HW_COMMIT_ERRL( iv_errl, actionFlag );
- if ( NULL != iv_errl )
+ if ( true == o_initiateHwudump )
+ {
+ // the dump log will be deleted later in PRDF::main
+ // after the hwudump is initiated there.
+ o_dumpErrl = iv_errl;
+ iv_errl = NULL;
+ o_dumpErrlActions = actionFlag;
+ PRDF_TRAC( PRDF_FUNC"for target: 0x%08x, i_errl: 0x%08x, "
+ "i_errlActions: 0x%08x", getHuid(o_dumpTrgt),
+ ERRL_GETRC_SAFE(o_dumpErrl), o_dumpErrlActions );
+ }
+ else
{
- // Just commit the log.
- uint32_t dumpPlid = 0;
- PRDF_GET_PLID(iv_errl, dumpPlid);
+ PRDF_HW_COMMIT_ERRL( iv_errl, actionFlag );
+ if ( NULL != iv_errl )
+ {
+ // Just commit the log.
+ uint32_t dumpPlid = 0;
+ PRDF_GET_PLID(iv_errl, dumpPlid);
- uint32_t l_rc = 0;
- PRDF_GET_RC(iv_errl, l_rc);
+ uint32_t l_rc = 0;
+ PRDF_GET_RC(iv_errl, l_rc);
- uint16_t l_reasonCode = 0;
- PRDF_GET_REASONCODE(iv_errl, l_reasonCode);
+ uint16_t l_reasonCode = 0;
+ PRDF_GET_REASONCODE(iv_errl, l_reasonCode);
- PRDF_INF( PRDF_FUNC"Committing error log: PLID=%.8X, "
- "ReasonCode=%.8X, RC=%.8X, actions=%.4X",
- dumpPlid, l_reasonCode, l_rc, actionFlag );
+ PRDF_INF( PRDF_FUNC"Committing error log: PLID=%.8X, "
+ "ReasonCode=%.8X, RC=%.8X, actions=%.4X",
+ dumpPlid, l_reasonCode, l_rc, actionFlag );
- PRDF_COMMIT_ERRL(iv_errl, actionFlag);
+ PRDF_COMMIT_ERRL(iv_errl, actionFlag);
+ }
}
}
// If the Error Log is not committed (as due to a Terminate condtion),
diff --git a/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.H b/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.H
index a5051f82d..919fe8804 100644
--- a/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.H
+++ b/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.H
@@ -82,13 +82,22 @@ class ErrDataService
@brief Create an SRC, PFA data, and Error log for the ServiceData provided
@param[in] attn_type (see iipsdbug.h)
@param[in,out] sdc (see iipServiceData.h)
+ @param[out] o_initiateHwudump whether or not to initiate hwudump
+ @param[out] o_dumpTrgt The DUMP target
+ @param[out] o_dumpErrl The DUMP error handle
+ @param[out] o_dumpErrlActions DUMP error action flags
@return Error Log - Null if successfully committed
@pre SetErrorTod()?
@post Error log(s) build and logged, SRC built, etc.
@exception None.
@note
*/
- virtual errlHndl_t GenerateSrcPfa(ATTENTION_TYPE attn_type, ServiceDataCollector & sdc);
+ virtual errlHndl_t GenerateSrcPfa(ATTENTION_TYPE attn_type,
+ ServiceDataCollector & sdc,
+ bool & o_initiateHwudump,
+ TARGETING::TargetHandle_t & o_dumpTrgt,
+ errlHndl_t & o_dumpErrl,
+ uint32_t & o_dumpErrlActions );
/**
@brief Set the TOD of the current error
@@ -250,8 +259,10 @@ class ErrDataService
/**
* @brief Handles unit checkstops.
* @param i_unitCsTarget chip(let) target.
+ * @param o_initiateHwudump whether or not to initiate hwudump
*/
- void handleUnitCS( TARGETING::TargetHandle_t i_unitCsTarget );
+ void handleUnitCS( TARGETING::TargetHandle_t i_unitCsTarget,
+ bool & o_initiateHwudump );
/**
* @brief Handles Centaur checkstop.
@@ -262,8 +273,10 @@ class ErrDataService
/**
* @brief Handles Core checkstop.
* @param i_exTarget EX target.
+ * @param o_initiateHwudump whether or not to initiate hwudump
*/
- void handleCoreUnitCS( TARGETING::TargetHandle_t i_exTarget );
+ void handleCoreUnitCS( TARGETING::TargetHandle_t i_exTarget,
+ bool & o_initiateHwudump );
/**
* @brief Handles NX checkstops.
@@ -348,13 +361,21 @@ public:
@brief Create an SRC, PFA data, and Error log for the ServiceData provided
@param[in] attn_type (see iipsdbug.h)
@param[in,out] sdc (see iipServiceData.h)
+ @param[out] o_initiateHwudump whether or not to initiate hwudump
+ @param[out] o_dumpTrgt The DUMP target.
+ @param[out] o_dumpErrl The DUMP error handle
+ @param[out] o_dumpErrlActions DUMP error action flags
@return Error Log - Null if successfully committed
@pre SetErrorTod()?
@post Error log(s) build and logged, SRC built, etc.
@exception None.
*/
virtual errlHndl_t GenerateSrcPfa( ATTENTION_TYPE attn_type,
- ServiceDataCollector & sdc );
+ ServiceDataCollector & sdc,
+ bool & o_initiateHwudump,
+ TARGETING::TargetHandle_t & o_dumpTrgt,
+ errlHndl_t & o_dumpErrl,
+ uint32_t & o_dumpErrlActions );
static void SetTerminateOnCheckstop(bool setting)
{
diff --git a/src/usr/diag/prdf/common/framework/service/xspprdService.h b/src/usr/diag/prdf/common/framework/service/xspprdService.h
index f0fac81f7..b2119f378 100755
--- a/src/usr/diag/prdf/common/framework/service/xspprdService.h
+++ b/src/usr/diag/prdf/common/framework/service/xspprdService.h
@@ -163,19 +163,24 @@ public:
virtual void SaveRcForSrc(int32_t the_rc)=0;
/**
- Create an SRC, PFA data, and Error log for the ServiceData provided
- <ul>
- <br><b>Parameter: </b> attn_type (see iipsdbug.h)
- <br><b>Parameter: </b> sdc (see iipServiceData.h)
- <br><b>Returns: </b> Error Log - Null if successfully committed
- <br><b>Requirements:</b> SetErrorTod()?
- <br><b>Promises: </b> Error log(s) build and logged, SRC built, etc.
- <br><b>Exceptions: </b> None.
- <br><b>Notes: </b>
- </ul><br>
+ @brief Create an SRC, PFA data, and Error log for the ServiceData provided
+ @param[in] attn_type (see iipsdbug.h)
+ @param[in,out] sdc (see iipServiceData.h)
+ @param[out] o_initiateHwudump whether or not to initiate hwudump
+ @param[out] o_dumpTrgt The DUMP target.
+ @param[out] o_dumpErrl The DUMP error handle
+ @param[out] o_dumpErrlActions DUMP error action flags
+ @return Error Log - Null if successfully committed
+ @pre SetErrorTod()?
+ @post Error log(s) build and logged, SRC built, etc.
+ @exception None.
*/
-
- virtual errlHndl_t GenerateSrcPfa(ATTENTION_TYPE attn_type, ServiceDataCollector & sdc)=0; // mp01 c
+ virtual errlHndl_t GenerateSrcPfa(ATTENTION_TYPE attn_type,
+ ServiceDataCollector & sdc,
+ bool & o_initiateHwudump,
+ TARGETING::TargetHandle_t & o_dumpTrgt,
+ errlHndl_t & o_dumpErrl,
+ uint32_t & o_dumpErrlActions )=0;
/**
* @brief Create initial error log for analyze( attn analysis) code flow.
diff --git a/src/usr/diag/prdf/common/prdfMain_common.C b/src/usr/diag/prdf/common/prdfMain_common.C
index f7a1d40be..1546316af 100755
--- a/src/usr/diag/prdf/common/prdfMain_common.C
+++ b/src/usr/diag/prdf/common/prdfMain_common.C
@@ -174,6 +174,15 @@ errlHndl_t main( ATTENTION_VALUE_TYPE i_attentionType,
{
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;
@@ -282,7 +291,11 @@ errlHndl_t main( ATTENTION_VALUE_TYPE i_attentionType,
}
g_prd_errlHndl = serviceGenerator.GenerateSrcPfa( i_attentionType,
- serviceData );
+ 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() )
@@ -292,9 +305,19 @@ errlHndl_t main( ATTENTION_VALUE_TYPE i_attentionType,
RasServices::SetTerminateOnCheckstop(true);
+ retErrl = g_prd_errlHndl.release();
+
+ } // system scope lock ends ------------------------------------------
+
+
+ if ( true == initiateHwudump )
+ {
+ PlatServices::initiateUnitDump( dumpTrgt, dumpErrl, dumpErrlActions );
+ }
+
PRDF_EXIT( "PRDF::main()" );
- return(g_prd_errlHndl.release());
+ return retErrl;
}
//------------------------------------------------------------------------------
diff --git a/src/usr/diag/prdf/framework/service/prdfPlatServices.C b/src/usr/diag/prdf/framework/service/prdfPlatServices.C
index d5f3aa88e..1c7eddc76 100644
--- a/src/usr/diag/prdf/framework/service/prdfPlatServices.C
+++ b/src/usr/diag/prdf/framework/service/prdfPlatServices.C
@@ -103,6 +103,20 @@ void milliSleep( uint32_t i_seconds, uint32_t i_milliseconds )
nanosleep( i_seconds, i_milliseconds * 1000000 );
}
+//------------------------------------------------------------------------------
+
+void initiateUnitDump( TargetHandle_t i_target,
+ errlHndl_t i_errl,
+ uint32_t i_errlActions )
+{
+ // no-op in Hostboot but just go ahead and commit
+ // the errorlog in case it's not null.
+ if ( NULL != i_errl )
+ {
+ PRDF_COMMIT_ERRL(i_errl, i_errlActions);
+ }
+}
+
//##############################################################################
//## Processor specific functions
//##############################################################################
diff --git a/src/usr/diag/prdf/framework/service/prdfRasServices.C b/src/usr/diag/prdf/framework/service/prdfRasServices.C
index 7beee6baa..9830aae77 100644
--- a/src/usr/diag/prdf/framework/service/prdfRasServices.C
+++ b/src/usr/diag/prdf/framework/service/prdfRasServices.C
@@ -110,9 +110,11 @@ bool ErrDataService::checkForceTerm( ServiceDataCollector & i_sdc,
//------------------------------------------------------------------------------
-void ErrDataService::handleUnitCS( TargetHandle_t i_unitCsTarget )
+void ErrDataService::handleUnitCS( TargetHandle_t i_unitCsTarget,
+ bool & o_initiateHwudump)
{
// No-op in Hostboot
+ o_initiateHwudump = false; // default to not initiate hwudump
}
//------------------------------------------------------------------------------
@@ -124,9 +126,11 @@ void ErrDataService::handleChannelFail( TargetHandle_t i_memTarget )
//------------------------------------------------------------------------------
-void ErrDataService::handleCoreUnitCS( TargetHandle_t i_exTarget )
+void ErrDataService::handleCoreUnitCS( TargetHandle_t i_exTarget,
+ bool & o_initiateHwudump)
{
// No-op in Hostboot
+ o_initiateHwudump = false; // default to not initiate hwudump
}
//------------------------------------------------------------------------------
diff --git a/src/usr/diag/prdf/test/prdfsimRasServices.C b/src/usr/diag/prdf/test/prdfsimRasServices.C
index c096561ff..11472859b 100755
--- a/src/usr/diag/prdf/test/prdfsimRasServices.C
+++ b/src/usr/diag/prdf/test/prdfsimRasServices.C
@@ -5,7 +5,9 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* COPYRIGHT International Business Machines Corp. 2012,2014 */
+/* Contributors Listed Below - COPYRIGHT 2013,2014 */
+/* [+] International Business Machines Corp. */
+/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
@@ -26,11 +28,17 @@
#include "stdio.h"
#include <targeting/common/targetservice.H>
+using namespace TARGETING;
+
namespace PRDF
{
errlHndl_t SimErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type,
- ServiceDataCollector & i_sdc)
+ ServiceDataCollector & i_sdc,
+ bool & o_initiateHwudump,
+ TargetHandle_t & o_dumpTrgt,
+ errlHndl_t & o_dumpErrl,
+ uint32_t & o_dumpErrlActions )
{
using namespace TARGETING;
@@ -40,7 +48,11 @@ errlHndl_t SimErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type,
errlHndl_t errLog = NULL;
// call the actual ras services function
- errLog = ErrDataService::GenerateSrcPfa(attn_type, i_sdc);
+ errLog = ErrDataService::GenerateSrcPfa(attn_type, i_sdc,
+ o_initiateHwudump,
+ o_dumpTrgt,
+ o_dumpErrl,
+ o_dumpErrlActions);
ErrorSignature * esig = i_sdc.GetErrorSignature();
diff --git a/src/usr/diag/prdf/test/prdfsimRasServices.H b/src/usr/diag/prdf/test/prdfsimRasServices.H
index eaaa2ed53..7de593985 100755
--- a/src/usr/diag/prdf/test/prdfsimRasServices.H
+++ b/src/usr/diag/prdf/test/prdfsimRasServices.H
@@ -5,7 +5,9 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* COPYRIGHT International Business Machines Corp. 2012,2014 */
+/* Contributors Listed Below - COPYRIGHT 2013,2014 */
+/* [+] International Business Machines Corp. */
+/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
@@ -50,19 +52,24 @@ class SimErrDataService: public ErrDataService
inline virtual ~SimErrDataService() {}
/**
- Create an SRC, PFA data, and Error log for the ServiceData provided
- <ul>
- <br><b>Parameter: </b> attn_type (see iipsdbug.h)
- <br><b>Parameter: </b> sdc (see iipServiceData.h)
- <br><b>Returns: </b> Error Log - Null if successfully committed
- <br><b>Requirements:</b> SetErrorTod()?
- <br><b>Promises: </b> Error log(s) build and logged, SRC built, etc.
- <br><b>Exceptions: </b> None.
- <br><b>Notes: </b>
- </ul><br>
+ @brief Create an SRC, PFA data, and Error log for the ServiceData provided
+ @param[in] attn_type (see iipsdbug.h)
+ @param[in,out] sdc (see iipServiceData.h)
+ @param[out] o_initiateHwudump whether or not to initiate hwudump
+ @param[out] o_dumpTrgt The DUMP target.
+ @param[out] o_dumpErrl The DUMP error handle
+ @param[out] o_dumpErrlActions DUMP error action flags
+ @return Error Log - Null if successfully committed
+ @pre SetErrorTod()?
+ @post Error log(s) build and logged, SRC built, etc.
+ @exception None.
*/
- virtual errlHndl_t GenerateSrcPfa(ATTENTION_TYPE attn_type, ServiceDataCollector & sdc);
-
+ virtual errlHndl_t GenerateSrcPfa(ATTENTION_TYPE attn_type,
+ ServiceDataCollector & sdc,
+ bool & o_initiateHwudump,
+ TARGETING::TargetHandle_t & o_dumpTrgt,
+ errlHndl_t & o_dumpErrl,
+ uint32_t & o_dumpErrlActions );
private: // functions
OpenPOWER on IntegriCloud