aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorGleb Natapov <gleb@redhat.com>2009-08-24 04:54:18 -0400
committerAvi Kivity <avi@redhat.com>2009-12-03 02:32:06 -0500
commit79c727d4371aa9af47b0cdbcad53742b5a7919ea (patch)
tree575bbf2e56acb50e036f2019a2632034e6742220 /arch/x86
parent851ba6922ac575b749f63dee0ae072808163ba6a (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')
-rw-r--r--arch/x86/kvm/i8259.c22
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
226void kvm_pic_reset(struct kvm_kpic_state *s) 226void 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
261static void pic_ioport_write(void *opaque, u32 addr, u32 val) 257static void pic_ioport_write(void *opaque, u32 addr, u32 val)