Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3b84080b authored by Haozhong Zhang's avatar Haozhong Zhang Committed by Paolo Bonzini
Browse files

KVM: VMX: move msr_ia32_feature_control to vcpu_vmx



msr_ia32_feature_control will be used for LMCE and not depend only on
nested anymore, so move it from struct nested_vmx to struct vcpu_vmx.

Signed-off-by: default avatarHaozhong Zhang <haozhong.zhang@intel.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 8ff7b956
Loading
Loading
Loading
Loading
+6 −7
Original line number Original line Diff line number Diff line
@@ -428,7 +428,6 @@ struct nested_vmx {
	struct pi_desc *pi_desc;
	struct pi_desc *pi_desc;
	bool pi_pending;
	bool pi_pending;
	u16 posted_intr_nv;
	u16 posted_intr_nv;
	u64 msr_ia32_feature_control;


	struct hrtimer preemption_timer;
	struct hrtimer preemption_timer;
	bool preemption_timer_expired;
	bool preemption_timer_expired;
@@ -612,6 +611,8 @@ struct vcpu_vmx {
	bool guest_pkru_valid;
	bool guest_pkru_valid;
	u32 guest_pkru;
	u32 guest_pkru;
	u32 host_pkru;
	u32 host_pkru;

	u64 msr_ia32_feature_control;
};
};


enum segment_cache_field {
enum segment_cache_field {
@@ -2970,9 +2971,7 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
		msr_info->data = vmcs_read64(GUEST_BNDCFGS);
		msr_info->data = vmcs_read64(GUEST_BNDCFGS);
		break;
		break;
	case MSR_IA32_FEATURE_CONTROL:
	case MSR_IA32_FEATURE_CONTROL:
		if (!nested_vmx_allowed(vcpu))
		msr_info->data = to_vmx(vcpu)->msr_ia32_feature_control;
			return 1;
		msr_info->data = to_vmx(vcpu)->nested.msr_ia32_feature_control;
		break;
		break;
	case MSR_IA32_VMX_BASIC ... MSR_IA32_VMX_VMFUNC:
	case MSR_IA32_VMX_BASIC ... MSR_IA32_VMX_VMFUNC:
		if (!nested_vmx_allowed(vcpu))
		if (!nested_vmx_allowed(vcpu))
@@ -3064,10 +3063,10 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
		break;
		break;
	case MSR_IA32_FEATURE_CONTROL:
	case MSR_IA32_FEATURE_CONTROL:
		if (!nested_vmx_allowed(vcpu) ||
		if (!nested_vmx_allowed(vcpu) ||
		    (to_vmx(vcpu)->nested.msr_ia32_feature_control &
		    (to_vmx(vcpu)->msr_ia32_feature_control &
		     FEATURE_CONTROL_LOCKED && !msr_info->host_initiated))
		     FEATURE_CONTROL_LOCKED && !msr_info->host_initiated))
			return 1;
			return 1;
		vmx->nested.msr_ia32_feature_control = data;
		vmx->msr_ia32_feature_control = data;
		if (msr_info->host_initiated && data == 0)
		if (msr_info->host_initiated && data == 0)
			vmx_leave_nested(vcpu);
			vmx_leave_nested(vcpu);
		break;
		break;
@@ -6939,7 +6938,7 @@ static int handle_vmon(struct kvm_vcpu *vcpu)
		return 1;
		return 1;
	}
	}


	if ((vmx->nested.msr_ia32_feature_control & VMXON_NEEDED_FEATURES)
	if ((vmx->msr_ia32_feature_control & VMXON_NEEDED_FEATURES)
			!= VMXON_NEEDED_FEATURES) {
			!= VMXON_NEEDED_FEATURES) {
		kvm_inject_gp(vcpu, 0);
		kvm_inject_gp(vcpu, 0);
		return 1;
		return 1;