diff options
-rw-r--r-- | src/include/usr/errl/errlentry.H | 4 | ||||
-rw-r--r-- | src/usr/errl/errlentry.C | 5 | ||||
-rw-r--r-- | src/usr/errl/errlmanager.C | 43 |
3 files changed, 44 insertions, 8 deletions
diff --git a/src/include/usr/errl/errlentry.H b/src/include/usr/errl/errlentry.H index ea5fdf660..aae693c12 100644 --- a/src/include/usr/errl/errlentry.H +++ b/src/include/usr/errl/errlentry.H @@ -574,10 +574,10 @@ public: const HWAS::callOutPriority i_priority); /** - * @brief Import flatened error log + * @brief Import flattened error log * * @param[in] i_buffer, pointer to flat data - * @param[in] i_len length of flat data + * @param[in] i_len length of flattened data * @return Status 0==SUCCESS */ uint64_t unflatten( const void * i_buffer, uint64_t i_len); diff --git a/src/usr/errl/errlentry.C b/src/usr/errl/errlentry.C index 4e978eb59..c8e1ac282 100644 --- a/src/usr/errl/errlentry.C +++ b/src/usr/errl/errlentry.C @@ -5,9 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2011,2014 */ -/* [+] International Business Machines Corp. */ +/* Contributors Listed Below - COPYRIGHT 2011,2015 */ /* [+] Google Inc. */ +/* [+] International Business Machines Corp. */ /* */ /* */ /* Licensed under the Apache License, Version 2.0 (the "License"); */ @@ -1351,6 +1351,7 @@ uint64_t ErrlEntry::flatten( void * o_pBuffer, { // some section was too big and didn't get flatten - update the // section count in the PH section and re-flatten it. + // count is the PH, UH, PS, and the optionals. iv_Private.iv_sctns = 3 + l_sectionCount; l_cb = iv_Private.flatten( pPHBuffer, l_sizeRemaining ); if( 0 == l_cb ) diff --git a/src/usr/errl/errlmanager.C b/src/usr/errl/errlmanager.C index 3408aaf99..24209326c 100644 --- a/src/usr/errl/errlmanager.C +++ b/src/usr/errl/errlmanager.C @@ -932,13 +932,48 @@ void ErrlManager::setupPnorInfo() // save will increment correctly iv_pnorOpenSlot = i; } - // also check if it's ACKed or not. and ACK it. - // for FSP system, this shouldn't ever happen. - // for non-FSP systems, this clears out all 'last IPL' logs + // also check if it's ACKed or not if (!isSlotACKed(i)) { - TRACFCOMP( g_trac_errl, INFO_MRK"setupPnorInfo slot %d eid %.8X was not ACKed.", + TRACFCOMP( g_trac_errl, + INFO_MRK"setupPnorInfo slot %d eid %.8X was not ACKed.", i, l_id); + +#ifdef CONFIG_BMC_IPMI + // for IPMI systems, unflatten to send down to the BMC + err = new ERRORLOG::ErrlEntry( + ERRORLOG::ERRL_SEV_UNRECOVERABLE, 0,0); + char *l_errlAddr = iv_pnorAddr + (PNOR_ERROR_LENGTH * i); + uint64_t rc = err->unflatten(l_errlAddr, PNOR_ERROR_LENGTH); + if (rc != 0) + { + // unflatten didn't work, nothing we can do + TRACFCOMP( g_trac_errl, + ERR_MRK"setupPnorInfo unflatten failed on slot %d eid %.8X.", + i, l_id); + } + else + { + if (iv_isIpmiEnabled) + { + // convert to SEL/eSEL and send to BMC over IPMI + sendErrLogToBmc(err); + delete err; + } + else + { + TRACFCOMP( g_trac_errl, + INFO_MRK"setupPnorInfo pushing slot %d eid %.8X to iv_errList.", + i, l_id); + // Pair with IPMI flag to add to the errlList + // so that it'll get sent down when IPMI is up + ErrlFlagPair_t l_pair(err, IPMI_FLAG); + iv_errlList.push_back(l_pair); + } + } +#else + // for FSP system, this shouldn't ever happen. +#endif setACKInFlattened(i); } // not ACKed } // not empty |