]> Git Repo - qemu.git/commitdiff
openpic: Reset IRQ source private members
authorPaul Janzen <[email protected]>
Thu, 22 May 2014 06:09:45 +0000 (23:09 -0700)
committerAlexander Graf <[email protected]>
Mon, 16 Jun 2014 11:24:36 +0000 (13:24 +0200)
The openpic emulation code maintains an allowable-CPU's bitmap
("destmask") for each IRQ source which is calculated from the IDR
register value whenever the guest OS writes to it.  However, if the
guest OS relies on the system to set the IDR register to a default
value at reset, and does not write IDR, then destmask does not get
updated, and interrupts do not get propagated to the guest.
Additionally, if an IRQ source is marked as critical, the source's
internal "output" and "nomask" fields are not correctly reset when the
PIC is reset.

Fix both these issues by calling write_IRQreg_idr from within
openpic_reset, instead of simply setting the IDR register to the
specified idr_reset value.

Signed-off-by: Paul Janzen <[email protected]>
Signed-off-by: Alexander Graf <[email protected]>
hw/intc/openpic.c

index 3cee00cc74618d5fed3e9c3533e24eb69a81da56..028529e13d220ae7be2a38ab30ebc6fdd696ab66 100644 (file)
@@ -1430,8 +1430,6 @@ static void openpic_reset(DeviceState *d)
     /* Initialise IRQ sources */
     for (i = 0; i < opp->max_irq; i++) {
         opp->src[i].ivpr = opp->ivpr_reset;
-        opp->src[i].idr  = opp->idr_reset;
-
         switch (opp->src[i].type) {
         case IRQ_TYPE_NORMAL:
             opp->src[i].level = !!(opp->ivpr_reset & IVPR_SENSE_MASK);
@@ -1444,6 +1442,8 @@ static void openpic_reset(DeviceState *d)
         case IRQ_TYPE_FSLSPECIAL:
             break;
         }
+
+        write_IRQreg_idr(opp, i, opp->idr_reset);
     }
     /* Initialise IRQ destinations */
     for (i = 0; i < MAX_CPU; i++) {
This page took 0.029652 seconds and 4 git commands to generate.