[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 18/30] i386: Support KVM_CAP_HYPERV_ENFORCE_CPUID
From: |
Paolo Bonzini |
Subject: |
[PULL 18/30] i386: Support KVM_CAP_HYPERV_ENFORCE_CPUID |
Date: |
Sun, 3 Oct 2021 09:42:38 +0200 |
From: Vitaly Kuznetsov <vkuznets@redhat.com>
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>
---
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 000638a2fd..072709a68f 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 598019de12..2a19eba56d 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -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),
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
index c990150373..8a7209bbf2 100644
--- a/target/i386/cpu.h
+++ b/target/i386/cpu.h
@@ -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;
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index d6a70c27e5..fbe6b7ac72 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
- [PULL 08/30] qtest/numa-test: Use detailed -smp CLIs in test_def_cpu_split, (continued)
- [PULL 08/30] qtest/numa-test: Use detailed -smp CLIs in test_def_cpu_split, Paolo Bonzini, 2021/10/03
- [PULL 07/30] qtest/numa-test: Use detailed -smp CLIs in pc_dynamic_cpu_cfg, Paolo Bonzini, 2021/10/03
- [PULL 11/30] machine: Tweak the order of topology members in struct CpuTopology, Paolo Bonzini, 2021/10/03
- [PULL 12/30] machine: Make smp_parse generic enough for all arches, Paolo Bonzini, 2021/10/03
- [PULL 10/30] machine: Use ms instead of global current_machine in sanity-check, Paolo Bonzini, 2021/10/03
- [PULL 13/30] machine: Remove smp_parse callback from MachineClass, Paolo Bonzini, 2021/10/03
- [PULL 14/30] machine: Move smp_prefer_sockets to struct SMPCompatProps, Paolo Bonzini, 2021/10/03
- [PULL 15/30] machine: Use g_autoptr in machine_set_smp, Paolo Bonzini, 2021/10/03
- [PULL 16/30] machine: Put all sanity-check in the generic SMP parser, Paolo Bonzini, 2021/10/03
- [PULL 17/30] i386: Support KVM_CAP_ENFORCE_PV_FEATURE_CPUID, Paolo Bonzini, 2021/10/03
- [PULL 18/30] i386: Support KVM_CAP_HYPERV_ENFORCE_CPUID,
Paolo Bonzini <=
- [PULL 22/30] i386: Change the default Hyper-V version to match WS2016, Paolo Bonzini, 2021/10/03
- [PULL 19/30] i386: Move HV_APIC_ACCESS_RECOMMENDED bit setting to hyperv_fill_cpuids(), Paolo Bonzini, 2021/10/03
- [PULL 21/30] i386: Make Hyper-V version id configurable, Paolo Bonzini, 2021/10/03
- [PULL 20/30] i386: Implement pseudo 'hv-avic' ('hv-apicv') enlightenment, Paolo Bonzini, 2021/10/03
- [PULL 23/30] configure: Loosen GCC requirement from 7.5.0 to 7.4.0, Paolo Bonzini, 2021/10/03
- [PULL 24/30] virtio-mem-pci: Fix memory leak when creating MEMORY_DEVICE_SIZE_CHANGE event, Paolo Bonzini, 2021/10/03
- [PULL 27/30] tpm: mark correct memory region range dirty when clearing RAM, Paolo Bonzini, 2021/10/03
- [PULL 26/30] monitor: Rate-limit MEMORY_DEVICE_SIZE_CHANGE qapi events per device, Paolo Bonzini, 2021/10/03
- [PULL 25/30] qapi: Include qom-path in MEMORY_DEVICE_SIZE_CHANGE qapi events, Paolo Bonzini, 2021/10/03
- [PULL 28/30] softmmu/memory_mapping: never merge ranges accross memory regions, Paolo Bonzini, 2021/10/03