From: Hollis Blanchard Date: Fri, 28 Mar 2008 02:49:39 +0000 Subject: [kvm-ppc-devel] [PATCH 3 of 4] [qemu ppc uic] Remember the state of Message-Id: <5c61aade5a1cfeecc270.1206672579@basalt> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: kvm-ppc@vger.kernel.org 2 files changed, 9 insertions(+), 2 deletions(-) qemu/hw/i8254.c | 2 ++ qemu/hw/ppc4xx_devs.c | 9 +++++++-- # HG changeset patch # User Hollis Blanchard # 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. Signed-off-by: Hollis Blanchard diff --git a/qemu/hw/i8254.c b/qemu/hw/i8254.c --- a/qemu/hw/i8254.c +++ b/qemu/hw/i8254.c @@ -27,6 +27,8 @@ #include "qemu-timer.h" #include "qemu-kvm.h" + +#undef KVM_CAP_PIT //#define DEBUG_PIT diff --git a/qemu/hw/ppc4xx_devs.c b/qemu/hw/ppc4xx_devs.c --- a/qemu/hw/ppc4xx_devs.c +++ b/qemu/hw/ppc4xx_devs.c @@ -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 kvm-ppc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-ppc-devel