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

Commit e2e871ab authored by Vitaly Kuznetsov's avatar Vitaly Kuznetsov Committed by Paolo Bonzini
Browse files

x86/kvm/hyper-v: Introduce nested_get_evmcs_version() helper



The upcoming KVM_GET_SUPPORTED_HV_CPUID ioctl will need to return
Enlightened VMCS version in HYPERV_CPUID_NESTED_FEATURES.EAX when
it was enabled.

Signed-off-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 220d6586
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1186,6 +1186,7 @@ struct kvm_x86_ops {

	int (*nested_enable_evmcs)(struct kvm_vcpu *vcpu,
				   uint16_t *vmcs_version);
	uint16_t (*nested_get_evmcs_version)(struct kvm_vcpu *vcpu);
};

struct kvm_arch_async_pf {
+7 −0
Original line number Diff line number Diff line
@@ -7047,6 +7047,12 @@ static int svm_unregister_enc_region(struct kvm *kvm,
	return ret;
}

static uint16_t nested_get_evmcs_version(struct kvm_vcpu *vcpu)
{
	/* Not supported */
	return 0;
}

static int nested_enable_evmcs(struct kvm_vcpu *vcpu,
				   uint16_t *vmcs_version)
{
@@ -7185,6 +7191,7 @@ static struct kvm_x86_ops svm_x86_ops __ro_after_init = {
	.mem_enc_unreg_region = svm_unregister_enc_region,

	.nested_enable_evmcs = nested_enable_evmcs,
	.nested_get_evmcs_version = nested_get_evmcs_version,
};

static int __init svm_init(void)
+16 −7
Original line number Diff line number Diff line
@@ -313,19 +313,28 @@ void evmcs_sanitize_exec_ctrls(struct vmcs_config *vmcs_conf)
}
#endif

int nested_enable_evmcs(struct kvm_vcpu *vcpu,
			uint16_t *vmcs_version)
uint16_t nested_get_evmcs_version(struct kvm_vcpu *vcpu)
{
       struct vcpu_vmx *vmx = to_vmx(vcpu);

       /*
        * vmcs_version represents the range of supported Enlightened VMCS
        * versions: lower 8 bits is the minimal version, higher 8 bits is the
        * maximum supported version. KVM supports versions from 1 to
        * KVM_EVMCS_VERSION.
        */
       if (vmx->nested.enlightened_vmcs_enabled)
               return (KVM_EVMCS_VERSION << 8) | 1;

       return 0;
}

int nested_enable_evmcs(struct kvm_vcpu *vcpu,
			uint16_t *vmcs_version)
{
	struct vcpu_vmx *vmx = to_vmx(vcpu);

	if (vmcs_version)
		*vmcs_version = (KVM_EVMCS_VERSION << 8) | 1;
		*vmcs_version = nested_get_evmcs_version(vcpu);

	/* We don't support disabling the feature for simplicity. */
	if (vmx->nested.enlightened_vmcs_enabled)
+1 −0
Original line number Diff line number Diff line
@@ -195,6 +195,7 @@ static inline void evmcs_sanitize_exec_ctrls(struct vmcs_config *vmcs_conf) {}
static inline void evmcs_touch_msr_bitmap(void) {}
#endif /* IS_ENABLED(CONFIG_HYPERV) */

uint16_t nested_get_evmcs_version(struct kvm_vcpu *vcpu);
int nested_enable_evmcs(struct kvm_vcpu *vcpu,
			uint16_t *vmcs_version);

+1 −0
Original line number Diff line number Diff line
@@ -5669,6 +5669,7 @@ __init int nested_vmx_hardware_setup(int (*exit_handlers[])(struct kvm_vcpu *))
	kvm_x86_ops->set_nested_state = vmx_set_nested_state;
	kvm_x86_ops->get_vmcs12_pages = nested_get_vmcs12_pages,
	kvm_x86_ops->nested_enable_evmcs = nested_enable_evmcs;
	kvm_x86_ops->nested_get_evmcs_version = nested_get_evmcs_version;

	return 0;
}