ioapic: Do not set irr for masked edge IRQs
So far we set IRR for edge IRQs even if the pin is masked. If the guest later on unmasks and switches the pin to level-triggered mode, irr will remain set, causing an IRQ storm. The point is that setting IRR is not correct in this case according to the spec, and avoiding this resolves the issue. Reported-and-tested-by: Isaku Yamahata <yamahata@valinux.co.jp> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
661bfc80e8
commit
47f7be394a
@ -160,8 +160,9 @@ static void ioapic_set_irq(void *opaque, int vector, int level)
|
||||
s->irr &= ~mask;
|
||||
}
|
||||
} else {
|
||||
/* edge triggered */
|
||||
if (level) {
|
||||
/* According to the 82093AA manual, we must ignore edge requests
|
||||
* if the input pin is masked. */
|
||||
if (level && !(entry & IOAPIC_LVT_MASKED)) {
|
||||
s->irr |= mask;
|
||||
ioapic_service(s);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user