summaryrefslogtreecommitdiffstats
path: root/src/usr/errl/runtime/rt_errlmanager.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/errl/runtime/rt_errlmanager.C')
-rw-r--r--src/usr/errl/runtime/rt_errlmanager.C84
1 files changed, 53 insertions, 31 deletions
diff --git a/src/usr/errl/runtime/rt_errlmanager.C b/src/usr/errl/runtime/rt_errlmanager.C
index cea88de64..4361a691d 100644
--- a/src/usr/errl/runtime/rt_errlmanager.C
+++ b/src/usr/errl/runtime/rt_errlmanager.C
@@ -31,7 +31,8 @@
#include <sys/task.h>
#include <stdlib.h>
#include <string.h>
-#include <runtime/interface.h>
+#include <runtime/interface.h> // g_hostInterfaces
+#include <util/runtime/rt_fwreq_helper.H> // firmware_request_helper
#include <targeting/common/targetservice.H>
#include <pnor/pnorif.H>
#include <hwas/common/deconfigGard.H>
@@ -89,7 +90,8 @@ ErrlManager::ErrlManager() :
}
else
{
- TRACFCOMP( g_trac_errl, "Error log being created before TARGETING is ready..." );
+ TRACFCOMP( g_trac_errl, "Error log being created before "
+ "TARGETING is ready..." );
}
if(sys)
{
@@ -116,7 +118,8 @@ ErrlManager::ErrlManager() :
spfn.baseServices))
{
iv_isSpBaseServices = false;
- TRACFCOMP( g_trac_errl, INFO_MRK"no baseServices, setting up to save to pnor" );
+ TRACFCOMP( g_trac_errl, INFO_MRK"no baseServices, setting "
+ "up to save to pnor" );
setupPnorInfo();
}
else
@@ -146,6 +149,10 @@ ErrlManager::~ErrlManager()
///////////////////////////////////////////////////////////////////////////////
void ErrlManager::sendMboxMsg ( errlHndl_t& io_err )
{
+ // Put the handle to the firmware_request request struct
+ // out here so it is easier to free later
+ hostInterfaces::hbrt_fw_msg *l_req_fw_msg = nullptr;
+
do
{
if (!iv_isSpBaseServices)
@@ -155,8 +162,8 @@ void ErrlManager::sendMboxMsg ( errlHndl_t& io_err )
bool l_savedToPnor = saveErrLogToPnor(io_err);
if (!l_savedToPnor)
{
- TRACFCOMP( g_trac_errl, ENTER_MRK"saveErrLogToPnor didn't save 0x%X",
- io_err->eid());
+ TRACFCOMP( g_trac_errl, ENTER_MRK"saveErrLogToPnor "
+ "didn't save 0x%X", io_err->eid());
}
}
@@ -186,8 +193,8 @@ void ErrlManager::sendMboxMsg ( errlHndl_t& io_err )
if(rc)
{
- TRACFCOMP(g_trac_errl, ERR_MRK
- "Failed sending error log to FSP via "
+ TRACFCOMP(g_trac_errl,
+ ERR_MRK"Failed sending error log to FSP via "
"sendErrorLog. rc: %d. plid: 0x%08x",
rc,
io_err->plid() );
@@ -197,43 +204,53 @@ void ErrlManager::sendMboxMsg ( errlHndl_t& io_err )
}
else if (g_hostInterfaces->firmware_request)
{
- // Get an accurate size of memory actually
- // needed to transport the data
- size_t l_req_fw_msg_size =
- hostInterfaces::HBRT_FW_MSG_BASE_SIZE +
- sizeof(hostInterfaces::hbrt_fw_msg::error_log) +
- l_msgSize;
-
- // Create the firmware_request structure
- // to carry the error log data
+ // Get an accurate size of memory needed to transport
+ // the data for the firmware_request request struct
+ uint64_t l_req_fw_msg_size =
+ hostInterfaces::HBRT_FW_MSG_BASE_SIZE +
+ sizeof(hostInterfaces::hbrt_fw_msg::error_log) +
+ l_msgSize -
+ sizeof(hostInterfaces::hbrt_fw_msg::error_log.i_data);
+
+ // Create the firmware_request request struct to send data
hostInterfaces::hbrt_fw_msg *l_req_fw_msg =
(hostInterfaces::hbrt_fw_msg *)malloc(l_req_fw_msg_size);
-
memset(l_req_fw_msg, 0, l_req_fw_msg_size);
- // Populate the firmware_request structure with given data
+ // Populate the firmware_request request struct with given data
l_req_fw_msg->io_type =
hostInterfaces::HBRT_FW_MSG_TYPE_ERROR_LOG;
l_req_fw_msg->error_log.i_plid = io_err->plid();
l_req_fw_msg->error_log.i_errlSize = l_msgSize;
io_err->flatten (&(l_req_fw_msg->error_log.i_data), l_msgSize);
+ // Trace out firmware request info
+ TRACFCOMP(g_trac_errl,
+ INFO_MRK"Error log firmware request info: "
+ "io_type:%d, plid: 0x%08x, errlSize:%d",
+ l_req_fw_msg->io_type,
+ l_req_fw_msg->error_log.i_plid,
+ l_req_fw_msg->error_log.i_errlSize);
+
+ TRACFBIN(g_trac_errl, "Error log firmware request data: ",
+ &(l_req_fw_msg->error_log.i_data),
+ l_req_fw_msg->error_log.i_errlSize);
+
+ // Create the firmware_request response struct to receive data
hostInterfaces::hbrt_fw_msg l_resp_fw_msg;
uint64_t l_resp_fw_msg_size = sizeof(l_resp_fw_msg);
- size_t rc = g_hostInterfaces->
- firmware_request(l_req_fw_msg_size, l_req_fw_msg,
- &l_resp_fw_msg_size, &l_resp_fw_msg);
+ memset(&l_resp_fw_msg, 0, l_resp_fw_msg_size);
- if(rc)
- {
- TRACFCOMP(g_trac_errl, ERR_MRK
- "Failed sending error log to FSP "
- "via firmware_request. rc: %d. plid: 0x%08x",
- rc,
- io_err->plid() );
- }
- free(l_req_fw_msg);
+ // Make the firmware_request call
+ errlHndl_t l_err = firmware_request_helper(l_req_fw_msg_size,
+ l_req_fw_msg,
+ &l_resp_fw_msg_size,
+ &l_resp_fw_msg);
+
+ // Should not get an error log, but if it happens,
+ // just delete it.
+ delete l_err, l_err = nullptr;
}
else
{
@@ -258,6 +275,10 @@ void ErrlManager::sendMboxMsg ( errlHndl_t& io_err )
} while (0);
+ // Release the firmware_request request struct
+ free(l_req_fw_msg);
+ l_req_fw_msg = nullptr;
+
TRACFCOMP( g_trac_errl, EXIT_MRK"sendToHypervisor()" );
return;
}
@@ -341,7 +362,8 @@ bool rt_processCallout(errlHndl_t &io_errl,
if (!l_err)
{
- errlHndl_t errl = HWAS::theDeconfigGard().platCreateGardRecord(pTarget,
+ errlHndl_t errl = HWAS::theDeconfigGard().platCreateGardRecord
+ (pTarget,
io_errl->eid(),
pCalloutUD->gardErrorType);
if (errl)
OpenPOWER on IntegriCloud