summaryrefslogtreecommitdiffstats
path: root/src/usr
diff options
context:
space:
mode:
authorBill Hoffa <wghoffa@us.ibm.com>2018-01-29 14:12:20 -0600
committerDaniel M. Crowell <dcrowell@us.ibm.com>2018-02-06 10:14:16 -0500
commite77f8551f4a639e28c07728cca857b4b80c57f0a (patch)
tree0f75eee488aab1e44161da3d791c3bb794739863 /src/usr
parent9925aa358f2ad3e5ecb5d5757dbb5c8dbabc123b (diff)
downloadtalos-hostboot-e77f8551f4a639e28c07728cca857b4b80c57f0a.tar.gz
talos-hostboot-e77f8551f4a639e28c07728cca857b4b80c57f0a.zip
Handle INTRP SHUT_DOWN message in MBOX IPC msg_hdlr
- Messages sent to MBOX during INTRP shutdown causing IPC Invalid Message Data Errorlogs - Improve Inadvertent IPC Message Handling FFDC Change-Id: Idccad59664e7c95bf8a8618646a13b28c71b4ac7 CQ: SW415386 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/52981 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Prachi Gupta <pragupta@us.ibm.com> Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr')
-rw-r--r--src/usr/isteps/istep21/call_host_start_payload.C8
-rw-r--r--src/usr/mbox/mailboxsp.C105
2 files changed, 64 insertions, 49 deletions
diff --git a/src/usr/isteps/istep21/call_host_start_payload.C b/src/usr/isteps/istep21/call_host_start_payload.C
index 039db3f6f..489516f14 100644
--- a/src/usr/isteps/istep21/call_host_start_payload.C
+++ b/src/usr/isteps/istep21/call_host_start_payload.C
@@ -592,7 +592,6 @@ errlHndl_t broadcastShutdown ( uint64_t i_hbInstance )
}
// continue - multi-node
-
uint8_t node_map
[sizeof(TARGETING::ATTR_FABRIC_TO_PHYSICAL_NODE_MAP_type)];
@@ -637,9 +636,10 @@ errlHndl_t broadcastShutdown ( uint64_t i_hbInstance )
if( 0 != ((mask >> node) & hb_images ) )
{
- TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
- "start_payload-sending msg for drawer %d",
- drawer );
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "start_payload-sending msg for drawer %d,"
+ "node %d, found existing HB images 0x%08x",
+ drawer, node, hb_images );
msg_t * msg = msg_allocate();
msg->type = IPC::IPC_START_PAYLOAD;
msg->data[0] = i_hbInstance;
diff --git a/src/usr/mbox/mailboxsp.C b/src/usr/mbox/mailboxsp.C
index 7d06c2e89..b2d8d3bc9 100644
--- a/src/usr/mbox/mailboxsp.C
+++ b/src/usr/mbox/mailboxsp.C
@@ -50,6 +50,7 @@
#include <arch/pirformat.H>
#include <sbeio/sbeioif.H>
#include <sys/time.h>
+#include <intr/interrupt.H>
// Local functions
namespace MBOX
@@ -443,58 +444,72 @@ void MailboxSp::msgHandler()
case MSG_IPC: // Look for Interprocessor Messages
{
- uint64_t msg_q_id = KernelIpc::ipc_data_area.msg_queue_id;
- if(msg_q_id == IPC_DATA_AREA_LOCKED)
+ if (msg->data[0] == INTR::SHUT_DOWN)
{
- TRACFCOMP(g_trac_mbox, INFO_MRK
- "MBOXSP IPC data area locked");
- // msg is being written, but not yet ready to handle
- msg_q_id = IPC_DATA_AREA_CLEAR;
- }
- // desination message queue id is lower 32 bits
- msg_q_id &= 0x00000000FFFFFFFFull;
-
- if(IPC_DATA_AREA_CLEAR != msg_q_id)
- {
- // message is ready to handle
- msg_t * ipc_msg = msg_allocate();
- isync();
- *ipc_msg = KernelIpc::ipc_data_area.msg_payload;
- lwsync();
- // Clear ipc area so another message can be sent
- KernelIpc::ipc_data_area.msg_queue_id =
- IPC_DATA_AREA_CLEAR;
- handleIPC(static_cast<queue_id_t>(msg_q_id), ipc_msg);
+ //Unregister for this message to prevent future
+ // messages from INTRP during shut down
+ msg_respond(iv_msgQ,msg);
+ TRACFCOMP(g_trac_mbox,INFO_MRK
+ "MSG_IPC SHUT_DOWN message received, unregistering for IPC messages");
+ INTR::unRegisterMsgQ(INTR::ISN_INTERPROC);
}
else
{
- TRACFCOMP(g_trac_mbox, ERR_MRK
+ uint64_t msg_q_id = KernelIpc::ipc_data_area.msg_queue_id;
+ if(msg_q_id == IPC_DATA_AREA_LOCKED)
+ {
+ TRACFCOMP(g_trac_mbox, INFO_MRK
+ "MBOXSP IPC data area locked");
+ // msg is being written, but not yet ready to handle
+ msg_q_id = IPC_DATA_AREA_CLEAR;
+ }
+ // desination message queue id is lower 32 bits
+ msg_q_id &= 0x00000000FFFFFFFFull;
+
+ if(IPC_DATA_AREA_CLEAR != msg_q_id)
+ {
+ // message is ready to handle
+ msg_t * ipc_msg = msg_allocate();
+ isync();
+ *ipc_msg = KernelIpc::ipc_data_area.msg_payload;
+ lwsync();
+ // Clear ipc area so another message can be sent
+ KernelIpc::ipc_data_area.msg_queue_id =
+ IPC_DATA_AREA_CLEAR;
+ handleIPC(static_cast<queue_id_t>(msg_q_id), ipc_msg);
+ }
+ else
+ {
+ TRACFCOMP(g_trac_mbox, ERR_MRK
"MBOXSP invalid data found in IPC data area: "
" %0xlx", msg_q_id);
- TRACFBIN(g_trac_mbox, "IPC Data Area:",
- &KernelIpc::ipc_data_area,
- sizeof(KernelIpc::ipc_data_area));
-
- /*@ errorlog tag
- * @errortype ERRL_SEV_PREDICTIVE
- * @moduleid MBOX::MOD_MBOXSRV_HNDLR
- * @reasoncode MBOX::RC_IPC_INVALID_DATA
- * @userdata1 IPC Data Area MSG Queue ID
- * @devdesc IPC Message data corrupted
- */
- err = new ERRORLOG::ErrlEntry
- (
- ERRORLOG::ERRL_SEV_PREDICTIVE,
- MBOX::MOD_MBOXSRV_HNDLR,
- MBOX::RC_IPC_INVALID_DATA, // reason Code
- msg_q_id, // IPC Data
- 0
- );
-
- errlCommit(err,MBOX_COMP_ID);
+ TRACFBIN(g_trac_mbox, "IPC Data Area:",
+ &KernelIpc::ipc_data_area,
+ sizeof(KernelIpc::ipc_data_area));
+
+ /*@ errorlog tag
+ * @errortype ERRL_SEV_PREDICTIVE
+ * @moduleid MBOX::MOD_MBOXSRV_HNDLR
+ * @reasoncode MBOX::RC_IPC_INVALID_DATA
+ * @userdata1 IPC Data Area MSG Queue ID
+ * @devdesc IPC Message data corrupted
+ */
+ err = new ERRORLOG::ErrlEntry
+ (
+ ERRORLOG::ERRL_SEV_PREDICTIVE,
+ MBOX::MOD_MBOXSRV_HNDLR,
+ MBOX::RC_IPC_INVALID_DATA, // reason Code
+ msg_q_id, // IPC Data
+ 0
+ );
+
+ err->collectTrace(MBOX_COMP_NAME, 256);
+ err->collectTrace(INTR_COMP_NAME, 256);
+
+ errlCommit(err,MBOX_COMP_ID);
+ }
}
-
INTR::sendEOI(iv_msgQ,msg);
}
@@ -1937,7 +1952,7 @@ void MailboxSp::handleShutdown()
errlHndl_t err = mboxddShutDown(iv_trgt);
#if (0) // @todo RTC:126643
- INTR::unRegisterMsgQ(INTR::FSP_MAILBOX);
+ INTR::unRegisterMsgQ(INTR::LSI_FSIMBOX);
INTR::unRegisterMsgQ(INTR::ISN_INTERPROC);
#endif
OpenPOWER on IntegriCloud