]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
hw/intc/arm_gic: Fix GIC_SET_LEVEL
authorChristoffer Dall <christoffer.dall@linaro.org>
Wed, 26 Feb 2014 17:19:59 +0000 (17:19 +0000)
committerMichael Roth <mdroth@linux.vnet.ibm.com>
Thu, 27 Feb 2014 15:38:42 +0000 (09:38 -0600)
The GIC_SET_LEVEL macro unfortunately overwrote the entire level
bitmask instead of just or'ing on the necessary bits, causing active
level PPIs on a core to clear PPIs on other cores.

Cc: qemu-stable@nongnu.org
Reported-by: Rob Herring <rob.herring@linaro.org>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
Message-id: 1393031030-8692-1-git-send-email-christoffer.dall@linaro.org
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
(cherry picked from commit 6453fa998a11e133e673c0a613b88484a8231d1d)

Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
hw/intc/gic_internal.h

index 3989fd1bd54361b97b4c5e7ee05bf09227b1227e..25107cef3933456563f0e1d084ae8a601ff4b2a8 100644 (file)
@@ -41,7 +41,7 @@
 #define GIC_SET_MODEL(irq) s->irq_state[irq].model = true
 #define GIC_CLEAR_MODEL(irq) s->irq_state[irq].model = false
 #define GIC_TEST_MODEL(irq) s->irq_state[irq].model
-#define GIC_SET_LEVEL(irq, cm) s->irq_state[irq].level = (cm)
+#define GIC_SET_LEVEL(irq, cm) s->irq_state[irq].level |= (cm)
 #define GIC_CLEAR_LEVEL(irq, cm) s->irq_state[irq].level &= ~(cm)
 #define GIC_TEST_LEVEL(irq, cm) ((s->irq_state[irq].level & (cm)) != 0)
 #define GIC_SET_TRIGGER(irq) s->irq_state[irq].trigger = true