diff options
-rw-r--r-- | include/hw/i386/pc.h | 5 | ||||
-rw-r--r-- | target/i386/cpu.c | 14 | ||||
-rw-r--r-- | target/i386/cpu.h | 2 | ||||
-rw-r--r-- | target/i386/kvm.c | 3 |
4 files changed, 23 insertions, 1 deletions
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index 8226904524..087d184ef5 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -371,6 +371,11 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *); #define PC_COMPAT_2_10 \ HW_COMPAT_2_10 \ + {\ + .driver = TYPE_X86_CPU,\ + .property = "x-hv-max-vps",\ + .value = "0x40",\ + }, #define PC_COMPAT_2_9 \ HW_COMPAT_2_9 \ diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 7644f6dc2c..40c3091edf 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -4145,6 +4145,20 @@ static Property x86_cpu_properties[] = { false), DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true), DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true), + + /* + * From "Requirements for Implementing the Microsoft + * Hypervisor Interface": + * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs + * + * "Starting with Windows Server 2012 and Windows 8, if + * CPUID.40000005.EAX contains a value of -1, Windows assumes that + * the hypervisor imposes no specific limit to the number of VPs. + * In this case, Windows Server 2012 guest VMs may use more than + * 64 VPs, up to the maximum supported number of processors applicable + * to the specific Windows version being used." + */ + DEFINE_PROP_INT32("x-hv-max-vps", X86CPU, hv_max_vps, -1), DEFINE_PROP_END_OF_LIST() }; diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 525d35d836..5c726f3e4b 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1282,6 +1282,8 @@ struct X86CPU { int32_t socket_id; int32_t core_id; int32_t thread_id; + + int32_t hv_max_vps; }; static inline X86CPU *x86_env_get_cpu(CPUX86State *env) diff --git a/target/i386/kvm.c b/target/i386/kvm.c index 739334a5a6..ee4e91fa64 100644 --- a/target/i386/kvm.c +++ b/target/i386/kvm.c @@ -786,7 +786,8 @@ int kvm_arch_init_vcpu(CPUState *cs) c = &cpuid_data.entries[cpuid_i++]; c->function = HYPERV_CPUID_IMPLEMENT_LIMITS; - c->eax = 0x40; + + c->eax = cpu->hv_max_vps; c->ebx = 0x40; kvm_base = KVM_CPUID_SIGNATURE_NEXT; |