[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 4/8] i386: Support KVM_CAP_HYPERV_ENFORCE_CPUID
From: |
Vitaly Kuznetsov |
Subject: |
[PATCH v2 4/8] i386: Support KVM_CAP_HYPERV_ENFORCE_CPUID |
Date: |
Thu, 2 Sep 2021 11:35:26 +0200 |
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>
---
docs/hyperv.txt | 17 ++++++++++++++---
target/i386/cpu.c | 1 +
target/i386/cpu.h | 1 +
target/i386/kvm/kvm.c | 9 +++++++++
4 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/docs/hyperv.txt b/docs/hyperv.txt
index 000638a2fd38..072709a68f47 100644
--- a/docs/hyperv.txt
+++ b/docs/hyperv.txt
@@ -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
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index a70038f172d9..36e1b6ec9c9b 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -6665,6 +6665,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),
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
index 20273a8069dd..8822bea5c9a4 100644
--- a/target/i386/cpu.h
+++ b/target/i386/cpu.h
@@ -1699,6 +1699,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;
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index 49f97f345069..bd0b53416315 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -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;
}
--
2.31.1
- [PATCH v2 0/8] i386: Assorted KVM PV and Hyper-V feature improvements, Vitaly Kuznetsov, 2021/09/02
- [PATCH v2 2/8] i386: docs: Briefly describe KVM PV features, Vitaly Kuznetsov, 2021/09/02
- [PATCH v2 6/8] i386: Implement pseudo 'hv-avic' ('hv-apicv') enlightenment, Vitaly Kuznetsov, 2021/09/02
- [PATCH v2 1/8] i386: Add 6.2 machine types, Vitaly Kuznetsov, 2021/09/02
- [PATCH v2 7/8] i386: Make Hyper-V version id configurable, Vitaly Kuznetsov, 2021/09/02
- [PATCH v2 8/8] i386: Change the default Hyper-V version to match WS2016, Vitaly Kuznetsov, 2021/09/02
- [PATCH v2 5/8] i386: Move HV_APIC_ACCESS_RECOMMENDED bit setting to hyperv_fill_cpuids(), Vitaly Kuznetsov, 2021/09/02
- [PATCH v2 4/8] i386: Support KVM_CAP_HYPERV_ENFORCE_CPUID,
Vitaly Kuznetsov <=
- [PATCH v2 3/8] i386: Support KVM_CAP_ENFORCE_PV_FEATURE_CPUID, Vitaly Kuznetsov, 2021/09/02
- Re: [PATCH v2 0/8] i386: Assorted KVM PV and Hyper-V feature improvements, Vitaly Kuznetsov, 2021/09/17
- Re: [PATCH v2 0/8] i386: Assorted KVM PV and Hyper-V feature improvements, Paolo Bonzini, 2021/09/29