diff --git a/xen/arch/x86/hvm/irq.c b/xen/arch/x86/hvm/irq.c index 52aae4565f..4da12c932e 100644 --- a/xen/arch/x86/hvm/irq.c +++ b/xen/arch/x86/hvm/irq.c @@ -321,9 +321,10 @@ void hvm_assert_evtchn_irq(struct vcpu *v) if ( v->arch.hvm.evtchn_upcall_vector != 0 ) { - uint8_t vector = v->arch.hvm.evtchn_upcall_vector; + struct vlapic *vlapic = vcpu_vlapic(v); - vlapic_set_irq(vcpu_vlapic(v), vector, 0); + if ( vlapic_enabled(vlapic) ) + vlapic_set_irq(vlapic, v->arch.hvm.evtchn_upcall_vector, 0); } else if ( is_hvm_pv_evtchn_vcpu(v) ) vcpu_kick(v); diff --git a/xen/arch/x86/hvm/vlapic.c b/xen/arch/x86/hvm/vlapic.c index b8c84458ff..a51f172128 100644 --- a/xen/arch/x86/hvm/vlapic.c +++ b/xen/arch/x86/hvm/vlapic.c @@ -828,6 +828,9 @@ void vlapic_reg_write(struct vcpu *v, unsigned int reg, uint32_t val) { vlapic->hw.disabled &= ~VLAPIC_SW_DISABLED; pt_may_unmask_irq(vlapic_domain(vlapic), &vlapic->pt); + if ( v->arch.hvm.evtchn_upcall_vector && + vcpu_info(v, evtchn_upcall_pending) ) + vlapic_set_irq(vlapic, v->arch.hvm.evtchn_upcall_vector, 0); } break;