diff options
author | Sachin Gupta <sgupta2m@in.ibm.com> | 2014-06-27 11:38:12 +0530 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2014-07-14 13:30:44 -0500 |
commit | cdc76c00e35d6b4347c294ea965dc6e11f876194 (patch) | |
tree | 197c39fd5ac603a6adf778265f2e32bef2edfcce /src/usr/diag/prdf | |
parent | 901e9fde6a348d289f80445012a337632dd48652 (diff) | |
download | talos-hostboot-cdc76c00e35d6b4347c294ea965dc6e11f876194.tar.gz talos-hostboot-cdc76c00e35d6b4347c294ea965dc6e11f876194.zip |
PRD: Linking PRD error logs
Change-Id: Id6183fe1f70cc05a5fc51f74db429e807697023e
RTC: 98240
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/11069
Reviewed-by: Bilicon Patil <bilpatil@in.ibm.com>
Tested-by: Jenkins Server
Reviewed-by: Christopher T. Phan <cphan@us.ibm.com>
Reviewed-by: Zane Shelley <zshelle@us.ibm.com>
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/12161
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/diag/prdf')
6 files changed, 156 insertions, 85 deletions
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 58b4b3fc0..ac5153902 100644 --- a/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C +++ b/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2002,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. */ @@ -183,18 +185,14 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, { #define PRDF_FUNC "[ErrDataService::GenerateSrcPfa] " - errlHndl_t o_errl = NULL; - #ifdef __HOSTBOOT_MODULE using namespace ERRORLOG; using namespace HWAS; errlSeverity_t severityParm = ERRL_SEV_RECOVERED; #else bool causeAttnPreviouslyReported = false; - bool pldCheck = false; // Default to not do the PLD check. Set it to true for Machine Check uint8_t sdcSaveFlags = SDC_NO_SAVE_FLAGS; size_t sz_uint8 = sizeof(uint8_t); - HWSV::hwsvTermEnum termFlag = HWSV::HWSV_SYS_NO_TERMINATE; uint8_t sdcBuffer[sdcBufferSize]; //buffer to use for sdc flatten errlSeverity severityParm = ERRL_SEV_RECOVERED; #endif @@ -244,14 +242,6 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, PRDF_ERR( PRDF_FUNC"Hostboot should NOT have any system checkstop!" ); #else - pldCheck = true; // Do the PLD check - - if (terminateOnCheckstop) - { - //Also need to return error log for machine check condition - termFlag = HWSV::HWSV_SYS_TERMINATE_HW_CHECKSTOP; - } - ReturnELog = true; severityParm = ERRL_SEV_UNRECOVERABLE; @@ -534,24 +524,12 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, //************************************************************** - // Create Error Log with SRC + // Update Error Log with SRC //************************************************************** ErrorSignature * esig = sdc.GetErrorSignature(); - PRDF_HW_CREATE_ERRL(o_errl, - ERRL_SEV_PREDICTIVE, - ERRL_ETYPE_NOT_APPLICABLE, - SRCI_MACH_CHECK, - SRCI_NO_ATTR, - PRDF_RAS_SERVICES, - FSP_DEFAULT_REFCODE, - PRD_Reason_Code, - esig->getChipId(), //SRC Word 6 - SrcWord7, //code location - SRC Word 7 - esig->getSigId(), //signature - SRC Word 8 - SrcWord9, //user data - SRC Word 9 - termFlag, - pldCheck); //pldCheck + updateSrc( esig->getChipId(), SrcWord7, esig->getSigId(), + SrcWord9, PRD_Reason_Code); //************************************************************** // Add SDC Capture data to Error Log User Data here only if @@ -561,12 +539,12 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, bool capDataAdded = false; if (calloutsPlusDimms > 3) { - AddCapData(sdc.GetCaptureData(),o_errl); + AddCapData(sdc.GetCaptureData(),iv_errl); capDataAdded = true; } // make sure serviceAction doesn't override errl severity - o_errl->setSev(severityParm); + iv_errl->setSev(severityParm); if (ERRL_ACTION_HIDDEN == actionFlag) { // Diagnostics is not needed in the next IPL cycle for non-visible logs @@ -597,7 +575,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, PRDF_HW_ADD_CALLOUT(thiscallout.getTarget(), thispriority, deconfigState, - o_errl, + iv_errl, gardErrType, severityParm, l_diagUpdate); @@ -606,7 +584,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, else if(PRDcalloutData::TYPE_PROCCLK == thiscallout.getType() || PRDcalloutData::TYPE_PCICLK == thiscallout.getType()) { - PRDF_ADD_CLOCK_CALLOUT(o_errl, + PRDF_ADD_CLOCK_CALLOUT(iv_errl, thiscallout.getTarget(), thiscallout.getType(), thispriority, @@ -624,7 +602,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, PRDF_HW_ADD_CALLOUT( *it, thispriority, deconfigState, - o_errl, + iv_errl, gardErrType, severityParm, l_diagUpdate ); @@ -639,7 +617,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, PRDF_HW_ADD_PROC_CALLOUT(thisProcedureID, thispriority, - o_errl, + iv_errl, severityParm); // Use the flags set earlier to determine if the callout is just Software (SP code or Phyp Code). @@ -651,7 +629,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, PRDF_HW_ADD_PROC_CALLOUT(EPUB_PRC_LVL_SUPP, MRU_LOW, - o_errl, + iv_errl, severityParm); SecondLevel = true; @@ -704,7 +682,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, ForceTerminate = true; pfaData.LAST_CORE_TERMINATE = 1; - o_errl->setSev(ERRL_SEV_UNRECOVERABLE); + iv_errl->setSev(ERRL_SEV_UNRECOVERABLE); pfaData.errlSeverity = ERRL_SEV_UNRECOVERABLE; } } @@ -713,12 +691,12 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, // Check the errl for the terminate state // Note: will also be true for CheckStop attn. bool l_termSRC = false; - PRDF_GET_TERM_SRC(o_errl, l_termSRC); + PRDF_GET_TERM_SRC(iv_errl, l_termSRC); if(l_termSRC) { ForceTerminate = true; uint32_t l_plid = 0; - PRDF_GET_PLID(o_errl, l_plid); + PRDF_GET_PLID(iv_errl, l_plid); PRDF_INF(PRDF_FUNC"check for isTerminateSRC is true. PLID=%.8X", l_plid); } @@ -735,7 +713,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, !HW ) { //Terminate in Manufacturing Mode, in IPL mode, for visible log, with no HW callouts. - PRDF_SRC_WRITE_TERM_STATE_ON(o_errl, SRCI_TERM_STATE_MNFG); + PRDF_SRC_WRITE_TERM_STATE_ON(iv_errl, SRCI_TERM_STATE_MNFG); } // Do not terminate if recoverable or informational. // Do not terminate if deferred deconfig. @@ -748,7 +726,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, } else { - PRDF_SRC_WRITE_TERM_STATE_ON(o_errl, SRCI_TERM_STATE_MNFG); + PRDF_SRC_WRITE_TERM_STATE_ON(iv_errl, SRCI_TERM_STATE_MNFG); } pfaData.errlActions = actionFlag; @@ -763,7 +741,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, //************************************************************** UtilMem l_membuf; l_membuf << pfaData; - PRDF_ADD_FFDC( o_errl, (const char*)l_membuf.base(), l_membuf.size(), + PRDF_ADD_FFDC( iv_errl, (const char*)l_membuf.base(), l_membuf.size(), ErrlVer1, ErrlSectPFA5_1 ); //************************************************************** @@ -773,7 +751,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, // Check to make sure Capture Data wasn't added earlier. if (!capDataAdded) { - AddCapData(sdc.GetCaptureData() ,o_errl); + AddCapData(sdc.GetCaptureData() ,iv_errl); } // Note moved the code from here, that was associated with checking for the last @@ -782,7 +760,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, // Collect PRD trace // NOTE: Each line of trace is on average 36 bytes so 768 bytes should get // us around 21 lines of trace output. - PRDF_COLLECT_TRACE(o_errl, 768); + PRDF_COLLECT_TRACE(iv_errl, 768); //************************************************************** // Commit the eror log. @@ -791,8 +769,8 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, //************************************************************** if (sdc.IsDontCommitErrl() && !sdc.IsUnitCS() && (MACHINE_CHECK != i_attnType) ) { - delete o_errl; - o_errl = NULL; + delete iv_errl; + iv_errl = NULL; } else if ( !ReturnELog && !ForceTerminate && !i_sdc.Terminate() ) { @@ -820,7 +798,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, if ( SUCCESS == l_rc ) { - l_rc = PRDF_HWUDUMP( o_errl, CONTENT_HWNXLCL, + l_rc = PRDF_HWUDUMP( iv_errl, CONTENT_HWNXLCL, dumpId ); } } @@ -844,7 +822,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, if (centaurHandle) { int32_t l_rc = PRDF_RUNTIME_DECONFIG(centaurHandle, - o_errl, + iv_errl, false); if ( SUCCESS != l_rc ) { @@ -856,14 +834,14 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, } else { - int32_t l_rc = PRDF_RUNTIME_DECONFIG( dumpTrgt, o_errl, + int32_t l_rc = PRDF_RUNTIME_DECONFIG( dumpTrgt, iv_errl, true); if ( SUCCESS == l_rc ) { // Call Dump for Proc Core CS if ( TYPE_EX == dumpTrgtType ) { - l_rc = PRDF_HWUDUMP( o_errl, + l_rc = PRDF_HWUDUMP( iv_errl, CONTENT_SINGLE_CORE_CHECKSTOP, dumpId ); } @@ -880,28 +858,28 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, // Commit the Error log // Need to move below here since we'll need - // to pass o_errl to PRDF_HWUDUMP + // to pass iv_errl to PRDF_HWUDUMP // for FSP specific SRC handling in the future MnfgTrace( esig, pfaData ); - PRDF_HW_COMMIT_ERRL( o_errl, actionFlag ); - if ( NULL != o_errl ) + PRDF_HW_COMMIT_ERRL( iv_errl, actionFlag ); + if ( NULL != iv_errl ) { // Just commit the log. uint32_t dumpPlid = 0; - PRDF_GET_PLID(o_errl, dumpPlid); + PRDF_GET_PLID(iv_errl, dumpPlid); uint32_t l_rc = 0; - PRDF_GET_RC(o_errl, l_rc); + PRDF_GET_RC(iv_errl, l_rc); uint16_t l_reasonCode = 0; - PRDF_GET_REASONCODE(o_errl, l_reasonCode); + 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_COMMIT_ERRL(o_errl, actionFlag); + PRDF_COMMIT_ERRL(iv_errl, actionFlag); } } // If the Error Log is not committed (as due to a Terminate condtion), @@ -941,6 +919,12 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, printDebugTraces(); + // Reset iv_errl to NULL. This is done to catch logical bug in our code. + // It enables us to assert in createInitialErrl function if iv_errl is + // not NULL which should catch any logical bug in initial stages of testing. + errlHndl_t o_errl = iv_errl; + iv_errl = NULL; + return o_errl; #undef PRDF_FUNC 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 d512d5e87..c4865136b 100644 --- a/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.H +++ b/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.H @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2002,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. */ @@ -62,7 +64,8 @@ class ErrDataService inline ErrDataService() : loggingBufferFull(false), iv_serviceActionCounter(0), - savedPrdReturnCode(0) + savedPrdReturnCode(0), + iv_errl(NULL) {} /** @@ -138,6 +141,30 @@ class ErrDataService */ void MnfgTrace( ErrorSignature * i_esig, const PfaData & i_pfaData ); + /** + * @brief Create initial error log for analyze( attn analysis) code flow. + * @param i_attnType attention type. + */ + void createInitialErrl( ATTENTION_TYPE i_attnType ); + + /** + * @brief Update SRC section for initial error log. + * @param i_user1 User data word 1. + * @param i_user2 User data word 2. + * @param i_user3 User data word 3. + * @param i_user4 User data word 4. + * @param i_rc Reason code. + */ + void updateSrc( uint32_t i_user1, uint32_t i_user2, + uint32_t i_user3, uint32_t i_user4, + uint16_t i_rc ); + + /** + * @brief Return error log associated with current analysis flow. + * @return error log handle. + */ + errlHndl_t getErrl() { return iv_errl; }; + private: /** @@ -221,6 +248,8 @@ class ErrDataService static bool terminateOnCheckstop; + errlHndl_t iv_errl; + }; /** @@ -297,6 +326,23 @@ public: ErrDataService::SetTerminateOnCheckstop(setting); } + /** + * @brief Create initial error log for analyze( attn analysis) code flow. + * @param i_attnType attention type. + */ + void createInitialErrl( ATTENTION_TYPE i_attnType ) + { + iv_ErrDataService->createInitialErrl( i_attnType ); + } + + /** + * @brief Return error log associated with current analysis flow. + * @return error log handle. + */ + virtual errlHndl_t getErrl() + { + return iv_ErrDataService->getErrl(); + }; private: // Data // actual or sim err data service diff --git a/src/usr/diag/prdf/common/framework/service/xspprdService.h b/src/usr/diag/prdf/common/framework/service/xspprdService.h index 1f368326d..f0fac81f7 100755 --- a/src/usr/diag/prdf/common/framework/service/xspprdService.h +++ b/src/usr/diag/prdf/common/framework/service/xspprdService.h @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 1999,2014 */ +/* Contributors Listed Below - COPYRIGHT 2012,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. */ @@ -175,6 +177,18 @@ public: virtual errlHndl_t GenerateSrcPfa(ATTENTION_TYPE attn_type, ServiceDataCollector & sdc)=0; // mp01 c + /** + * @brief Create initial error log for analyze( attn analysis) code flow. + * @param i_attnType attention type. + */ + virtual void createInitialErrl( ATTENTION_TYPE i_attnType ) = 0; + + /** + * @brief Return error log associated with current analysis flow. + * @return error log handle. + */ + virtual errlHndl_t getErrl() = 0; + private: diff --git a/src/usr/diag/prdf/common/prdfMain_common.C b/src/usr/diag/prdf/common/prdfMain_common.C index 0a46fbd6a..f55d47fef 100755 --- a/src/usr/diag/prdf/common/prdfMain_common.C +++ b/src/usr/diag/prdf/common/prdfMain_common.C @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2002,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. */ @@ -241,6 +243,9 @@ errlHndl_t main( ATTENTION_VALUE_TYPE i_attentionType, serviceData.SetFlooding(); } + // Create Initial error log + serviceGenerator.createInitialErrl( i_attentionType ); + int32_t analyzeRc = systemPtr->Analyze(sdc, i_attentionType); // flush Cache to free up the memory RegDataCache::getCachedRegisters().flush(); diff --git a/src/usr/diag/prdf/framework/service/prdfRasServices.C b/src/usr/diag/prdf/framework/service/prdfRasServices.C index 0073a8f53..a2895e11f 100644 --- a/src/usr/diag/prdf/framework/service/prdfRasServices.C +++ b/src/usr/diag/prdf/framework/service/prdfRasServices.C @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2013,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,9 +52,44 @@ void ErrDataService::MnfgTrace( ErrorSignature * i_esig, #undef PRDF_FUNC } +//------------------------------------------------------------------------------ + void ErrDataService::deallocateDimms( SDC_MRU_LIST & i_mruList ) { //No OP for HB } + +//------------------------------------------------------------------------------ + +void ErrDataService::updateSrc( uint32_t i_user1, uint32_t i_user2, + uint32_t i_user3, uint32_t i_user4, + uint16_t i_rc ) +{ + // We should always have a valid pointer here. If it is NULL, there + // is some major issue. + PRDF_ASSERT ( NULL != iv_errl); + + iv_errl->setReasonCode(i_rc); + iv_errl->addUserData1( PRDF_GET_UINT64_FROM_UINT32( i_user1, i_user2 )); + iv_errl->addUserData2( PRDF_GET_UINT64_FROM_UINT32( i_user3, i_user4 )); +} + +//------------------------------------------------------------------------------ + +void ErrDataService::createInitialErrl( ATTENTION_TYPE i_attnType ) +{ + // We should always have a NULL pointer here. If it is not NULL, there + // is some major issue. + PRDF_ASSERT ( NULL == iv_errl ); + using namespace ERRORLOG; + + iv_errl = new ErrlEntry( + ERRL_SEV_RECOVERED, + PRDF_RAS_SERVICES, + 0, + PRDF_GET_UINT64_FROM_UINT32( 0, 0 ), + PRDF_GET_UINT64_FROM_UINT32( 0, 0 ) ); +} + } // end namespace PRDF diff --git a/src/usr/diag/prdf/prdfErrlUtil.H b/src/usr/diag/prdf/prdfErrlUtil.H index f28d9f436..2f6c4cbe1 100644 --- a/src/usr/diag/prdf/prdfErrlUtil.H +++ b/src/usr/diag/prdf/prdfErrlUtil.H @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2002,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. */ @@ -33,6 +35,7 @@ */ #include <prdfEnums.H> +#include <prdfRasServices.H> /** * @brief create ErrlEntry in Hostboot @@ -73,9 +76,12 @@ * @brief Commit the log */ // NOTE: Hostboot error log commit function does not need the action flag -#define PRDF_COMMIT_ERRL(io_errl, i_actions) \ +#define PRDF_COMMIT_ERRL(io_errl, i_actions) { \ + errlHndl_t globalErrl = \ + ServiceGeneratorClass::ThisServiceGenerator().getErrl(); \ + if( NULL != globalErrl ) io_errl->plid( globalErrl->plid() ); \ if(i_actions) {} \ - errlCommit(io_errl, PRDF_COMP_ID) + errlCommit(io_errl, PRDF_COMP_ID); } /** * @brief Collect component trace @@ -140,27 +146,6 @@ /*--------------------------------------------------------------------*/ /** - * @brief function to create an error log. - */ -#define PRDF_HW_CREATE_ERRL(io_errl, \ - i_sev, \ - i_etype, \ - i_type, \ - i_srcAttr, \ - i_mid, \ - i_refCode, \ - i_reasonCode, \ - i_userData1, \ - i_userData2, \ - i_userData3, \ - i_userData4, \ - i_termFlag, \ - i_pldCheck) \ - PRDF_CREATE_ERRL(io_errl, i_sev, i_etype, i_type, \ - i_srcAttr, i_mid, i_refCode, i_reasonCode, \ - i_userData1, i_userData2, i_userData3, i_userData4) - -/** * @brief Add a procedure callout to an existing error log */ #define PRDF_HW_ADD_PROC_CALLOUT(i_procedure, \ |