i386: Support KVM_CAP_HYPERV_ENFORCE_CPUID
By default, KVM allows the guest to use all currently supported Hyper-V enlightenments when Hyper-V CPUID interface was exposed, regardless of if some features were not announced in guest visible CPUIDs. hv-enforce-cpuid feature alters this behavior and only allows the guest to use exposed Hyper-V enlightenments. The feature is supported by Linux >= 5.14 and is not enabled by default in QEMU. Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> Message-Id: <20210902093530.345756-5-vkuznets@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
988f7b8bfe
commit
70367f0917
@ -203,8 +203,11 @@ When the option is set to 'on' QEMU will always enable the feature, regardless
|
||||
of host setup. To keep guests secure, this can only be used in conjunction with
|
||||
exposing correct vCPU topology and vCPU pinning.
|
||||
|
||||
4. Development features
|
||||
========================
|
||||
4. Supplementary features
|
||||
=========================
|
||||
|
||||
4.1. hv-passthrough
|
||||
===================
|
||||
In some cases (e.g. during development) it may make sense to use QEMU in
|
||||
'pass-through' mode and give Windows guests all enlightenments currently
|
||||
supported by KVM. This pass-through mode is enabled by "hv-passthrough" CPU
|
||||
@ -215,8 +218,16 @@ values from KVM to QEMU. "hv-passthrough" overrides all other "hv-*" settings on
|
||||
the command line. Also, enabling this flag effectively prevents migration as the
|
||||
list of enabled enlightenments may differ between target and destination hosts.
|
||||
|
||||
4.2. hv-enforce-cpuid
|
||||
=====================
|
||||
By default, KVM allows the guest to use all currently supported Hyper-V
|
||||
enlightenments when Hyper-V CPUID interface was exposed, regardless of if
|
||||
some features were not announced in guest visible CPUIDs. 'hv-enforce-cpuid'
|
||||
feature alters this behavior and only allows the guest to use exposed Hyper-V
|
||||
enlightenments.
|
||||
|
||||
4. Useful links
|
||||
|
||||
5. Useful links
|
||||
================
|
||||
Hyper-V Top Level Functional specification and other information:
|
||||
https://github.com/MicrosoftDocs/Virtualization-Documentation
|
||||
|
@ -6834,6 +6834,7 @@ static Property x86_cpu_properties[] = {
|
||||
DEFINE_PROP_ON_OFF_AUTO("hv-no-nonarch-coresharing", X86CPU,
|
||||
hyperv_no_nonarch_cs, ON_OFF_AUTO_OFF),
|
||||
DEFINE_PROP_BOOL("hv-passthrough", X86CPU, hyperv_passthrough, false),
|
||||
DEFINE_PROP_BOOL("hv-enforce-cpuid", X86CPU, hyperv_enforce_cpuid, false),
|
||||
|
||||
DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true),
|
||||
DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
|
||||
|
@ -1719,6 +1719,7 @@ struct X86CPU {
|
||||
uint32_t hyperv_version_id[4];
|
||||
uint32_t hyperv_limits[3];
|
||||
uint32_t hyperv_nested[4];
|
||||
bool hyperv_enforce_cpuid;
|
||||
|
||||
bool check_cpuid;
|
||||
bool enforce_cpuid;
|
||||
|
@ -1531,6 +1531,15 @@ static int hyperv_init_vcpu(X86CPU *cpu)
|
||||
cpu->hyperv_nested[0] = evmcs_version;
|
||||
}
|
||||
|
||||
if (cpu->hyperv_enforce_cpuid) {
|
||||
ret = kvm_vcpu_enable_cap(cs, KVM_CAP_HYPERV_ENFORCE_CPUID, 0, 1);
|
||||
if (ret < 0) {
|
||||
error_report("failed to enable KVM_CAP_HYPERV_ENFORCE_CPUID: %s",
|
||||
strerror(-ret));
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user