diff options
author | Gleb Natapov <gleb@redhat.com> | 2009-08-24 04:54:18 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-12-03 02:32:06 -0500 |
commit | 79c727d4371aa9af47b0cdbcad53742b5a7919ea (patch) | |
tree | 575bbf2e56acb50e036f2019a2632034e6742220 /arch/x86/kvm | |
parent | 851ba6922ac575b749f63dee0ae072808163ba6a (diff) |
KVM: Call pic_clear_isr() on pic reset to reuse logic there
Also move call of ack notifiers after pic state change.
Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm')
-rw-r--r-- | arch/x86/kvm/i8259.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c index 01f151682802..ccc941af4eaf 100644 --- a/arch/x86/kvm/i8259.c +++ b/arch/x86/kvm/i8259.c | |||
@@ -225,22 +225,11 @@ int kvm_pic_read_irq(struct kvm *kvm) | |||
225 | 225 | ||
226 | void kvm_pic_reset(struct kvm_kpic_state *s) | 226 | void kvm_pic_reset(struct kvm_kpic_state *s) |
227 | { | 227 | { |
228 | int irq, irqbase, n; | 228 | int irq; |
229 | struct kvm *kvm = s->pics_state->irq_request_opaque; | 229 | struct kvm *kvm = s->pics_state->irq_request_opaque; |
230 | struct kvm_vcpu *vcpu0 = kvm->bsp_vcpu; | 230 | struct kvm_vcpu *vcpu0 = kvm->bsp_vcpu; |
231 | u8 irr = s->irr, isr = s->imr; | ||
231 | 232 | ||
232 | if (s == &s->pics_state->pics[0]) | ||
233 | irqbase = 0; | ||
234 | else | ||
235 | irqbase = 8; | ||
236 | |||
237 | for (irq = 0; irq < PIC_NUM_PINS/2; irq++) { | ||
238 | if (vcpu0 && kvm_apic_accept_pic_intr(vcpu0)) | ||
239 | if (s->irr & (1 << irq) || s->isr & (1 << irq)) { | ||
240 | n = irq + irqbase; | ||
241 | kvm_notify_acked_irq(kvm, SELECT_PIC(n), n); | ||
242 | } | ||
243 | } | ||
244 | s->last_irr = 0; | 233 | s->last_irr = 0; |
245 | s->irr = 0; | 234 | s->irr = 0; |
246 | s->imr = 0; | 235 | s->imr = 0; |
@@ -256,6 +245,13 @@ void kvm_pic_reset(struct kvm_kpic_state *s) | |||
256 | s->rotate_on_auto_eoi = 0; | 245 | s->rotate_on_auto_eoi = 0; |
257 | s->special_fully_nested_mode = 0; | 246 | s->special_fully_nested_mode = 0; |
258 | s->init4 = 0; | 247 | s->init4 = 0; |
248 | |||
249 | for (irq = 0; irq < PIC_NUM_PINS/2; irq++) { | ||
250 | if (vcpu0 && kvm_apic_accept_pic_intr(vcpu0)) | ||
251 | if (irr & (1 << irq) || isr & (1 << irq)) { | ||
252 | pic_clear_isr(s, irq); | ||
253 | } | ||
254 | } | ||
259 | } | 255 | } |
260 | 256 | ||
261 | static void pic_ioport_write(void *opaque, u32 addr, u32 val) | 257 | static void pic_ioport_write(void *opaque, u32 addr, u32 val) |