diff options
Diffstat (limited to 'arch/x86/kvm/i8259.c')
-rw-r--r-- | arch/x86/kvm/i8259.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c index 55e179ad98ef..de704995b819 100644 --- a/arch/x86/kvm/i8259.c +++ b/arch/x86/kvm/i8259.c | |||
@@ -159,9 +159,10 @@ static inline void pic_intack(struct kvm_kpic_state *s, int irq) | |||
159 | s->irr &= ~(1 << irq); | 159 | s->irr &= ~(1 << irq); |
160 | } | 160 | } |
161 | 161 | ||
162 | int kvm_pic_read_irq(struct kvm_pic *s) | 162 | int kvm_pic_read_irq(struct kvm *kvm) |
163 | { | 163 | { |
164 | int irq, irq2, intno; | 164 | int irq, irq2, intno; |
165 | struct kvm_pic *s = pic_irqchip(kvm); | ||
165 | 166 | ||
166 | irq = pic_get_irq(&s->pics[0]); | 167 | irq = pic_get_irq(&s->pics[0]); |
167 | if (irq >= 0) { | 168 | if (irq >= 0) { |
@@ -187,12 +188,21 @@ int kvm_pic_read_irq(struct kvm_pic *s) | |||
187 | intno = s->pics[0].irq_base + irq; | 188 | intno = s->pics[0].irq_base + irq; |
188 | } | 189 | } |
189 | pic_update_irq(s); | 190 | pic_update_irq(s); |
191 | kvm_notify_acked_irq(kvm, irq); | ||
190 | 192 | ||
191 | return intno; | 193 | return intno; |
192 | } | 194 | } |
193 | 195 | ||
194 | void kvm_pic_reset(struct kvm_kpic_state *s) | 196 | void kvm_pic_reset(struct kvm_kpic_state *s) |
195 | { | 197 | { |
198 | int irq; | ||
199 | struct kvm *kvm = s->pics_state->irq_request_opaque; | ||
200 | |||
201 | for (irq = 0; irq < PIC_NUM_PINS; irq++) { | ||
202 | if (!(s->imr & (1 << irq)) && (s->irr & (1 << irq) || | ||
203 | s->isr & (1 << irq))) | ||
204 | kvm_notify_acked_irq(kvm, irq); | ||
205 | } | ||
196 | s->last_irr = 0; | 206 | s->last_irr = 0; |
197 | s->irr = 0; | 207 | s->irr = 0; |
198 | s->imr = 0; | 208 | s->imr = 0; |