diff options
author | Gleb Natapov <gleb@redhat.com> | 2012-09-03 07:47:25 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2012-09-04 07:53:51 -0400 |
commit | ec798660cf72c981ad8eed272487a0fe2b3222f2 (patch) | |
tree | 8fb04f506e24fde562b8910f26fba038f04bb6b9 | |
parent | 9a7819774e4236e8736a074b7e85276967911924 (diff) |
KVM: cleanup pic reset
kvm_pic_reset() is not used anywhere. Move reset logic from
pic_ioport_write() there.
Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r-- | arch/x86/kvm/i8259.c | 52 |
1 files changed, 11 insertions, 41 deletions
diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c index 90c84f947d45..848206df0967 100644 --- a/arch/x86/kvm/i8259.c +++ b/arch/x86/kvm/i8259.c | |||
@@ -275,23 +275,20 @@ void kvm_pic_reset(struct kvm_kpic_state *s) | |||
275 | { | 275 | { |
276 | int irq, i; | 276 | int irq, i; |
277 | struct kvm_vcpu *vcpu; | 277 | struct kvm_vcpu *vcpu; |
278 | u8 irr = s->irr, isr = s->imr; | 278 | u8 edge_irr = s->irr & ~s->elcr; |
279 | bool found = false; | 279 | bool found = false; |
280 | 280 | ||
281 | s->last_irr = 0; | 281 | s->last_irr = 0; |
282 | s->irr = 0; | 282 | s->irr &= s->elcr; |
283 | s->imr = 0; | 283 | s->imr = 0; |
284 | s->isr = 0; | ||
285 | s->priority_add = 0; | 284 | s->priority_add = 0; |
286 | s->irq_base = 0; | ||
287 | s->read_reg_select = 0; | ||
288 | s->poll = 0; | ||
289 | s->special_mask = 0; | 285 | s->special_mask = 0; |
290 | s->init_state = 0; | 286 | s->read_reg_select = 0; |
291 | s->auto_eoi = 0; | 287 | if (!s->init4) { |
292 | s->rotate_on_auto_eoi = 0; | 288 | s->special_fully_nested_mode = 0; |
293 | s->special_fully_nested_mode = 0; | 289 | s->auto_eoi = 0; |
294 | s->init4 = 0; | 290 | } |
291 | s->init_state = 1; | ||
295 | 292 | ||
296 | kvm_for_each_vcpu(i, vcpu, s->pics_state->kvm) | 293 | kvm_for_each_vcpu(i, vcpu, s->pics_state->kvm) |
297 | if (kvm_apic_accept_pic_intr(vcpu)) { | 294 | if (kvm_apic_accept_pic_intr(vcpu)) { |
@@ -304,7 +301,7 @@ void kvm_pic_reset(struct kvm_kpic_state *s) | |||
304 | return; | 301 | return; |
305 | 302 | ||
306 | for (irq = 0; irq < PIC_NUM_PINS/2; irq++) | 303 | for (irq = 0; irq < PIC_NUM_PINS/2; irq++) |
307 | if (irr & (1 << irq) || isr & (1 << irq)) | 304 | if (edge_irr & (1 << irq)) |
308 | pic_clear_isr(s, irq); | 305 | pic_clear_isr(s, irq); |
309 | } | 306 | } |
310 | 307 | ||
@@ -316,40 +313,13 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val) | |||
316 | addr &= 1; | 313 | addr &= 1; |
317 | if (addr == 0) { | 314 | if (addr == 0) { |
318 | if (val & 0x10) { | 315 | if (val & 0x10) { |
319 | u8 edge_irr = s->irr & ~s->elcr; | ||
320 | int i; | ||
321 | bool found; | ||
322 | struct kvm_vcpu *vcpu; | ||
323 | |||
324 | s->init4 = val & 1; | 316 | s->init4 = val & 1; |
325 | s->last_irr = 0; | ||
326 | s->irr &= s->elcr; | ||
327 | s->imr = 0; | ||
328 | s->priority_add = 0; | ||
329 | s->special_mask = 0; | ||
330 | s->read_reg_select = 0; | ||
331 | if (!s->init4) { | ||
332 | s->special_fully_nested_mode = 0; | ||
333 | s->auto_eoi = 0; | ||
334 | } | ||
335 | s->init_state = 1; | ||
336 | if (val & 0x02) | 317 | if (val & 0x02) |
337 | pr_pic_unimpl("single mode not supported"); | 318 | pr_pic_unimpl("single mode not supported"); |
338 | if (val & 0x08) | 319 | if (val & 0x08) |
339 | pr_pic_unimpl( | 320 | pr_pic_unimpl( |
340 | "level sensitive irq not supported"); | 321 | "level sensitive irq not supported"); |
341 | 322 | kvm_pic_reset(s); | |
342 | kvm_for_each_vcpu(i, vcpu, s->pics_state->kvm) | ||
343 | if (kvm_apic_accept_pic_intr(vcpu)) { | ||
344 | found = true; | ||
345 | break; | ||
346 | } | ||
347 | |||
348 | |||
349 | if (found) | ||
350 | for (irq = 0; irq < PIC_NUM_PINS/2; irq++) | ||
351 | if (edge_irr & (1 << irq)) | ||
352 | pic_clear_isr(s, irq); | ||
353 | } else if (val & 0x08) { | 323 | } else if (val & 0x08) { |
354 | if (val & 0x04) | 324 | if (val & 0x04) |
355 | s->poll = 1; | 325 | s->poll = 1; |