diff options
Diffstat (limited to 'src/kernel')
-rw-r--r-- | src/kernel/intmsghandler.C | 14 |
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)); + } } } |