diff options
Diffstat (limited to 'arch/x86/kvm/svm/nested.c')
| -rw-r--r-- | arch/x86/kvm/svm/nested.c | 13 | 
1 files changed, 10 insertions, 3 deletions
diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c index 61738ff8ef33..e5515477c30a 100644 --- a/arch/x86/kvm/svm/nested.c +++ b/arch/x86/kvm/svm/nested.c @@ -158,6 +158,9 @@ void recalc_intercepts(struct vcpu_svm *svm)  	/* If SMI is not intercepted, ignore guest SMI intercept as well  */  	if (!intercept_smi)  		vmcb_clr_intercept(c, INTERCEPT_SMI); + +	vmcb_set_intercept(c, INTERCEPT_VMLOAD); +	vmcb_set_intercept(c, INTERCEPT_VMSAVE);  }  static void copy_vmcb_control_area(struct vmcb_control_area *dst, @@ -503,7 +506,11 @@ static void nested_vmcb02_prepare_save(struct vcpu_svm *svm, struct vmcb *vmcb12  static void nested_vmcb02_prepare_control(struct vcpu_svm *svm)  { -	const u32 mask = V_INTR_MASKING_MASK | V_GIF_ENABLE_MASK | V_GIF_MASK; +	const u32 int_ctl_vmcb01_bits = +		V_INTR_MASKING_MASK | V_GIF_MASK | V_GIF_ENABLE_MASK; + +	const u32 int_ctl_vmcb12_bits = V_TPR_MASK | V_IRQ_INJECTION_BITS_MASK; +  	struct kvm_vcpu *vcpu = &svm->vcpu;  	/* @@ -535,8 +542,8 @@ static void nested_vmcb02_prepare_control(struct vcpu_svm *svm)  		vcpu->arch.l1_tsc_offset + svm->nested.ctl.tsc_offset;  	svm->vmcb->control.int_ctl             = -		(svm->nested.ctl.int_ctl & ~mask) | -		(svm->vmcb01.ptr->control.int_ctl & mask); +		(svm->nested.ctl.int_ctl & int_ctl_vmcb12_bits) | +		(svm->vmcb01.ptr->control.int_ctl & int_ctl_vmcb01_bits);  	svm->vmcb->control.virt_ext            = svm->nested.ctl.virt_ext;  	svm->vmcb->control.int_vector          = svm->nested.ctl.int_vector;  | 
