summaryrefslogtreecommitdiffstats
path: root/src/usr/isteps/hwpisteperror.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/isteps/hwpisteperror.C')
-rw-r--r--src/usr/isteps/hwpisteperror.C108
1 files changed, 108 insertions, 0 deletions
diff --git a/src/usr/isteps/hwpisteperror.C b/src/usr/isteps/hwpisteperror.C
new file mode 100644
index 000000000..afa9e9294
--- /dev/null
+++ b/src/usr/isteps/hwpisteperror.C
@@ -0,0 +1,108 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/isteps/hwpisteperror.C $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2012,2015 */
+/* [+] 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. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+#include <isteps/hwpisteperror.H>
+#include <isteps/hwpistepud.H>
+#include <istepdispatcher.H>
+
+using namespace ISTEP;
+using namespace ISTEP_ERROR;
+
+// setup the internal elog pointer and capture error data for the first or
+// add error data to top level elog
+void ISTEP_ERROR::IStepError::addErrorDetails( const errlHndl_t i_err )
+{
+ mutex_lock( &iv_mutex );
+
+ iv_errorCount++;
+
+ // if internal elog is null, create a new one and grab some data from the
+ // first error that is passed in.
+ if( iv_eHandle == NULL )
+ {
+ uint8_t l_iStep = 0;
+ uint8_t l_subStep = 0;
+
+ // Set the eid and reason code of the first error to user data word 1
+ uint64_t data1=TWO_UINT32_TO_UINT64(i_err->eid(),i_err->reasonCode());
+
+ // Set the error count and iStep/subStep to user data word 2
+ INITSERVICE::IStepDispatcher::
+ getTheInstance().getIstepInfo(l_iStep,l_subStep);
+ uint64_t data2 = TWO_UINT32_TO_UINT64(iv_errorCount, //first error
+ TWO_UINT8_TO_UINT16(l_iStep,l_subStep));
+
+ /*@
+ * @errortype
+ * @reasoncode ISTEP_FAILURE
+ * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE
+ * @moduleid ISTEP_REPORTING_ERROR
+ * @userdata1[0:31] eid of first error
+ * @userdata1[32:63] Reason code of first error
+ * @userdata2[0:31] Total number of elogs included
+ * @userdata2[32:64] iStep and SubStep that failed
+ * @devdesc IStep failed, see other log(s) with the same PLID
+ * for reason.
+ *
+ */
+ iv_eHandle = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE,
+ ISTEP_REPORTING_ERROR,
+ ISTEP_FAILURE,
+ data1, data2);
+
+ // Set the PLID of this istep elog to match the first error
+ iv_eHandle->plid(i_err->plid());
+ }
+ else
+ {
+ // retrieve iStep and subStep
+ uint32_t l_iStepSubStep = (iv_eHandle->getUserData2() & 0xFFFFFFFF);
+ // update the error count and keep iStep/subStep in user data word 1
+ uint64_t l_data2 = TWO_UINT32_TO_UINT64 (iv_errorCount,l_iStepSubStep);
+ iv_eHandle->addUserData2(l_data2);
+
+ // set the plid of the input elog to match the first and istep elog
+ i_err->plid( iv_eHandle->plid() );
+ }
+
+ // grab the istep's trace and add to the input elog
+ i_err->collectTrace("ISTEPS_TRACE", 1024);
+
+ // the istep error is causing the IPL to fail (UNRECOVERABLE), so
+ // if this error was less severe than UNRECOVERABLE (ie, INFORMATIONAL,
+ // RECOVERED, PREDICTIVE) change to UNRECOVERABLE so that it is
+ // visible as well as the istep error log.
+ if (i_err->sev() < ERRORLOG::ERRL_SEV_UNRECOVERABLE)
+ {
+ i_err->setSev(ERRORLOG::ERRL_SEV_UNRECOVERABLE);
+ }
+
+ // add some details from the input elog to the istep error object
+ ISTEP_ERROR::HwpUserDetailsIstep errorDetails( i_err );
+
+ // cross reference input error log to istep error object
+ errorDetails.addToLog( iv_eHandle );
+
+ mutex_unlock( &iv_mutex );
+}
OpenPOWER on IntegriCloud