All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Vitaly Kuznetsov <vkuznets@redhat.com>
Subject: [PULL 21/30] i386: Make Hyper-V version id configurable
Date: Sun,  3 Oct 2021 09:42:41 +0200	[thread overview]
Message-ID: <20211003074250.60869-22-pbonzini@redhat.com> (raw)
In-Reply-To: <20211003074250.60869-1-pbonzini@redhat.com>

From: Vitaly Kuznetsov <vkuznets@redhat.com>

Currently, we hardcode Hyper-V version id (CPUID 0x40000002) to
WS2008R2 and it is known that certain tools in Windows check this. It
seems useful to provide some flexibility by making it possible to change
this info at will. CPUID information is defined in TLFS as:

EAX: Build Number
EBX Bits 31-16: Major Version
    Bits 15-0: Minor Version
ECX Service Pack
EDX Bits 31-24: Service Branch
    Bits 23-0: Service Number

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Message-Id: <20210902093530.345756-8-vkuznets@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 docs/hyperv.txt       | 14 ++++++++++++++
 target/i386/cpu.c     | 15 +++++++++++----
 target/i386/cpu.h     |  7 ++++++-
 target/i386/kvm/kvm.c | 26 ++++++++++++++++----------
 4 files changed, 47 insertions(+), 15 deletions(-)

diff --git a/docs/hyperv.txt b/docs/hyperv.txt
index cd1ea3bbe9..7803495468 100644
--- a/docs/hyperv.txt
+++ b/docs/hyperv.txt
@@ -211,6 +211,20 @@ 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.
 
+3.20. hv-version-id-{build,major,minor,spack,sbranch,snumber}
+=============================================================
+This changes Hyper-V version identification in CPUID 0x40000002.EAX-EDX from the
+default (WS2008R2).
+- hv-version-id-build sets 'Build Number' (32 bits)
+- hv-version-id-major sets 'Major Version' (16 bits)
+- hv-version-id-minor sets 'Minor Version' (16 bits)
+- hv-version-id-spack sets 'Service Pack' (32 bits)
+- hv-version-id-sbranch sets 'Service Branch' (8 bits)
+- hv-version-id-snumber sets 'Service Number' (24 bits)
+
+Note: hv-version-id-* are not enlightenments and thus don't enable Hyper-V
+identification when specified without any other enlightenments.
+
 4. Supplementary features
 =========================
 
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 8154343cc4..d1d057fabe 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -6258,10 +6258,6 @@ static void x86_cpu_hyperv_realize(X86CPU *cpu)
     cpu->hyperv_interface_id[2] = 0;
     cpu->hyperv_interface_id[3] = 0;
 
-    /* Hypervisor system identity */
-    cpu->hyperv_version_id[0] = 0x00001bbc;
-    cpu->hyperv_version_id[1] = 0x00060001;
-
     /* Hypervisor implementation limits */
     cpu->hyperv_limits[0] = 64;
     cpu->hyperv_limits[1] = 0;
