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
|
of host setup. To keep guests secure, this can only be used in conjunction with
|
||||||
exposing correct vCPU topology and vCPU pinning.
|
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
|
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
|
'pass-through' mode and give Windows guests all enlightenments currently
|
||||||
supported by KVM. This pass-through mode is enabled by "hv-passthrough" CPU
|
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
|
the command line. Also, enabling this flag effectively prevents migration as the
|
||||||
list of enabled enlightenments may differ between target and destination hosts.
|
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:
|
Hyper-V Top Level Functional specification and other information:
|
||||||
https://github.com/MicrosoftDocs/Virtualization-Documentation
|
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,
|
DEFINE_PROP_ON_OFF_AUTO("hv-no-nonarch-coresharing", X86CPU,
|
||||||
hyperv_no_nonarch_cs, ON_OFF_AUTO_OFF),
|
hyperv_no_nonarch_cs, ON_OFF_AUTO_OFF),
|
||||||
DEFINE_PROP_BOOL("hv-passthrough", X86CPU, hyperv_passthrough, false),
|
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("check", X86CPU, check_cpuid, true),
|
||||||
DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
|
DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
|
||||||
|
@ -1719,6 +1719,7 @@ struct X86CPU {
|
|||||||
uint32_t hyperv_version_id[4];
|
uint32_t hyperv_version_id[4];
|
||||||
uint32_t hyperv_limits[3];
|
uint32_t hyperv_limits[3];
|
||||||
uint32_t hyperv_nested[4];
|
uint32_t hyperv_nested[4];
|
||||||
|
bool hyperv_enforce_cpuid;
|
||||||
|
|
||||||
bool check_cpuid;
|
bool check_cpuid;
|
||||||
bool enforce_cpuid;
|
bool enforce_cpuid;
|
||||||
|
@ -1531,6 +1531,15 @@ static int hyperv_init_vcpu(X86CPU *cpu)
|
|||||||
cpu->hyperv_nested[0] = evmcs_version;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user