Loading virt/kvm/ioapic.c +10 −8 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val) { unsigned index; bool mask_before, mask_after; union kvm_ioapic_redirect_entry *e; switch (ioapic->ioregsel) { case IOAPIC_REG_VERSION: Loading @@ -122,19 +123,20 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val) ioapic_debug("change redir index %x val %x\n", index, val); if (index >= IOAPIC_NUM_PINS) return; mask_before = ioapic->redirtbl[index].fields.mask; e = &ioapic->redirtbl[index]; mask_before = e->fields.mask; if (ioapic->ioregsel & 1) { ioapic->redirtbl[index].bits &= 0xffffffff; ioapic->redirtbl[index].bits |= (u64) val << 32; e->bits &= 0xffffffff; e->bits |= (u64) val << 32; } else { ioapic->redirtbl[index].bits &= ~0xffffffffULL; ioapic->redirtbl[index].bits |= (u32) val; ioapic->redirtbl[index].fields.remote_irr = 0; e->bits &= ~0xffffffffULL; e->bits |= (u32) val; e->fields.remote_irr = 0; } mask_after = ioapic->redirtbl[index].fields.mask; mask_after = e->fields.mask; if (mask_before != mask_after) kvm_fire_mask_notifiers(ioapic->kvm, index, mask_after); if (ioapic->redirtbl[index].fields.trig_mode == IOAPIC_LEVEL_TRIG if (e->fields.trig_mode == IOAPIC_LEVEL_TRIG && ioapic->irr & (1 << index)) ioapic_service(ioapic, index); break; Loading Loading
virt/kvm/ioapic.c +10 −8 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val) { unsigned index; bool mask_before, mask_after; union kvm_ioapic_redirect_entry *e; switch (ioapic->ioregsel) { case IOAPIC_REG_VERSION: Loading @@ -122,19 +123,20 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val) ioapic_debug("change redir index %x val %x\n", index, val); if (index >= IOAPIC_NUM_PINS) return; mask_before = ioapic->redirtbl[index].fields.mask; e = &ioapic->redirtbl[index]; mask_before = e->fields.mask; if (ioapic->ioregsel & 1) { ioapic->redirtbl[index].bits &= 0xffffffff; ioapic->redirtbl[index].bits |= (u64) val << 32; e->bits &= 0xffffffff; e->bits |= (u64) val << 32; } else { ioapic->redirtbl[index].bits &= ~0xffffffffULL; ioapic->redirtbl[index].bits |= (u32) val; ioapic->redirtbl[index].fields.remote_irr = 0; e->bits &= ~0xffffffffULL; e->bits |= (u32) val; e->fields.remote_irr = 0; } mask_after = ioapic->redirtbl[index].fields.mask; mask_after = e->fields.mask; if (mask_before != mask_after) kvm_fire_mask_notifiers(ioapic->kvm, index, mask_after); if (ioapic->redirtbl[index].fields.trig_mode == IOAPIC_LEVEL_TRIG if (e->fields.trig_mode == IOAPIC_LEVEL_TRIG && ioapic->irr & (1 << index)) ioapic_service(ioapic, index); break; Loading