aboutsummaryrefslogtreecommitdiffstats
path: root/hw
diff options
context:
space:
mode:
authorJan Kiszka <jan.kiszka@siemens.com>2012-01-24 16:29:29 +0100
committerAnthony Liguori <aliguori@us.ibm.com>2012-02-17 09:58:22 -0600
commitaa24822bdc7c4e74afbc6fa1324b01cf067da7cb (patch)
tree169e7b7e85693bef2ed3a9cc677830ff148b8e46 /hw
parent4aa5d2853a69d95f5e05bd02200dfc6f47cab9de (diff)
i8259: Do not clear level-triggered lines in IRR on init
When an input line is handled as level-triggered, it will immediately raise an IRQ on the output of a PIC again that goes through an init reset. So only clear the edge-triggered inputs from IRR in that scenario. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'hw')
-rw-r--r--hw/i8259.c2
-rw-r--r--hw/i8259_common.c2
-rw-r--r--hw/kvm/i8259.c2
3 files changed, 3 insertions, 3 deletions
diff --git a/hw/i8259.c b/hw/i8259.c
index 1a4b1ab0d..53daf7865 100644
--- a/hw/i8259.c
+++ b/hw/i8259.c
@@ -231,8 +231,8 @@ static void pic_reset(DeviceState *dev)
{
PICCommonState *s = DO_UPCAST(PICCommonState, dev.qdev, dev);
- pic_init_reset(s);
s->elcr = 0;
+ pic_init_reset(s);
}
static void pic_ioport_write(void *opaque, target_phys_addr_t addr64,
diff --git a/hw/i8259_common.c b/hw/i8259_common.c
index 775fda453..ab3d98b2a 100644
--- a/hw/i8259_common.c
+++ b/hw/i8259_common.c
@@ -28,7 +28,7 @@
void pic_reset_common(PICCommonState *s)
{
s->last_irr = 0;
- s->irr = 0;
+ s->irr &= s->elcr;
s->imr = 0;
s->isr = 0;
s->priority_add = 0;
diff --git a/hw/kvm/i8259.c b/hw/kvm/i8259.c
index eb9888932..94d1b9aa9 100644
--- a/hw/kvm/i8259.c
+++ b/hw/kvm/i8259.c
@@ -84,8 +84,8 @@ static void kvm_pic_reset(DeviceState *dev)
{
PICCommonState *s = DO_UPCAST(PICCommonState, dev.qdev, dev);
- pic_reset_common(s);
s->elcr = 0;
+ pic_reset_common(s);
kvm_pic_put(s);
}