summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/include/kernel/ipc.H6
-rw-r--r--src/kernel/intmsghandler.C2
-rw-r--r--src/kernel/ipc.C10
-rw-r--r--src/usr/intr/intrrp.C14
-rw-r--r--src/usr/mbox/mailboxsp.C16
5 files changed, 34 insertions, 14 deletions
diff --git a/src/include/kernel/ipc.H b/src/include/kernel/ipc.H
index a67ea5463..f411808c3 100644
--- a/src/include/kernel/ipc.H
+++ b/src/include/kernel/ipc.H
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013 */
+/* COPYRIGHT International Business Machines Corp. 2013,2014 */
/* */
/* p1 */
/* */
@@ -25,6 +25,10 @@
#include <sys/msg.h>
+#define IPC_DATA_AREA_LOCKED 0xFFFFFFFFFFFFFFFFul
+#define IPC_DATA_AREA_READ 0xFFFFFFFFFFFFFFFEul
+#define IPC_DATA_AREA_CLEAR 0
+
namespace KernelIpc
{
struct ipc_data_area_t
diff --git a/src/kernel/intmsghandler.C b/src/kernel/intmsghandler.C
index e8fd5e66c..d3e6a8298 100644
--- a/src/kernel/intmsghandler.C
+++ b/src/kernel/intmsghandler.C
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2011,2013 */
+/* COPYRIGHT International Business Machines Corp. 2011,2014 */
/* */
/* p1 */
/* */
diff --git a/src/kernel/ipc.C b/src/kernel/ipc.C
index 3f522c4ee..6a63225fc 100644
--- a/src/kernel/ipc.C
+++ b/src/kernel/ipc.C
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013 */
+/* COPYRIGHT International Business Machines Corp. 2013,2014 */
/* */
/* p1 */
/* */
@@ -62,7 +62,7 @@ void KernelIpc::send(uint64_t i_q, msg_t * i_msg)
dest_addr += dest_hrmor;
dest_addr |= 0x8000000000000000ul;
- printkd("IPC Dest addr %lx\n",dest_addr);
+ printkd("IPC Dest addr %lx Q_id:%lx\n",dest_addr,i_q);
// pointer to the ipc_data_area in the destination node
ipc_data_area_t * p_dest =
@@ -70,8 +70,8 @@ void KernelIpc::send(uint64_t i_q, msg_t * i_msg)
// get lock on IPC data area in other node
while(false == __sync_bool_compare_and_swap(&(p_dest->msg_queue_id),
- 0,
- 0xFFFFFFFFFFFFFFFFul))
+ IPC_DATA_AREA_CLEAR,
+ IPC_DATA_AREA_LOCKED))
{
setThreadPriorityLow();
}
@@ -83,6 +83,8 @@ void KernelIpc::send(uint64_t i_q, msg_t * i_msg)
p_dest->msg_queue_id = i_q; // set destination queue id
lwsync();
+ printkd("IPC send from PIR %lx to PIR %x\n",getPIR(),p_dest->pir);
+
// send IPI
InterruptMsgHdlr::sendIPI(p_dest->pir);
diff --git a/src/usr/intr/intrrp.C b/src/usr/intr/intrrp.C
index 21b5e81d4..447a75929 100644
--- a/src/usr/intr/intrrp.C
+++ b/src/usr/intr/intrrp.C
@@ -207,7 +207,7 @@ errlHndl_t IntrRp::_init()
KernelIpc::ipc_data_area.pir = iv_masterCpu.word;
KernelIpc::ipc_data_area.hrmor_base = hrmor_base;
- KernelIpc::ipc_data_area.msg_queue_id = 0;
+ KernelIpc::ipc_data_area.msg_queue_id = IPC_DATA_AREA_CLEAR;
// Set the BAR scom reg
err = setBAR(procTarget,iv_masterCpu);
@@ -453,6 +453,18 @@ void IntrRp::msgHandler()
// Writing the XIRR with the same value read earlier
// tells the interrupt presenter hardware to signal an EOI.
*xirrAddress = xirr;
+
+ // indicate IPC data area clear after EOI has been sent
+ if (type == INTERPROC_XISR)
+ {
+ if(KernelIpc::ipc_data_area.msg_queue_id ==
+ IPC_DATA_AREA_READ)
+ {
+ KernelIpc::ipc_data_area.msg_queue_id =
+ IPC_DATA_AREA_CLEAR;
+ }
+ }
+
}
break;
diff --git a/src/usr/mbox/mailboxsp.C b/src/usr/mbox/mailboxsp.C
index 8b63fda00..de3a8e23e 100644
--- a/src/usr/mbox/mailboxsp.C
+++ b/src/usr/mbox/mailboxsp.C
@@ -1401,23 +1401,25 @@ void MailboxSp::handleIPC()
// All IPC messages are secure
uint64_t msg_q_id = KernelIpc::ipc_data_area.msg_queue_id;
- // msg_q_id == 0 means no IPC message available
- // msg_q_id == (all ones) means message incomming, but not ready and
- // not associated with this interupt
- if(msg_q_id == 0xFFFFFFFFFFFFFFFFul)
+ // msg_q_id == IPC_DATA_AREA_CLEAR means no IPC message available
+ // msg_q_id == IPC_DATA_AREA_LOCKED means message incomming, but not ready
+ // to be read and not associated with this interupt
+ if(msg_q_id == IPC_DATA_AREA_LOCKED)
{
- msg_q_id = 0;
+ msg_q_id = IPC_DATA_AREA_CLEAR;
}
// destination message queue id is lower 32 bits.
msg_q_id &= 0x00000000FFFFFFFFull;
- if(0 != msg_q_id)
+ if(IPC_DATA_AREA_CLEAR != msg_q_id)
{
msg_t * msg = msg_allocate();
isync();
*msg = KernelIpc::ipc_data_area.msg_payload;
lwsync();
- KernelIpc::ipc_data_area.msg_queue_id = 0; // set ready for next msg
+
+ // Signal message has been read, but keep locked/not ready for new msg
+ KernelIpc::ipc_data_area.msg_queue_id = IPC_DATA_AREA_READ;
TRACFCOMP(g_trac_mboxmsg,
"MBOXSP IPC RECV MSG: msg_id:0x%08x",
OpenPOWER on IntegriCloud