diff options
author | Bill Hoffa <wghoffa@us.ibm.com> | 2018-01-29 14:12:20 -0600 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2018-02-06 10:14:16 -0500 |
commit | e77f8551f4a639e28c07728cca857b4b80c57f0a (patch) | |
tree | 0f75eee488aab1e44161da3d791c3bb794739863 /src/usr | |
parent | 9925aa358f2ad3e5ecb5d5757dbb5c8dbabc123b (diff) | |
download | talos-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.C | 8 | ||||
-rw-r--r-- | src/usr/mbox/mailboxsp.C | 105 |
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 |