diff options
author | Marcelo Tosatti <mtosatti@redhat.com> | 2008-07-26 16:01:00 -0400 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2008-10-15 04:15:16 -0400 |
commit | f52447261bc8c21dfd4635196e32d2da1352f589 (patch) | |
tree | a0de6cefa7fbfdd07285bd60c4f61e4e2f2d4ed6 /arch/x86/kvm/lapic.c | |
parent | 564f15378f04921d5749f27ec53d5e68a6d1d446 (diff) |
KVM: irq ack notification
Based on a patch from: Ben-Ami Yassour <benami@il.ibm.com>
which was based on a patch from: Amit Shah <amit.shah@qumranet.com>
Notify IRQ acking on PIC/APIC emulation. The previous patch missed two things:
- Edge triggered interrupts on IOAPIC
- PIC reset with IRR/ISR set should be equivalent to ack (LAPIC probably
needs something similar).
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
CC: Amit Shah <amit.shah@qumranet.com>
CC: Ben-Ami Yassour <benami@il.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'arch/x86/kvm/lapic.c')
-rw-r--r-- | arch/x86/kvm/lapic.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 9fde0ac24268..be94f93a73f6 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c | |||
@@ -439,7 +439,7 @@ struct kvm_vcpu *kvm_get_lowest_prio_vcpu(struct kvm *kvm, u8 vector, | |||
439 | static void apic_set_eoi(struct kvm_lapic *apic) | 439 | static void apic_set_eoi(struct kvm_lapic *apic) |
440 | { | 440 | { |
441 | int vector = apic_find_highest_isr(apic); | 441 | int vector = apic_find_highest_isr(apic); |
442 | 442 | int trigger_mode; | |
443 | /* | 443 | /* |
444 | * Not every write EOI will has corresponding ISR, | 444 | * Not every write EOI will has corresponding ISR, |
445 | * one example is when Kernel check timer on setup_IO_APIC | 445 | * one example is when Kernel check timer on setup_IO_APIC |
@@ -451,7 +451,10 @@ static void apic_set_eoi(struct kvm_lapic *apic) | |||
451 | apic_update_ppr(apic); | 451 | apic_update_ppr(apic); |
452 | 452 | ||
453 | if (apic_test_and_clear_vector(vector, apic->regs + APIC_TMR)) | 453 | if (apic_test_and_clear_vector(vector, apic->regs + APIC_TMR)) |
454 | kvm_ioapic_update_eoi(apic->vcpu->kvm, vector); | 454 | trigger_mode = IOAPIC_LEVEL_TRIG; |
455 | else | ||
456 | trigger_mode = IOAPIC_EDGE_TRIG; | ||
457 | kvm_ioapic_update_eoi(apic->vcpu->kvm, vector, trigger_mode); | ||
455 | } | 458 | } |
456 | 459 | ||
457 | static void apic_send_ipi(struct kvm_lapic *apic) | 460 | static void apic_send_ipi(struct kvm_lapic *apic) |