diff options
Diffstat (limited to 'arch/x86/kvm')
-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 819b748a33f..8d10c063d7f 100644 --- a/arch/x86/kvm/i8259.c +++ b/arch/x86/kvm/i8259.c | |||
@@ -363,10 +363,20 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val) | |||
363 | } | 363 | } |
364 | } else | 364 | } else |
365 | switch (s->init_state) { | 365 | switch (s->init_state) { |
366 | case 0: /* normal mode */ | 366 | case 0: { /* normal mode */ |
367 | u8 imr_diff = s->imr ^ val, | ||
368 | off = (s == &s->pics_state->pics[0]) ? 0 : 8; | ||
367 | s->imr = val; | 369 | s->imr = val; |
370 | for (irq = 0; irq < PIC_NUM_PINS/2; irq++) | ||
371 | if (imr_diff & (1 << irq)) | ||
372 | kvm_fire_mask_notifiers( | ||
373 | s->pics_state->kvm, | ||
374 | SELECT_PIC(irq + off), | ||
375 | irq + off, | ||
376 | !!(s->imr & (1 << irq))); | ||
368 | pic_update_irq(s->pics_state); | 377 | pic_update_irq(s->pics_state); |
369 | break; | 378 | break; |
379 | } | ||
370 | case 1: | 380 | case 1: |
371 | s->irq_base = val & 0xf8; | 381 | s->irq_base = val & 0xf8; |
372 | s->init_state = 2; | 382 | s->init_state = 2; |