summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/intmsghandler.C14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/kernel/intmsghandler.C b/src/kernel/intmsghandler.C
index 4a9ae26e7..03b8996d3 100644
--- a/src/kernel/intmsghandler.C
+++ b/src/kernel/intmsghandler.C
@@ -139,6 +139,20 @@ void InterruptMsgHdlr::handleInterrupt()
// by writing the xirr back with the value read.
printk("XIRR @ %lx = %x\n",xirrAddress,xirr);
+
+ //If this is an IPI -- clean it up
+ if((xirr & 0x00FFFFFF) == INTERPROC_XISR)
+ {
+ uint64_t mfrrAddress =
+ cv_ipc_base_address + mmio_offset(pir) + MFRR_ADDR_OFFSET;
+
+ // Ignore HRMOR setting
+ mfrrAddress |= 0x8000000000000000ul;
+ uint8_t mfrr = 0xFF;
+
+ asm volatile("stbcix %0,0,%1" :: "r" (mfrr) , "r" (mfrrAddress));
+ asm volatile("stwcix %0,0,%1" :: "r" (xirr) , "r" (xirrAddress));
+ }
}
}
OpenPOWER on IntegriCloud