46 lines
1.7 KiB
Diff
46 lines
1.7 KiB
Diff
# HG changeset patch
|
|
# User Dongxiao Xu <dongxiao.xu@intel.com>
|
|
# Date 1354813139 0
|
|
# Node ID 90831c29bfde6aac013b7e5ec98934a4953c31c9
|
|
# Parent 25dd352265ca23750f1a1a983124b36f518c4384
|
|
nested vmx: fix interrupt delivery to L2 guest
|
|
|
|
While delivering interrupt into L2 guest, L0 hypervisor need to check
|
|
whether L1 hypervisor wants to own the interrupt, if not, directly
|
|
inject the interrupt into L2 guest.
|
|
|
|
Signed-off-by: Xiantao Zhang <xiantao.zhang@intel.com>
|
|
Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
|
|
Acked-by: Jan Beulich <jbeulich@suse.com>
|
|
Committed-by: Keir Fraser <keir@xen.org>
|
|
|
|
--- a/xen/arch/x86/hvm/vmx/intr.c
|
|
+++ b/xen/arch/x86/hvm/vmx/intr.c
|
|
@@ -163,7 +163,7 @@ enum hvm_intblk nvmx_intr_blocked(struct
|
|
|
|
static int nvmx_intr_intercept(struct vcpu *v, struct hvm_intack intack)
|
|
{
|
|
- u32 exit_ctrl;
|
|
+ u32 ctrl;
|
|
|
|
if ( nvmx_intr_blocked(v) != hvm_intblk_none )
|
|
{
|
|
@@ -176,11 +176,14 @@ static int nvmx_intr_intercept(struct vc
|
|
if ( intack.source == hvm_intsrc_pic ||
|
|
intack.source == hvm_intsrc_lapic )
|
|
{
|
|
+ ctrl = __get_vvmcs(vcpu_nestedhvm(v).nv_vvmcx, PIN_BASED_VM_EXEC_CONTROL);
|
|
+ if ( !(ctrl & PIN_BASED_EXT_INTR_MASK) )
|
|
+ return 0;
|
|
+
|
|
vmx_inject_extint(intack.vector);
|
|
|
|
- exit_ctrl = __get_vvmcs(vcpu_nestedhvm(v).nv_vvmcx,
|
|
- VM_EXIT_CONTROLS);
|
|
- if ( exit_ctrl & VM_EXIT_ACK_INTR_ON_EXIT )
|
|
+ ctrl = __get_vvmcs(vcpu_nestedhvm(v).nv_vvmcx, VM_EXIT_CONTROLS);
|
|
+ if ( ctrl & VM_EXIT_ACK_INTR_ON_EXIT )
|
|
{
|
|
/* for now, duplicate the ack path in vmx_intr_assist */
|
|
hvm_vcpu_ack_pending_irq(v, intack);
|