Skip to contentSkip to conversation

Remember the state of

PATCH New Hollis Blanchard 1 participant 1 message Mar 28, 2008

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Remember the state of

2 files changed, 9 insertions(+), 2 deletions(-)
qemu/hw/i8254.c       |    2 ++
qemu/hw/ppc4xx_devs.c |    9 +++++++--

# HG changeset patch
# User Hollis Blanchard <[email protected]>
# Date 1206672261 18000
# Branch merge
# Node ID 5c61aade5a1cfeecc270f4c0c176709a3a611e87
# Parent 86c8ce190142bc39927ffaf0cfd8773f04a35086 [qemu ppc uic] Remember the state of level-triggered interrupts.

This fixes the following race condition:
1. target handles an interrupt and begins to EOI
2. device raises an interrupt, setting UIC SR
3. target finishes EOI by clearing SR bit

On hardware, a device with a level-triggered interrupt would instantly re-assert SR after step 3, so we need to do the same.

qemu/hw/i8254.c +2 -0
@@ -27,6 +27,8 @@
 #include "qemu-timer.h"
 
 #include "qemu-kvm.h"
+
+#undef KVM_CAP_PIT
 
 //#define DEBUG_PIT
 
qemu/hw/ppc4xx_devs.c +7 -2
@@ -278,6 +278,7 @@ struct ppcuic_t {
 struct ppcuic_t {
     uint32_t dcr_base;
     int use_vectors;
+    uint32_t level;  /* Remembers the state of level-triggered interrupts. */
     uint32_t uicsr;  /* Status register */
     uint32_t uicer;  /* Enable register */
     uint32_t uiccr;  /* Critical register */
@@ -385,10 +386,13 @@ static void ppcuic_set_irq (void *opaque
             uic->uicsr |= mask;
     } else {
         /* Level sensitive interrupt */
-        if (level = 1)
+        if (level = 1) {
             uic->uicsr |= mask;
-        else
+            uic->level |= mask;
+        } else {
             uic->uicsr &= ~mask;
+            uic->level &= ~mask;
+	}
     }
 #ifdef DEBUG_UIC
     if (loglevel & CPU_LOG_INT) {
@@ -460,6 +464,7 @@ static void dcr_write_uic (void *opaque,
     switch (dcrn) {
     case DCR_UICSR:
         uic->uicsr &= ~val;
+        uic->uicsr |= uic->level;
         ppcuic_trigger_irq(uic);
         break;
     case DCR_UICSRS:

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
_______________________________________________
kvm-ppc-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/kvm-ppc-devel