@@ -6840,6 +6836,17 @@ static Property x86_cpu_properties[] = {
     DEFINE_PROP_BOOL("hv-passthrough", X86CPU, hyperv_passthrough, false),
     DEFINE_PROP_BOOL("hv-enforce-cpuid", X86CPU, hyperv_enforce_cpuid, false),
 
+    /* WS2008R2 identify by default */
+    DEFINE_PROP_UINT32("hv-version-id-build", X86CPU, hyperv_ver_id_build,
+                       0x1bbc),
+    DEFINE_PROP_UINT16("hv-version-id-major", X86CPU, hyperv_ver_id_major,
+                       0x0006),
+    DEFINE_PROP_UINT16("hv-version-id-minor", X86CPU, hyperv_ver_id_minor,
+                       0x0001),
+    DEFINE_PROP_UINT32("hv-version-id-spack", X86CPU, hyperv_ver_id_sp, 0),
+    DEFINE_PROP_UINT8("hv-version-id-sbranch", X86CPU, hyperv_ver_id_sb, 0),
+    DEFINE_PROP_UINT32("hv-version-id-snumber", X86CPU, hyperv_ver_id_sn, 0),
+
     DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true),
     DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
     DEFINE_PROP_BOOL("x-force-features", X86CPU, force_features, false),
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
index 65f0ee2caf..3edaad7688 100644
--- a/target/i386/cpu.h
+++ b/target/i386/cpu.h
@@ -1717,10 +1717,15 @@ struct X86CPU {
     OnOffAuto hyperv_no_nonarch_cs;
     uint32_t hyperv_vendor_id[3];
     uint32_t hyperv_interface_id[4];
-    uint32_t hyperv_version_id[4];
     uint32_t hyperv_limits[3];
     uint32_t hyperv_nested[4];
     bool hyperv_enforce_cpuid;
+    uint32_t hyperv_ver_id_build;
+    uint16_t hyperv_ver_id_major;
+    uint16_t hyperv_ver_id_minor;
+    uint32_t hyperv_ver_id_sp;
+    uint8_t hyperv_ver_id_sb;
+    uint32_t hyperv_ver_id_sn;
 
     bool check_cpuid;
     bool enforce_cpuid;
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index 68faf72e34..f25837f63f 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -1258,14 +1258,18 @@ bool kvm_hyperv_expand_features(X86CPU *cpu, Error **errp)
         cpu->hyperv_interface_id[3] =
             hv_cpuid_get_host(cs, HV_CPUID_INTERFACE, R_EDX);
 
-        cpu->hyperv_version_id[0] =
+        cpu->hyperv_ver_id_build =
             hv_cpuid_get_host(cs, HV_CPUID_VERSION, R_EAX);
-        cpu->hyperv_version_id[1] =
-            hv_cpuid_get_host(cs, HV_CPUID_VERSION, R_EBX);
-        cpu->hyperv_version_id[2] =
+        cpu->hyperv_ver_id_major =
+            hv_cpuid_get_host(cs, HV_CPUID_VERSION, R_EBX) >> 16;
+        cpu->hyperv_ver_id_minor =
+            hv_cpuid_get_host(cs, HV_CPUID_VERSION, R_EBX) & 0xffff;
+        cpu->hyperv_ver_id_sp =
             hv_cpuid_get_host(cs, HV_CPUID_VERSION, R_ECX);
-        cpu->hyperv_version_id[3] =
-            hv_cpuid_get_host(cs, HV_CPUID_VERSION, R_EDX);
+        cpu->hyperv_ver_id_sb =
+            hv_cpuid_get_host(cs, HV_CPUID_VERSION, R_EDX) >> 24;
+        cpu->hyperv_ver_id_sn =
+            hv_cpuid_get_host(cs, HV_CPUID_VERSION, R_EDX) & 0xffffff;
 
         cpu->hv_max_vps = hv_cpuid_get_host(cs, HV_CPUID_IMPLEMENT_LIMITS,
                                             R_EAX);
@@ -1351,10 +1355,12 @@ static int hyperv_fill_cpuids(CPUState *cs,
 
     c = &cpuid_ent[cpuid_i++];
     c->function = HV_CPUID_VERSION;
-    c->eax = cpu->hyperv_version_id[0];
-    c->ebx = cpu->hyperv_version_id[1];
-    c->ecx = cpu->hyperv_version_id[2];
-    c->edx = cpu->hyperv_version_id[3];
+    c->eax = cpu->hyperv_ver_id_build;
+    c->ebx = (uint32_t)cpu->hyperv_ver_id_major << 16 |
+        cpu->hyperv_ver_id_minor;
+    c->ecx = cpu->hyperv_ver_id_sp;
+    c->edx = (uint32_t)cpu->hyperv_ver_id_sb << 24 |
+        (cpu->hyperv_ver_id_sn & 0xffffff);
 
     c = &cpuid_ent[cpuid_i++];
     c->function = HV_CPUID_FEATURES;
-- 
2.31.1




  parent reply	other threads:[~2021-10-03  8:09 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-03  7:42 [PULL 00/30] Misc changes for 2021-10-03 Paolo Bonzini
2021-10-03  7:42 ` [PULL 01/30] qapi/machine: Fix an incorrect comment of SMPConfiguration Paolo Bonzini
2021-10-03  7:42 ` [PULL 02/30] machine: Deprecate "parameter=0" SMP configurations Paolo Bonzini
2021-10-03  7:42 ` [PULL 03/30] machine: Minor refactor/fix for the smp parsers Paolo Bonzini
2021-10-03  7:42 ` [PULL 04/30] machine: Uniformly use maxcpus to calculate the omitted parameters Paolo Bonzini
2021-10-03  7:42 ` [PULL 05/30] machine: Set the value of cpus to match maxcpus if it's omitted Paolo Bonzini
2021-10-03  7:42 ` [PULL 06/30] machine: Improve the error reporting of smp parsing Paolo Bonzini
2021-10-03  7:42 ` [PULL 07/30] qtest/numa-test: Use detailed -smp CLIs in pc_dynamic_cpu_cfg Paolo Bonzini
2021-10-03  7:42 ` [PULL 08/30] qtest/numa-test: Use detailed -smp CLIs in test_def_cpu_split Paolo Bonzini
2021-10-03  7:42 ` [PULL 09/30] machine: Prefer cores over sockets in smp parsing since 6.2 Paolo Bonzini
2021-10-03  7:42 ` [PULL 10/30] machine: Use ms instead of global current_machine in sanity-check Paolo Bonzini
2021-10-03  7:42 ` [PULL 11/30] machine: Tweak the order of topology members in struct CpuTopology Paolo Bonzini
2021-10-03  7:42 ` [PULL 12/30] machine: Make smp_parse generic enough for all arches Paolo Bonzini
2021-10-03  7:42 ` [PULL 13/30] machine: Remove smp_parse callback from MachineClass Paolo Bonzini
2021-10-03  7:42 ` [PULL 14/30] machine: Move smp_prefer_sockets to struct SMPCompatProps Paolo Bonzini
2021-10-03  7:42 ` [PULL 15/30] machine: Use g_autoptr in machine_set_smp Paolo Bonzini
2021-10-03  7:42 ` [PULL 16/30] machine: Put all sanity-check in the generic SMP parser Paolo Bonzini
2021-10-03  7:42 ` [PULL 17/30] i386: Support KVM_CAP_ENFORCE_PV_FEATURE_CPUID Paolo Bonzini
2021-10-03  7:42 ` [PULL 18/30] i386: Support KVM_CAP_HYPERV_ENFORCE_CPUID Paolo Bonzini
2021-10-03  7:42 ` [PULL 19/30] i386: Move HV_APIC_ACCESS_RECOMMENDED bit setting to hyperv_fill_cpuids() Paolo Bonzini
2021-10-03  7:42 ` [PULL 20/30] i386: Implement pseudo 'hv-avic' ('hv-apicv') enlightenment Paolo Bonzini
2021-10-03  7:42 ` Paolo Bonzini [this message]
2021-10-03  7:42 ` [PULL 22/30] i386: Change the default Hyper-V version to match WS2016 Paolo Bonzini
2021-10-03  7:42 ` [PULL 23/30] configure: Loosen GCC requirement from 7.5.0 to 7.4.0 Paolo Bonzini
2021-10-03  7:42 ` [PULL 24/30] virtio-mem-pci: Fix memory leak when creating MEMORY_DEVICE_SIZE_CHANGE event Paolo Bonzini
2021-10-03  7:42 ` [PULL 25/30] qapi: Include qom-path in MEMORY_DEVICE_SIZE_CHANGE qapi events Paolo Bonzini
2021-10-03  7:42 ` [PULL 26/30] monitor: Rate-limit MEMORY_DEVICE_SIZE_CHANGE qapi events per device Paolo Bonzini
2021-10-03  7:42 ` [PULL 27/30] tpm: mark correct memory region range dirty when clearing RAM Paolo Bonzini
2021-10-03  7:42 ` [PULL 28/30] softmmu/memory_mapping: never merge ranges accross memory regions Paolo Bonzini
2021-10-03  7:42 ` [PULL 29/30] softmmu/memory_mapping: factor out adding physical memory ranges Paolo Bonzini
2021-10-03  7:42 ` [PULL 30/30] softmmu/memory_mapping: optimize for RamDiscardManager sections Paolo Bonzini
2021-10-03 14:44 ` [PULL 00/30] Misc changes for 2021-10-03 Philippe Mathieu-Daudé
2021-10-03 15:12 ` Richard Henderson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211003074250.60869-22-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=vkuznets@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.